pack-refs: Add sorted flag packed-refs are already sorted but jgit isn't adding the headers, so cgit performs extra work. Add coverage to verify header contents and refs order. Change-Id: I5ee0781a435295d3d6db3ecafc3177c15d90f5d4
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryTest.java index baa0182..6552bac 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefDirectoryTest.java
@@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import org.eclipse.jgit.api.PackRefsCommand; import org.eclipse.jgit.errors.LockFailedException; import org.eclipse.jgit.events.ListenerHandle; import org.eclipse.jgit.events.RefsChangedEvent; @@ -44,6 +45,7 @@ import org.eclipse.jgit.junit.Repeat; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Ref.Storage; import org.eclipse.jgit.lib.RefDatabase; @@ -1062,6 +1064,60 @@ public void test_repack() throws Exception { } @Test + public void testPackedRefsHeaderWithSorted() throws Exception { + writeLooseRef("refs/heads/master", A); + writeLooseRef("refs/heads/other", B); + writeLooseRef("refs/tags/v1.0", v1_0); + + PackRefsCommand packRefsCommand = new PackRefsCommand(diskRepo); + packRefsCommand.setAll(true); + packRefsCommand.call(); + + File packedRefsFile = new File(diskRepo.getCommonDirectory(), Constants.PACKED_REFS); + assertTrue("packed-refs should exist", packedRefsFile.exists()); + + String content = read(packedRefsFile); + String firstLine = content.split("\n")[0]; + assertTrue("packed-refs should have header with sorted", + firstLine.contains(" sorted")); + + int masterIndex = content.indexOf(A.name() + " refs/heads/master"); + int otherIndex = content.indexOf(B.name() + " refs/heads/other"); + int tagIndex = content.indexOf(v1_0.name() + " refs/tags/v1.0"); + assertTrue("packed-refs should be sorted", + masterIndex < otherIndex && otherIndex < tagIndex); + } + + @Test + public void testPackedRefsUnsortedGetsSorted() throws Exception { + writePackedRefs("# pack-refs with: peeled \n" + // + B.name() + " refs/heads/other\n" + // + v1_0.name() + " refs/tags/v1.0\n" + // + "^" + v1_0.getObject().name() + "\n" + // + A.name() + " refs/heads/master\n"); + + // extra loose-ref to trigger packing + writeLooseRef("refs/heads/loose", A); + + PackRefsCommand packRefsCommand = new PackRefsCommand(diskRepo); + packRefsCommand.setAll(true); + packRefsCommand.call(); + + File packedRefsFile = new File(diskRepo.getCommonDirectory(), Constants.PACKED_REFS); + String content = read(packedRefsFile); + int looseIndex = content.indexOf(v1_0.name() + " refs/tags/loose"); + int masterIndex = content.indexOf(A.name() + " refs/heads/master"); + int otherIndex = content.indexOf(B.name() + " refs/heads/other"); + int tagIndex = content.indexOf(v1_0.name() + " refs/tags/v1.0"); + assertTrue( + "packed-refs should be sorted", + looseIndex < masterIndex && + masterIndex < otherIndex && + otherIndex < tagIndex + ); + } + + @Test public void testFindRef_EmptyDatabase() throws IOException { Ref r;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java index 9c262e9..9fa3ff3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java
@@ -121,6 +121,9 @@ public class RefDirectory extends RefDatabase { /** If in the header, denotes the file has peeled data. */ public static final String PACKED_REFS_PEELED = " peeled"; //$NON-NLS-1$ + /** If in the header, denotes the file has sorted data. */ + public static final String PACKED_REFS_SORTED = " sorted"; //$NON-NLS-1$ + @SuppressWarnings("boxing") private static final List<Integer> RETRY_SLEEP_MS = Collections.unmodifiableList(Arrays.asList(0, 100, 200, 400, 800, 1600));
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java index 41917f8..58aed82 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefWriter.java
@@ -139,6 +139,7 @@ public void writePackedRefs() throws IOException { if (peeled) { w.write(RefDirectory.PACKED_REFS_HEADER); w.write(RefDirectory.PACKED_REFS_PEELED); + w.write(RefDirectory.PACKED_REFS_SORTED); w.write('\n'); }