Support searching changes by directories

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: I4192646dc50ace09e1f7b697f5b352b6ceca12fa
This commit is contained in:
Edwin Kempin
2019-01-25 15:20:52 +01:00
parent f148c79933
commit 0e88d5d69a
7 changed files with 188 additions and 1 deletions

View File

@@ -1502,6 +1502,81 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests {
assertQuery("footer:=");
}
@Test
public void byDirectory() throws Exception {
if (getSchemaVersion() < 55) {
assertMissingField(ChangeField.DIRECTORY);
String unsupportedOperatorMessage =
"'directory' operator is not supported by change index version";
assertFailingQuery("directory:src/java", unsupportedOperatorMessage);
assertFailingQuery("dir:src/java", unsupportedOperatorMessage);
return;
}
TestRepository<Repo> repo = createProject("repo");
Change change1 = insert(repo, newChangeWithFiles(repo, "src/foo.h", "src/foo.cc"));
Change change2 = insert(repo, newChangeWithFiles(repo, "src/java/foo.java", "src/js/bar.js"));
Change change3 =
insert(repo, newChangeWithFiles(repo, "documentation/training/slides/README.txt"));
Change change4 = insert(repo, newChangeWithFiles(repo, "a.txt"));
Change change5 = insert(repo, newChangeWithFiles(repo, "a/b/c/d/e/foo.txt"));
// matching by directory prefix works
assertQuery("directory:src", change2, change1);
assertQuery("directory:src/java", change2);
assertQuery("directory:src/js", change2);
assertQuery("directory:documentation/", change3);
assertQuery("directory:documentation/training", change3);
assertQuery("directory:documentation/training/slides", change3);
// 'dir' alias works
assertQuery("dir:src", change2, change1);
assertQuery("dir:src/java", change2);
// case doesn't matter
assertQuery("directory:Documentation/TrAiNiNg/SLIDES", change3);
// leading and trailing '/' doesn't matter
assertQuery("directory:/documentation/training/slides", change3);
assertQuery("directory:documentation/training/slides/", change3);
assertQuery("directory:/documentation/training/slides/", change3);
// files do not match as directory
assertQuery("directory:src/foo.h");
assertQuery("directory:documentation/training/slides/README.txt");
// root directory matches all changes
assertQuery("directory:/", change5, change4, change3, change2, change1);
assertQuery("directory:\"\"", change5, change4, change3, change2, change1);
assertFailingQuery("directory:");
// matching single directory segments works
assertQuery("directory:java", change2);
assertQuery("directory:slides", change3);
// files do not match as directory segment
assertQuery("directory:foo.h");
// matching any combination of intermediate directory segments works
assertQuery("directory:training/slides", change3);
assertQuery("directory:b/c", change5);
assertQuery("directory:b/c/d", change5);
assertQuery("directory:b/c/d/e", change5);
assertQuery("directory:c/d", change5);
assertQuery("directory:c/d/e", change5);
assertQuery("directory:d/e", change5);
// files do not match as directory segments
assertQuery("directory:d/e/foo.txt");
assertQuery("directory:e/foo.txt");
// matching any combination of intermediate directory segments works with leading and trailing
// '/'
assertQuery("directory:/b/c", change5);
assertQuery("directory:/b/c/", change5);
assertQuery("directory:b/c/", change5);
}
@Test
public void byComment() throws Exception {
TestRepository<Repo> repo = createProject("repo");