Teach UploadPack "thin-pack" in "fetch"

Add support for the "thin-pack" parameter in the "fetch" command in
the fetch-pack/upload-pack protocol v2.

Change-Id: I39a37b2b66a16929137d35c718a3acf2afb6b0b5
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
This commit is contained in:
Jonathan Tan 2018-03-01 14:24:16 -08:00 committed by Jonathan Nieder
parent adc73c4ba1
commit a5dee1c125
2 changed files with 33 additions and 0 deletions

View File

@ -13,6 +13,7 @@
import java.util.Map;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import org.eclipse.jgit.errors.TransportException;
import org.eclipse.jgit.internal.storage.dfs.DfsGarbageCollector;
@ -750,6 +751,36 @@ public void testV2FetchClientStopsNegotiation() throws Exception {
assertTrue(client.hasObject(barChild.toObjectId()));
}
@Test
public void testV2FetchThinPack() throws Exception {
String commonInBlob = "abcdefghijklmnopqrstuvwxyz";
RevBlob parentBlob = remote.blob(commonInBlob + "a");
RevCommit parent = remote.commit(remote.tree(remote.file("foo", parentBlob)));
RevBlob childBlob = remote.blob(commonInBlob + "b");
RevCommit child = remote.commit(remote.tree(remote.file("foo", childBlob)), parent);
remote.update("branch1", child);
// Pretend that we have parent to get a thin pack based on it.
ByteArrayInputStream recvStream = uploadPackV2(
"command=fetch\n",
PacketLineIn.DELIM,
"want " + child.toObjectId().getName() + "\n",
"have " + parent.toObjectId().getName() + "\n",
"thin-pack\n",
"done\n",
PacketLineIn.END);
PacketLineIn pckIn = new PacketLineIn(recvStream);
assertThat(pckIn.readString(), is("packfile"));
// Verify that we received a thin pack by trying to apply it
// against the client repo, which does not have parent.
thrown.expect(IOException.class);
thrown.expectMessage("pack has unresolved deltas");
parsePack(recvStream);
}
private static class RejectAllRefFilter implements RefFilter {
@Override
public Map<String, Ref> filter(Map<String, Ref> refs) {

View File

@ -954,6 +954,8 @@ private void fetchV2() throws IOException {
peerHas.add(ObjectId.fromString(line.substring(5)));
} else if (line.equals("done")) {
doneReceived = true;
} else if (line.equals(OPTION_THIN_PACK)) {
options.add(OPTION_THIN_PACK);
}
// else ignore it
}