From 199dd4a9a938e5c6ee7a06d0e0610e47b47ff050 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 27 Aug 2014 10:41:59 -0700 Subject: [PATCH] ReceivePack: Accept shallow lines from Git >= 1.9 In Git 1.9 (5dbd767601 "support pushing from a shallow clone") the git-core project intentionally broke the existing send-pack protocol from shallow clients. Shallow clients now transmit their shallow information during push, ahead of the old-new command sequence. JGit must accept these lines when presented. To protect the server against clients sending partial history, require the connectivity check when pushed to by a shallow client. Change-Id: I46639366b0900052c376091e1688f07def44ab79 --- .../jgit/transport/BaseReceivePack.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java index 9d39f436c..72c169759 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java @@ -222,7 +222,7 @@ public abstract class BaseReceivePack { /** Capabilities requested by the client. */ private Set enabledCapabilities; - + private Set clientShallowCommits; private List commands; private StringBuilder advertiseError; @@ -263,6 +263,7 @@ public abstract class BaseReceivePack { advertiseRefsHook = AdvertiseRefsHook.DEFAULT; refFilter = RefFilter.DEFAULT; advertisedHaves = new HashSet(); + clientShallowCommits = new HashSet(); } /** Configuration for receive operations. */ @@ -770,6 +771,18 @@ public abstract class BaseReceivePack { throw new IllegalStateException(JGitText.get().packSizeNotSetYet); } + /** + * Get the commits from the client's shallow file. + * + * @return if the client is a shallow repository, the list of edge commits + * that define the client's shallow boundary. Empty set if the client + * is earlier than Git 1.9, or is a full clone. + * @since 3.5 + */ + protected Set getClientShallowCommits() { + return clientShallowCommits; + } + /** @return true if any commands to be executed have been read. */ protected boolean hasCommands() { return !commands.isEmpty(); @@ -923,6 +936,11 @@ public abstract class BaseReceivePack { if (line == PacketLineIn.END) break; + if (line.length() >= 48 && line.startsWith("shallow ")) { //$NON-NLS-1$ + clientShallowCommits.add(ObjectId.fromString(line.substring(8, 48))); + continue; + } + if (commands.isEmpty()) { final FirstLine firstLine = new FirstLine(line); enabledCapabilities = firstLine.getCapabilities(); @@ -1030,7 +1048,8 @@ public abstract class BaseReceivePack { private boolean needCheckConnectivity() { return isCheckReceivedObjects() - || isCheckReferencedObjectsAreReachable(); + || isCheckReferencedObjectsAreReachable() + || !getClientShallowCommits().isEmpty(); } private void checkConnectivity() throws IOException {