Class WalkPushConnection
- All Implemented Interfaces:
AutoCloseable,Connection,PushConnection
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.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescription(package private) final WalkRemoteObjectDatabaseDatabase connection to the remote repository.private final RepositoryThe repository this transport pushes out of.Complete listing of refs the remote will have after our push.private Collection<RemoteRefUpdate>Updates which require altering the packed-refs file to complete.private LinkedHashMap<String,String> Packs already known to reside in the remote repository.private final TransportThe configured transport we were constructed by.private final URIishLocation of the remote repository we are writing to. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()private voidcreateNewRepository(List<RemoteRefUpdate> updates) private voidprivate booleanprivate static StringpickHEAD(List<RemoteRefUpdate> updates) voidpush(ProgressMonitor monitor, Map<String, RemoteRefUpdate> refUpdates) Pushes to the remote repository basing on provided specification.voidpush(ProgressMonitor monitor, Map<String, RemoteRefUpdate> refUpdates, OutputStream out) Pushes to the remote repository basing on provided specification.private voidsafeDelete(File path) private voidsendpack(List<RemoteRefUpdate> updates, ProgressMonitor monitor) private voidMethods inherited from class org.eclipse.jgit.transport.BaseConnection
available, getMessages, getMessageWriter, getPeerUserAgent, getRef, getRefs, getRefsMap, markStartedOperation, setMessageWriter, setPeerUserAgentMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.eclipse.jgit.transport.Connection
getMessages, getPeerUserAgent, getRef, getRefs, getRefsMap
-
Field Details
-
local
The repository this transport pushes out of. -
uri
Location of the remote repository we are writing to. -
dest
Database connection to the remote repository. -
transport
The configured transport we were constructed by. -
packNames
Packs already known to reside in the remote repository.This is a LinkedHashMap to maintain the original order.
-
newRefs
Complete listing of refs the remote will have after our push. -
packedRefUpdates
Updates which require altering the packed-refs file to complete.If this collection is non-empty then any refs listed in
newRefswith a storage class ofRef.Storage.PACKEDwill be written.
-
-
Constructor Details
-
WalkPushConnection
WalkPushConnection(WalkTransport walkTransport, WalkRemoteObjectDatabase w)
-
-
Method Details
-
push
public void push(ProgressMonitor monitor, Map<String, RemoteRefUpdate> refUpdates) throws TransportExceptionPushes 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
TransportException.Implementation may use local repository to send a minimum set of objects needed by remote repository in efficient way.
Transport.isPushThin()should be honored if applicable. refUpdates should be filled with information about status of each update.- Specified by:
pushin interfacePushConnection- Parameters:
monitor- 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.refUpdates- 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 withRemoteRefUpdate.Status.NOT_ATTEMPTEDshould passed. Implementation must ensure that and appropriate status with optional message should be set during call. No refUpdate withRemoteRefUpdate.Status.AWAITING_REPORTorRemoteRefUpdate.Status.NOT_ATTEMPTEDcan be leaved by implementation after return from this call.- Throws:
TransportException- objects could not be copied due to a network failure, critical protocol error, or error on remote side, or connection was already used for push - new connection must be created. Non-critical errors concerning only isolated refs should be placed in refUpdates.
-
push
public void push(ProgressMonitor monitor, Map<String, RemoteRefUpdate> refUpdates, OutputStream out) throws TransportExceptionPushes 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
TransportException.Implementation may use local repository to send a minimum set of objects needed by remote repository in efficient way.
Transport.isPushThin()should be honored if applicable. refUpdates should be filled with information about status of each update.- Specified by:
pushin interfacePushConnection- Parameters:
monitor- 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.refUpdates- 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 withRemoteRefUpdate.Status.NOT_ATTEMPTEDshould passed. Implementation must ensure that and appropriate status with optional message should be set during call. No refUpdate withRemoteRefUpdate.Status.AWAITING_REPORTorRemoteRefUpdate.Status.NOT_ATTEMPTEDcan be leaved by implementation after return from this call.out- output stream to write sideband messages to- Throws:
TransportException- objects could not be copied due to a network failure, critical protocol error, or error on remote side, or connection was already used for push - new connection must be created. Non-critical errors concerning only isolated refs should be placed in refUpdates.
-
close
public void close()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
Connection.getMessages().AutoClosable.close()declares that it throwsException. Implementers shouldn't throw checked exceptions. This override narrows the signature to prevent them from doing so.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceConnection- Specified by:
closein classBaseConnection
-
sendpack
private void sendpack(List<RemoteRefUpdate> updates, ProgressMonitor monitor) throws TransportException - Throws:
TransportException
-
safeDelete
-
deleteCommand
-
updateCommand
-
isNewRepository
private boolean isNewRepository() -
createNewRepository
- Throws:
TransportException
-
pickHEAD
-