diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java index d87395c1c..4ba446edb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java @@ -96,6 +96,19 @@ public class ReceivePack { /** Revision traversal support over {@link #db}. */ private final RevWalk walk; + /** + * Is the client connection a bi-directional socket or pipe? + *

+ * If true, this class assumes it can perform multiple read and write cycles + * with the client over the input and output streams. This matches the + * functionality available with a standard TCP/IP connection, or a local + * operating system or in-memory pipe. + *

+ * If false, this class runs in a read everything then output results mode, + * making it suitable for single round-trip systems RPCs such as HTTP. + */ + private boolean biDirectionalPipe = true; + /** Should an incoming transfer validate objects? */ private boolean checkReceivedObjects; @@ -219,6 +232,27 @@ public final Map getAdvertisedRefs() { return refs; } + /** + * @return true if this class expects a bi-directional pipe opened between + * the client and itself. The default is true. + */ + public boolean isBiDirectionalPipe() { + return biDirectionalPipe; + } + + /** + * @param twoWay + * if true, this class will assume the socket is a fully + * bidirectional pipe between the two peers and takes advantage + * of that by first transmitting the known refs, then waiting to + * read commands. If false, this class assumes it must read the + * commands before writing output and does not perform the + * initial advertising. + */ + public void setBiDirectionalPipe(final boolean twoWay) { + biDirectionalPipe = twoWay; + } + /** * @return true if this instance will verify received objects are formatted * correctly. Validating objects requires more CPU time on this side @@ -484,7 +518,10 @@ public void println() { } private void service() throws IOException { - sendAdvertisedRefs(); + if (biDirectionalPipe) + sendAdvertisedRefs(); + else + refs = db.getAllRefs(); recvCommands(); if (!commands.isEmpty()) { enableCapabilities(); @@ -587,7 +624,11 @@ private void recvCommands() throws IOException { final ObjectId newId = ObjectId.fromString(line.substring(41, 81)); final String name = line.substring(82); final ReceiveCommand cmd = new ReceiveCommand(oldId, newId, name); - cmd.setRef(refs.get(cmd.getRefName())); + if (name.equals(Constants.HEAD)) { + cmd.setResult(Result.REJECTED_CURRENT_BRANCH); + } else { + cmd.setRef(refs.get(cmd.getRefName())); + } commands.add(cmd); } }