From 5efc3dcc6c9f5c93ba8b1f75b7070d3eb281f08d Mon Sep 17 00:00:00 2001 From: Minh Thai Date: Fri, 9 Feb 2018 09:49:24 -0800 Subject: [PATCH] MergedReftable to skip shadowed refs in same reftable This would allow compact and GC process to clean up duplicate ref names in the reftables. Change-Id: I2b9df0bf72dba63cc3525e374982e60559a776c2 Signed-off-by: Minh Thai --- .../storage/reftable/MergedReftableTest.java | 21 +++++++++++++++++++ .../storage/reftable/MergedReftable.java | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java index adba048e65..ec60bd9137 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java @@ -217,6 +217,27 @@ public class MergedReftableTest { } } + @Test + public void scanDuplicates() throws IOException { + List delta1 = Arrays.asList( + ref("refs/heads/apple", 1), + ref("refs/heads/banana", 2)); + List delta2 = Arrays.asList( + ref("refs/heads/apple", 3), + ref("refs/heads/apple", 4)); + + MergedReftable mr = merge(write(delta1, 1000), write(delta2, 2000)); + try (RefCursor rc = mr.allRefs()) { + assertTrue(rc.next()); + assertEquals("refs/heads/apple", rc.getRef().getName()); + assertEquals(id(3), rc.getRef().getObjectId()); + assertTrue(rc.next()); + assertEquals("refs/heads/banana", rc.getRef().getName()); + assertEquals(id(2), rc.getRef().getObjectId()); + assertFalse(rc.next()); + } + } + @Test public void scanIncludeDeletes() throws IOException { List delta1 = Arrays.asList(ref("refs/heads/next", 4)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java index baebde2b48..ef686a3008 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java @@ -198,8 +198,8 @@ public class MergedReftable extends Reftable { ref = t.rc.getRef(); updateIndex = t.rc.getUpdateIndex(); boolean include = includeDeletes || !t.rc.wasDeleted(); - skipShadowedRefs(ref.getName()); add(t); + skipShadowedRefs(ref.getName()); if (include) { return true; } -- 2.39.5