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:
parent
adc73c4ba1
commit
a5dee1c125
|
@ -13,6 +13,7 @@
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import org.eclipse.jgit.errors.TransportException;
|
import org.eclipse.jgit.errors.TransportException;
|
||||||
import org.eclipse.jgit.internal.storage.dfs.DfsGarbageCollector;
|
import org.eclipse.jgit.internal.storage.dfs.DfsGarbageCollector;
|
||||||
|
@ -750,6 +751,36 @@ public void testV2FetchClientStopsNegotiation() throws Exception {
|
||||||
assertTrue(client.hasObject(barChild.toObjectId()));
|
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 {
|
private static class RejectAllRefFilter implements RefFilter {
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Ref> filter(Map<String, Ref> refs) {
|
public Map<String, Ref> filter(Map<String, Ref> refs) {
|
||||||
|
|
|
@ -954,6 +954,8 @@ private void fetchV2() throws IOException {
|
||||||
peerHas.add(ObjectId.fromString(line.substring(5)));
|
peerHas.add(ObjectId.fromString(line.substring(5)));
|
||||||
} else if (line.equals("done")) {
|
} else if (line.equals("done")) {
|
||||||
doneReceived = true;
|
doneReceived = true;
|
||||||
|
} else if (line.equals(OPTION_THIN_PACK)) {
|
||||||
|
options.add(OPTION_THIN_PACK);
|
||||||
}
|
}
|
||||||
// else ignore it
|
// else ignore it
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue