Changes can't be found when project name matches Change-Id pattern
If a project is named something like "iabcde" then it is not possible
to search for changes using the Change-Id triplet:
project~branch~changeId
Modify the byTriplet test to use a project named "iabcde", which
exposes the problem in the tests.
The reason it fails is because when building the query, the query
builder first checks for a match on Change-Id, which passes due to
the project name. Then the subsequent test for Change-Id triplet
is not reached.
Fix this by moving the triplet check above the change-Id check.
Bug: Issue 6605
Change-Id: I96f5089feea6becfa4c62bd8baa1b13d882c11f8
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index af2cb60..5c3e8c9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -471,11 +471,6 @@
@Operator
public Predicate<ChangeData> change(String query) throws QueryParseException {
- if (PAT_LEGACY_ID.matcher(query).matches()) {
- return new LegacyChangeIdPredicate(Change.Id.parse(query));
- } else if (PAT_CHANGE_ID.matcher(query).matches()) {
- return new ChangeIdPredicate(parseChangeId(query));
- }
Optional<ChangeTriplet> triplet = ChangeTriplet.parse(query);
if (triplet.isPresent()) {
return Predicate.and(
@@ -483,6 +478,11 @@
branch(triplet.get().branch().get()),
new ChangeIdPredicate(parseChangeId(triplet.get().id().get())));
}
+ if (PAT_LEGACY_ID.matcher(query).matches()) {
+ return new LegacyChangeIdPredicate(Change.Id.parse(query));
+ } else if (PAT_CHANGE_ID.matcher(query).matches()) {
+ return new ChangeIdPredicate(parseChangeId(query));
+ }
throw new QueryParseException("Invalid change format");
}
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 cd179b5..d0c8df3 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
@@ -256,25 +256,25 @@
@Test
public void byTriplet() throws Exception {
- TestRepository<Repo> repo = createProject("repo");
+ TestRepository<Repo> repo = createProject("iabcde");
Change change = insert(repo, newChangeForBranch(repo, "branch"));
String k = change.getKey().get();
- assertQuery("repo~branch~" + k, change);
- assertQuery("change:repo~branch~" + k, change);
- assertQuery("repo~refs/heads/branch~" + k, change);
- assertQuery("change:repo~refs/heads/branch~" + k, change);
- assertQuery("repo~branch~" + k.substring(0, 10), change);
- assertQuery("change:repo~branch~" + k.substring(0, 10), change);
+ assertQuery("iabcde~branch~" + k, change);
+ assertQuery("change:iabcde~branch~" + k, change);
+ assertQuery("iabcde~refs/heads/branch~" + k, change);
+ assertQuery("change:iabcde~refs/heads/branch~" + k, change);
+ assertQuery("iabcde~branch~" + k.substring(0, 10), change);
+ assertQuery("change:iabcde~branch~" + k.substring(0, 10), change);
assertQuery("foo~bar");
assertThatQueryException("change:foo~bar").hasMessageThat().isEqualTo("Invalid change format");
assertQuery("otherrepo~branch~" + k);
assertQuery("change:otherrepo~branch~" + k);
- assertQuery("repo~otherbranch~" + k);
- assertQuery("change:repo~otherbranch~" + k);
- assertQuery("repo~branch~I0000000000000000000000000000000000000000");
- assertQuery("change:repo~branch~I0000000000000000000000000000000000000000");
+ assertQuery("iabcde~otherbranch~" + k);
+ assertQuery("change:iabcde~otherbranch~" + k);
+ assertQuery("iabcde~branch~I0000000000000000000000000000000000000000");
+ assertQuery("change:iabcde~branch~I0000000000000000000000000000000000000000");
}
@Test