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 c20db7b96..5f5ab7267 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 @@ -187,6 +187,19 @@ public class MergedReftableTest { } } + @Test + public void tableByIDDeletion() throws IOException { + List delta1 = Arrays.asList( + ref("refs/heads/apple", 1), + ref("refs/heads/master", 2)); + List delta2 = Arrays.asList(ref("refs/heads/master", 3)); + + MergedReftable mr = merge(write(delta1), write(delta2)); + try (RefCursor rc = mr.byObjectId(id(2))) { + assertFalse(rc.next()); + } + } + @SuppressWarnings("boxing") @Test public void fourTableScan() throws IOException { 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 a4394066e..4de5e392f 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 @@ -131,7 +131,7 @@ public class MergedReftable extends Reftable { /** {@inheritDoc} */ @Override public RefCursor byObjectId(AnyObjectId name) throws IOException { - MergedRefCursor m = new MergedRefCursor(); + MergedRefCursor m = new FilteringMergedRefCursor(name); for (int i = 0; i < tables.length; i++) { m.add(new RefQueueEntry(tables[i].byObjectId(name), i)); } @@ -250,6 +250,42 @@ public class MergedReftable extends Reftable { } } + private class FilteringMergedRefCursor extends MergedRefCursor { + final AnyObjectId filterId; + Ref filteredRef; + + FilteringMergedRefCursor(AnyObjectId id) { + filterId = id; + filteredRef = null; + } + + @Override + public Ref getRef() { + return filteredRef; + } + + @Override + public boolean next() throws IOException { + for (;;) { + boolean ok = super.next(); + if (!ok) { + return false; + } + + String name = super.getRef().getName(); + + try (RefCursor c = seekRef(name)) { + if (c.next()) { + if (filterId.equals(c.getRef().getObjectId())) { + filteredRef = c.getRef(); + return true; + } + } + } + } + } + } + private static class RefQueueEntry { static int compare(RefQueueEntry a, RefQueueEntry b) { int cmp = a.name().compareTo(b.name());