1 /* 2 * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com> 3 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others 4 * 5 * This program and the accompanying materials are made available under the 6 * terms of the Eclipse Distribution License v. 1.0 which is available at 7 * https://www.eclipse.org/org/documents/edl-v10.php. 8 * 9 * SPDX-License-Identifier: BSD-3-Clause 10 */ 11 12 package org.eclipse.jgit.transport; 13 14 import java.io.OutputStream; 15 import java.util.Map; 16 17 import org.eclipse.jgit.errors.TransportException; 18 import org.eclipse.jgit.lib.ProgressMonitor; 19 20 /** 21 * Lists known refs from the remote and sends objects to the remote. 22 * <p> 23 * A push connection typically connects to the <code>git-receive-pack</code> 24 * service running where the remote repository is stored. This provides a 25 * one-way object transfer service to copy objects from the local repository 26 * into the remote repository, as well as a way to modify the refs stored by the 27 * remote repository. 28 * <p> 29 * Instances of a PushConnection must be created by a 30 * {@link org.eclipse.jgit.transport.Transport} that implements a specific 31 * object transfer protocol that both sides of the connection understand. 32 * <p> 33 * PushConnection instances are not thread safe and may be accessed by only one 34 * thread at a time. 35 * 36 * @see Transport 37 */ 38 public interface PushConnection extends Connection { 39 40 /** 41 * Pushes to the remote repository basing on provided specification. This 42 * possibly result in update/creation/deletion of refs on remote repository 43 * and sending objects that remote repository need to have a consistent 44 * objects graph from new refs. 45 * <p> 46 * <p> 47 * Only one call per connection is allowed. Subsequent calls will result in 48 * {@link org.eclipse.jgit.errors.TransportException}. 49 * </p> 50 * <p> 51 * Implementation may use local repository to send a minimum set of objects 52 * needed by remote repository in efficient way. 53 * {@link org.eclipse.jgit.transport.Transport#isPushThin()} should be 54 * honored if applicable. refUpdates should be filled with information about 55 * status of each update. 56 * </p> 57 * 58 * @param monitor 59 * progress monitor to update the end-user about the amount of 60 * work completed, or to indicate cancellation. Implementors 61 * should poll the monitor at regular intervals to look for 62 * cancellation requests from the user. 63 * @param refUpdates 64 * map of remote refnames to remote refs update 65 * specifications/statuses. Can't be empty. This indicate what 66 * refs caller want to update on remote side. Only refs updates 67 * with 68 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED} 69 * should passed. Implementation must ensure that and appropriate 70 * status with optional message should be set during call. No 71 * refUpdate with 72 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#AWAITING_REPORT} 73 * or 74 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED} 75 * can be leaved by implementation after return from this call. 76 * @throws org.eclipse.jgit.errors.TransportException 77 * objects could not be copied due to a network failure, 78 * critical protocol error, or error on remote side, or 79 * connection was already used for push - new connection must be 80 * created. Non-critical errors concerning only isolated refs 81 * should be placed in refUpdates. 82 */ 83 void push(final ProgressMonitor monitor, 84 final Map<String, RemoteRefUpdate> refUpdates) 85 throws TransportException; 86 87 /** 88 * Pushes to the remote repository basing on provided specification. This 89 * possibly result in update/creation/deletion of refs on remote repository 90 * and sending objects that remote repository need to have a consistent 91 * objects graph from new refs. 92 * <p> 93 * <p> 94 * Only one call per connection is allowed. Subsequent calls will result in 95 * {@link org.eclipse.jgit.errors.TransportException}. 96 * </p> 97 * <p> 98 * Implementation may use local repository to send a minimum set of objects 99 * needed by remote repository in efficient way. 100 * {@link org.eclipse.jgit.transport.Transport#isPushThin()} should be 101 * honored if applicable. refUpdates should be filled with information about 102 * status of each update. 103 * </p> 104 * 105 * @param monitor 106 * progress monitor to update the end-user about the amount of 107 * work completed, or to indicate cancellation. Implementors 108 * should poll the monitor at regular intervals to look for 109 * cancellation requests from the user. 110 * @param refUpdates 111 * map of remote refnames to remote refs update 112 * specifications/statuses. Can't be empty. This indicate what 113 * refs caller want to update on remote side. Only refs updates 114 * with 115 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED} 116 * should passed. Implementation must ensure that and appropriate 117 * status with optional message should be set during call. No 118 * refUpdate with 119 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#AWAITING_REPORT} 120 * or 121 * {@link org.eclipse.jgit.transport.RemoteRefUpdate.Status#NOT_ATTEMPTED} 122 * can be leaved by implementation after return from this call. 123 * @param out 124 * output stream to write sideband messages to 125 * @throws org.eclipse.jgit.errors.TransportException 126 * objects could not be copied due to a network failure, 127 * critical protocol error, or error on remote side, or 128 * connection was already used for push - new connection must be 129 * created. Non-critical errors concerning only isolated refs 130 * should be placed in refUpdates. 131 * @since 3.0 132 */ 133 void push(final ProgressMonitor monitor, 134 final Map<String, RemoteRefUpdate> refUpdates, OutputStream out) 135 throws TransportException; 136 137 }