Browse Source

Merge "reftable: fix lookup by ID in merged reftables"

next
Jonathan Tan 5 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
3b96aeb2c9
  1. 13
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/reftable/MergedReftableTest.java
  2. 38
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java

13
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<Ref> delta1 = Arrays.asList(
ref("refs/heads/apple", 1),
ref("refs/heads/master", 2));
List<Ref> 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") @SuppressWarnings("boxing")
@Test @Test
public void fourTableScan() throws IOException { public void fourTableScan() throws IOException {

38
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java

@ -131,7 +131,7 @@ public class MergedReftable extends Reftable {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public RefCursor byObjectId(AnyObjectId name) throws IOException { public RefCursor byObjectId(AnyObjectId name) throws IOException {
MergedRefCursor m = new MergedRefCursor(); MergedRefCursor m = new FilteringMergedRefCursor(name);
for (int i = 0; i < tables.length; i++) { for (int i = 0; i < tables.length; i++) {
m.add(new RefQueueEntry(tables[i].byObjectId(name), 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 { private static class RefQueueEntry {
static int compare(RefQueueEntry a, RefQueueEntry b) { static int compare(RefQueueEntry a, RefQueueEntry b) {
int cmp = a.name().compareTo(b.name()); int cmp = a.name().compareTo(b.name());

Loading…
Cancel
Save