Browse Source

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
stable-3.5
Shawn Pearce 10 years ago
parent
commit
199dd4a9a9
  1. 23
      org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java

23
org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java

@ -222,7 +222,7 @@ public abstract class BaseReceivePack {
/** Capabilities requested by the client. */ /** Capabilities requested by the client. */
private Set<String> enabledCapabilities; private Set<String> enabledCapabilities;
private Set<ObjectId> clientShallowCommits;
private List<ReceiveCommand> commands; private List<ReceiveCommand> commands;
private StringBuilder advertiseError; private StringBuilder advertiseError;
@ -263,6 +263,7 @@ public abstract class BaseReceivePack {
advertiseRefsHook = AdvertiseRefsHook.DEFAULT; advertiseRefsHook = AdvertiseRefsHook.DEFAULT;
refFilter = RefFilter.DEFAULT; refFilter = RefFilter.DEFAULT;
advertisedHaves = new HashSet<ObjectId>(); advertisedHaves = new HashSet<ObjectId>();
clientShallowCommits = new HashSet<ObjectId>();
} }
/** Configuration for receive operations. */ /** Configuration for receive operations. */
@ -770,6 +771,18 @@ public abstract class BaseReceivePack {
throw new IllegalStateException(JGitText.get().packSizeNotSetYet); 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<ObjectId> getClientShallowCommits() {
return clientShallowCommits;
}
/** @return true if any commands to be executed have been read. */ /** @return true if any commands to be executed have been read. */
protected boolean hasCommands() { protected boolean hasCommands() {
return !commands.isEmpty(); return !commands.isEmpty();
@ -923,6 +936,11 @@ public abstract class BaseReceivePack {
if (line == PacketLineIn.END) if (line == PacketLineIn.END)
break; break;
if (line.length() >= 48 && line.startsWith("shallow ")) { //$NON-NLS-1$
clientShallowCommits.add(ObjectId.fromString(line.substring(8, 48)));
continue;
}
if (commands.isEmpty()) { if (commands.isEmpty()) {
final FirstLine firstLine = new FirstLine(line); final FirstLine firstLine = new FirstLine(line);
enabledCapabilities = firstLine.getCapabilities(); enabledCapabilities = firstLine.getCapabilities();
@ -1030,7 +1048,8 @@ public abstract class BaseReceivePack {
private boolean needCheckConnectivity() { private boolean needCheckConnectivity() {
return isCheckReceivedObjects() return isCheckReceivedObjects()
|| isCheckReferencedObjectsAreReachable(); || isCheckReferencedObjectsAreReachable()
|| !getClientShallowCommits().isEmpty();
} }
private void checkConnectivity() throws IOException { private void checkConnectivity() throws IOException {

Loading…
Cancel
Save