diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java index d2889aefb1..ccfc762417 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java @@ -251,9 +251,15 @@ public class ChangeNotes extends AbstractChangeNotes { List notes = new ArrayList<>(); if (args.migration.enabled()) { for (Change.Id cid : changeIds) { - ChangeNotes cn = create(db, project, cid); - if (cn.getChange() != null && predicate.test(cn)) { - notes.add(cn); + try { + ChangeNotes cn = create(db, project, cid); + if (cn.getChange() != null && predicate.test(cn)) { + notes.add(cn); + } + } catch (NoSuchChangeException e) { + // Match ReviewDb behavior, returning not found; maybe the caller learned about it from + // a dangling patch set ref or something. + continue; } } return notes; diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java index 626863afae..bcd5d39e7d 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java @@ -105,6 +105,7 @@ import com.google.inject.util.Providers; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -115,6 +116,7 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefUpdate; @@ -1709,9 +1711,28 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void byCommitsOnBranchNotMerged() throws Exception { + TestRepository tr = createProject("repo"); + testByCommitsOnBranchNotMerged(tr, ImmutableSet.of()); + } + + @Test + public void byCommitsOnBranchNotMergedSkipsMissingChanges() throws Exception { TestRepository repo = createProject("repo"); + ObjectId missing = + repo.branch(new PatchSet.Id(new Change.Id(987654), 1).toRefName()) + .commit() + .message("No change for this commit") + .insertChangeId() + .create() + .copy(); + testByCommitsOnBranchNotMerged(repo, ImmutableSet.of(missing)); + } + + private void testByCommitsOnBranchNotMerged(TestRepository repo, Collection extra) + throws Exception { int n = 10; - List shas = new ArrayList<>(n); + List shas = new ArrayList<>(n + extra.size()); + extra.forEach(i -> shas.add(i.name())); List expectedIds = new ArrayList<>(n); Branch.NameKey dest = null; for (int i = 0; i < n; i++) {