Browse Source

Teach UploadPack "ofs-delta" in "fetch"

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

Change-Id: I728cf986082fce4ddeb6a6435897692e15e60cc7
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
tags/v5.0.0.201805221745-rc1
Jonathan Tan 6 years ago
parent
commit
526f5cf984

+ 44
- 5
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java View File

@@ -518,15 +518,18 @@ public class UploadPackTest {
* Parse multiplexed packfile output from upload-pack using protocol V2
* into the client repository.
*/
private void parsePack(ByteArrayInputStream recvStream) throws Exception {
parsePack(recvStream, NullProgressMonitor.INSTANCE);
private ReceivedPackStatistics parsePack(ByteArrayInputStream recvStream) throws Exception {
return parsePack(recvStream, NullProgressMonitor.INSTANCE);
}

private void parsePack(ByteArrayInputStream recvStream, ProgressMonitor pm)
private ReceivedPackStatistics parsePack(ByteArrayInputStream recvStream, ProgressMonitor pm)
throws Exception {
SideBandInputStream sb = new SideBandInputStream(
recvStream, pm, new StringWriter(), NullOutputStream.INSTANCE);
client.newObjectInserter().newPackParser(sb).parse(NullProgressMonitor.INSTANCE);
recvStream, pm,
new StringWriter(), NullOutputStream.INSTANCE);
PackParser pp = client.newObjectInserter().newPackParser(sb);
pp.parse(NullProgressMonitor.INSTANCE);
return pp.getReceivedPackStatistics();
}

@Test
@@ -838,6 +841,42 @@ public class UploadPackTest {
assertTrue(client.hasObject(tag.toObjectId()));
}

@Test
public void testV2FetchOfsDelta() 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);

// Without ofs-delta.
ByteArrayInputStream recvStream = uploadPackV2(
"command=fetch\n",
PacketLineIn.DELIM,
"want " + child.toObjectId().getName() + "\n",
"done\n",
PacketLineIn.END);
PacketLineIn pckIn = new PacketLineIn(recvStream);
assertThat(pckIn.readString(), is("packfile"));
ReceivedPackStatistics stats = parsePack(recvStream);
assertTrue(stats.getNumOfsDelta() == 0);

// With ofs-delta.
recvStream = uploadPackV2(
"command=fetch\n",
PacketLineIn.DELIM,
"want " + child.toObjectId().getName() + "\n",
"ofs-delta\n",
"done\n",
PacketLineIn.END);
pckIn = new PacketLineIn(recvStream);
assertThat(pckIn.readString(), is("packfile"));
stats = parsePack(recvStream);
assertTrue(stats.getNumOfsDelta() != 0);
}

private static class RejectAllRefFilter implements RefFilter {
@Override
public Map<String, Ref> filter(Map<String, Ref> refs) {

+ 2
- 0
org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java View File

@@ -967,6 +967,8 @@ public class UploadPack {
} else if (line.equals(OPTION_INCLUDE_TAG)) {
options.add(OPTION_INCLUDE_TAG);
includeTag = true;
} else if (line.equals(OPTION_OFS_DELTA)) {
options.add(OPTION_OFS_DELTA);
}
// else ignore it
}

Loading…
Cancel
Save