]> source.dussan.org Git - jgit.git/commitdiff
Teach UploadPack "ofs-delta" in "fetch" 53/119453/14
authorJonathan Tan <jonathantanmy@google.com>
Tue, 13 Mar 2018 20:29:46 +0000 (13:29 -0700)
committerJonathan Nieder <jrn@google.com>
Thu, 17 May 2018 00:54:03 +0000 (20:54 -0400)
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>
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java

index 5ae93fc12dbcbb05b38ad153b495a10ddc5bdfc9..133ecd01eb2e3c93f4dd9df591e6ddbda117e56a 100644 (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) {
index 199a007abe90d7c0ee0443fd297104a7b7cfa3d2..a1c222b19c427b2e8eb249f522fa8954e5835b73 100644 (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
                }