Since there are no Git-specific smarts on the remote side of the connection the client side must handle everything on its own. The generic push support requires being able to delete, create and overwrite files on the remote side, as well as create any missing directories (if necessary). Typically this can be handled through an FTP style protocol.
Objects not on the remote side are uploaded as pack files, using one pack file per invocation. This simplifies the implementation as only two data files need to be written to the remote repository.
Push support supplied by this class is not multiuser safe. Concurrent pushes to the same repository may yield an inconsistent reference database which may confuse fetch clients.
A single push is concurrently safe with multiple fetch requests, due to the careful order of operations used to update the repository. Clients fetching may receive transient failures due to short reads on certain files if the protocol does not support atomic file replacement.
WalkRemoteObjectDatabase
| Modifier and Type | Field and Description |
|---|---|
| pack-priv final WalkRemoteObjectDatabase | dest
Database connection to the remote repository. |
| private final Repository | local
The repository this transport pushes out of. |
| private Map | newRefs
Complete listing of refs the remote will have after our push. |
| private Collection | packedRefUpdates
Updates which require altering the packed-refs file to complete. |
| private LinkedHashMap | packNames
Packs already known to reside in the remote repository. |
| private final Transport | transport
The configured transport we were constructed by. |
| private final URIish | uri
Location of the remote repository we are writing to. |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| public void | close()
Implements abstract org. Implements org. Closes this resource, relinquishing any underlying resources. |
| private void | |
| private void | |
| private boolean | |
| private static String | |
| public void | push(final ProgressMonitor
progress monitor to update the end-user about the amount of
work completed, or to indicate cancellation. Implementors
should poll the monitor at regular intervals to look for
cancellation requests from the user. monitor, final Map<String, RemoteRefUpdate> map of remote refnames to remote refs update
specifications/statuses. Can't be empty. This indicate what
refs caller want to update on remote side. Only refs updates
with
refUpdates)org.
should passed. Implementation must ensure that and appropriate
status with optional message should be set during call. No
refUpdate with
org.
or
org.
can be leaved by implementation after return from this call.Implements org. Pushes to the remote repository basing on provided specification. |
| public void | push(final ProgressMonitor
progress monitor to update the end-user about the amount of
work completed, or to indicate cancellation. Implementors
should poll the monitor at regular intervals to look for
cancellation requests from the user. monitor, final Map<String, RemoteRefUpdate> map of remote refnames to remote refs update
specifications/statuses. Can't be empty. This indicate what
refs caller want to update on remote side. Only refs updates
with
refUpdates, OutputStream org.
should passed. Implementation must ensure that and appropriate
status with optional message should be set during call. No
refUpdate with
org.
or
org.
can be leaved by implementation after return from this call.output stream to write sideband messages to out)Implements org. Pushes to the remote repository basing on provided specification. |
| private void | |
| private static String | |
| private void | |
| private void |
| dest | back to summary |
|---|---|
| pack-priv final WalkRemoteObjectDatabase dest Database connection to the remote repository. | |
| local | back to summary |
|---|---|
| private final Repository local The repository this transport pushes out of. | |
| newRefs | back to summary |
|---|---|
| private Map<String, Ref> newRefs Complete listing of refs the remote will have after our push. | |
| packedRefUpdates | back to summary |
|---|---|
| private Collection<RemoteRefUpdate> packedRefUpdates Updates which require altering the packed-refs file to complete.
If this collection is non-empty then any refs listed in | |
| packNames | back to summary |
|---|---|
| private LinkedHashMap<String, String> packNames Packs already known to reside in the remote repository. This is a LinkedHashMap to maintain the original order. | |
| transport | back to summary |
|---|---|
| private final Transport transport The configured transport we were constructed by. | |
| uri | back to summary |
|---|---|
| private final URIish uri Location of the remote repository we are writing to. | |
| WalkPushConnection | back to summary |
|---|---|
| pack-priv WalkPushConnection(final WalkTransport walkTransport, final WalkRemoteObjectDatabase w) | |
| close | back to summary |
|---|---|
| public void close() Implements abstract org. Implements org. Doc from org. Closes this resource, relinquishing any underlying resources.
This method is invoked automatically on objects managed by the
Close any resources used by this connection. If the remote repository is contacted by a network socket this method must close that network socket, disconnecting the two peers. If the remote repository is actually local (same system) this method must close any open file handles used to read the "remote" repository.
If additional messages were produced by the remote peer, these should
still be retained in the connection instance for
| |
| createNewRepository | back to summary |
|---|---|
| private void createNewRepository(List<RemoteRefUpdate> updates) throws TransportException | |
| deleteCommand | back to summary |
|---|---|
| private void deleteCommand(RemoteRefUpdate u) | |
| isNewRepository | back to summary |
|---|---|
| private boolean isNewRepository() | |
| pickHEAD | back to summary |
|---|---|
| private static String pickHEAD(List<RemoteRefUpdate> updates) | |
| push | back to summary |
|---|---|
| public void push(final ProgressMonitor monitor, final Map<String, RemoteRefUpdate> refUpdates) throws TransportException Implements org. Doc from org. Pushes to the remote repository basing on provided specification. This possibly result in update/creation/deletion of refs on remote repository and sending objects that remote repository need to have a consistent objects graph from new refs.
Only one call per connection is allowed. Subsequent calls will result in
Implementation may use local repository to send a minimum set of objects
needed by remote repository in efficient way.
| |
| push | back to summary |
|---|---|
| public void push(final ProgressMonitor monitor, final Map<String, RemoteRefUpdate> refUpdates, OutputStream out) throws TransportException Implements org. Doc from org. Pushes to the remote repository basing on provided specification. This possibly result in update/creation/deletion of refs on remote repository and sending objects that remote repository need to have a consistent objects graph from new refs.
Only one call per connection is allowed. Subsequent calls will result in
Implementation may use local repository to send a minimum set of objects
needed by remote repository in efficient way.
| |
| safeDelete | back to summary |
|---|---|
| private void safeDelete(File path) | |
| sanitizedPath | back to summary |
|---|---|
| private static String sanitizedPath(File file) | |
| sendpack | back to summary |
|---|---|
| private void sendpack(final List<RemoteRefUpdate> updates, final ProgressMonitor monitor) throws TransportException | |
| updateCommand | back to summary |
|---|---|
| private void updateCommand(RemoteRefUpdate u) | |