Add an option to filter roots
Allow filtering roots as it can help CI systems wanting to evaluate
only tasks under roots they own for improved query performance.
Change-Id: I566744ab4a9633b4ac9c8b0bfa561009ba8e3996
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java b/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java
index 6bedb5e..a97abf7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/Modules.java
@@ -57,6 +57,13 @@
}
public static class MyOptions implements DynamicBean {
+ @Option(
+ name = "--only",
+ usage =
+ "Evaluate tasks under this task only. Only root task names are supported."
+ + " This option can be provided multiple times.")
+ public List<String> includedRoots = new ArrayList<>();
+
@Option(name = "--all", usage = "Include all visible tasks in the output")
public boolean all = false;
@@ -97,5 +104,9 @@
public MyOptions(PatchSetArgument.Factory patchSetArgumentFactory) {
this.patchSetArgumentFactory = patchSetArgumentFactory;
}
+
+ public boolean shouldFilterRoot(String rootName) {
+ return !includedRoots.isEmpty() && !includedRoots.contains(rootName);
+ }
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
index 6262420..90454f7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
@@ -147,11 +147,14 @@
protected PluginDefinedInfo createWithExceptions(ChangeData c) {
TaskPluginAttribute a = new TaskPluginAttribute();
try {
- for (Node node : definitions.getRootNodes(c)) {
- if (node instanceof Node.Invalid) {
+ for (Node root : definitions.getRootNodes(c)) {
+ if (root instanceof Node.Invalid) {
a.roots.add(invalid());
} else {
- new AttributeFactory(node).create().ifPresent(t -> a.roots.add(t));
+ if (options.shouldFilterRoot(root.task.name())) {
+ continue;
+ }
+ new AttributeFactory(root).create().ifPresent(t -> a.roots.add(t));
}
}
} catch (ConfigInvalidException | IOException | StorageException e) {
diff --git a/src/main/resources/Documentation/task.md b/src/main/resources/Documentation/task.md
index 7a0cf1e..75ee189 100644
--- a/src/main/resources/Documentation/task.md
+++ b/src/main/resources/Documentation/task.md
@@ -588,6 +588,13 @@
status: PASS
```
+**\-\-@PLUGIN@\-\-only**
+
+This switch can be used to only evaluate tasks under a certain root when tasks
+from other roots are unwanted. For example, a CI system may not be interested
+in evaluating tasks for another CI system. The switch can be provided multiple
+times.
+
Examples
--------
See [task_states](test/task_states.html) for a comprehensive list of examples
diff --git a/src/main/resources/Documentation/test/task_states.md b/src/main/resources/Documentation/test/task_states.md
index 709de95..e3f1834 100644
--- a/src/main/resources/Documentation/test/task_states.md
+++ b/src/main/resources/Documentation/test/task_states.md
@@ -56,12 +56,12 @@
[root "Root PASS"]
pass = True
-{
- "applicable" : true,
- "hasPass" : true,
- "name" : "Root PASS",
- "status" : "PASS"
-}
+{ # Test Suite: task_only
+ "applicable" : true, # Test Suite: task_only
+ "hasPass" : true, # Test Suite: task_only
+ "name" : "Root PASS", # Test Suite: task_only
+ "status" : "PASS" # Test Suite: task_only
+} # Test Suite: task_only
[root "Root FAIL"]
fail = True
@@ -2620,10 +2620,10 @@
[root "Root INVALID Preload"]
preload-task = missing
-{
- "name" : "UNKNOWN",
- "status" : "INVALID"
-}
+{ # Test Suite: task_only
+ "name" : "UNKNOWN", # Test Suite: task_only
+ "status" : "INVALID" # Test Suite: task_only
+} # Test Suite: task_only
[root "INVALIDS"]
subtasks-file = invalids.config
diff --git a/test/check_task_statuses.sh b/test/check_task_statuses.sh
index 1e262b3..30e2ece 100755
--- a/test/check_task_statuses.sh
+++ b/test/check_task_statuses.sh
@@ -249,6 +249,10 @@
test_generated preview-non-secret -l "$NON_SECRET_USER" --task--preview "$cnum,1" --task--all "$query"
test_generated preview-invalid --task--preview "$cnum,1" --task--invalid "$query"
+example "$DOC_STATES" 2 | keep_suites "task_only" | testdoc_2_pjson | \
+ ensure json_pp > "$EXPECTED".task-roots-filter
+test_generated task-roots-filter --task--all --task--only "Root\ PASS" "$query"
+
example "$DOC_PATHS" 1 | testdoc_2_cfg | replace_user > "$ROOT_CFG"
q_setup update_repo "$ALL" "$REMOTE_ALL" "$REF_ALL"
ROOTS=$(config_section_keys "root")
diff --git a/test/lib/lib_helper.sh b/test/lib/lib_helper.sh
index efb6de9..f4006db 100644
--- a/test/lib/lib_helper.sh
+++ b/test/lib/lib_helper.sh
@@ -59,7 +59,17 @@
remove_suites() { # suites... < pre_json > json
grep -vE "# Only Test Suite: ($(echo "$@" | sed "s/ /|/g"))" | \
- sed -e's/# Only Test Suite:.*$//; s/ *$//'
+ sed -e's/# Only Test Suite:.*$//; s/# Test Suite:.*$//; s/ *$//'
+}
+
+# pre_json is a "templated json" used in the test docs to express test results. It looks
+# like json but has some extra comments to express when a certain output should be used.
+# These comments look like: "# Test Suite: <suite>[, <suite>][, <suite>]..."
+#
+
+keep_suites() { # suites... < pre_json > json
+ grep -E "# Test Suite: (.*, )?($(echo "$@" | sed "s/ /|/g"))(, .*)?$" | \
+ sed -e's/# Only Test Suite:.*$//; s/# Test Suite:.*$//; s/ *$//'
}
remove_not_suite() { remove_suites !"$1" ; } # suite < pre_json > json