Add fine grained Aquery failure codes to AqueryCommandUtils and ActionFilterFunction.
RELNOTES: None.
PiperOrigin-RevId: 320288980
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java b/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java
index 65fa79a..68d672a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java
@@ -16,6 +16,7 @@
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Argument;
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction;
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryTaskFuture;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
@@ -45,8 +46,8 @@
new QueryException(
expression,
String.format(
- "Illegal '%s' pattern regexp '%s': %s",
- getName(), filterPattern, e.getMessage())));
+ "Illegal '%s' pattern regexp '%s': %s", getName(), filterPattern, e.getMessage()),
+ ActionQuery.Code.ILLEGAL_PATTERN_SYNTAX));
}
// The 2nd argument can only be empty in the case of --skyframe_state.
@@ -55,7 +56,8 @@
new QueryException(
expression,
"aquery filter functions (inputs, outputs, mnemonics) must have exactly 2 arguments,"
- + "except when --skyframe_state is used."));
+ + "except when --skyframe_state is used.",
+ ActionQuery.Code.INCORRECT_ARGUMENTS));
}
// Do nothing, pass the expression along
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
index a653be8..f005836 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.query2.engine;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
import com.google.devtools.build.lib.server.FailureDetails.ConfigurableQuery;
import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
import com.google.devtools.build.lib.server.FailureDetails.Query;
@@ -73,6 +74,17 @@
.build());
}
+ public QueryException(
+ QueryExpression expression, String message, ActionQuery.Code actionQueryCode) {
+ this(
+ expression,
+ message,
+ FailureDetail.newBuilder()
+ .setMessage(message)
+ .setActionQuery(ActionQuery.newBuilder().setCode(actionQueryCode).build())
+ .build());
+ }
+
public QueryException(String message, Throwable cause, FailureDetail failureDetail) {
super(message, cause);
this.expression = null;
@@ -87,6 +99,10 @@
this(null, message, queryCode);
}
+ public QueryException(String message, ActionQuery.Code actionQueryCode) {
+ this(null, message, actionQueryCode);
+ }
+
public QueryException(String message, ConfigurableQuery.Code configurableQueryCode) {
this(
null,
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java
index 0de18cb..8729695 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java
@@ -16,6 +16,7 @@
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.query2.engine.QueryException;
import com.google.devtools.build.lib.query2.engine.QueryExpression;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -56,7 +57,8 @@
+ query
+ "': Specifying build target(s) "
+ topLevelTargets
- + " with --skyframe_state is currently not supported.");
+ + " with --skyframe_state is currently not supported.",
+ ActionQuery.Code.TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED);
}
return topLevelTargets;
diff --git a/src/main/protobuf/failure_details.proto b/src/main/protobuf/failure_details.proto
index 08c9098..eae6131 100644
--- a/src/main/protobuf/failure_details.proto
+++ b/src/main/protobuf/failure_details.proto
@@ -726,6 +726,10 @@
INVALID_AQUERY_EXPRESSION = 6 [(metadata) = { exit_code: 1 }];
SKYFRAME_STATE_PREREQ_UNMET = 7 [(metadata) = { exit_code: 2 }];
AQUERY_OUTPUT_TOO_BIG = 8 [(metadata) = { exit_code: 7 }];
+ ILLEGAL_PATTERN_SYNTAX = 9 [(metadata) = { exit_code: 2 }];
+ INCORRECT_ARGUMENTS = 10 [(metadata) = { exit_code: 2 }];
+ TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED = 11
+ [(metadata) = { exit_code: 2 }];
}
Code code = 1;
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java b/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java
index 4c3e68c..8ae7bbe 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.runtime.commands;
+import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import com.google.common.collect.ImmutableList;
@@ -22,6 +23,7 @@
import com.google.devtools.build.lib.query2.engine.QueryException;
import com.google.devtools.build.lib.query2.engine.QueryExpression;
import com.google.devtools.build.lib.query2.engine.QueryParser;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -52,14 +54,20 @@
throws Exception {
String query = "//some_target";
QueryExpression expr = QueryParser.parse(query, functions);
-
- assertThrows(
- QueryException.class,
- () ->
- AqueryCommandUtils.getTopLevelTargets(
- /* universeScope= */ ImmutableList.of(),
- expr,
- /* queryCurrentSkyframeState= */ true,
- query));
+ QueryException exception =
+ assertThrows(
+ QueryException.class,
+ () ->
+ AqueryCommandUtils.getTopLevelTargets(
+ /* universeScope= */ ImmutableList.of(),
+ expr,
+ /* queryCurrentSkyframeState= */ true,
+ query));
+ assertThat(exception).hasMessageThat().contains("Error while parsing '" + query);
+ assertThat(exception)
+ .hasMessageThat()
+ .contains("with --skyframe_state is currently not supported");
+ assertThat(exception.getFailureDetail().get().getActionQuery().getCode())
+ .isEqualTo(ActionQuery.Code.TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED);
}
}