Fix cquery errors to not show full stack trace when `--keep_going` is present. PiperOrigin-RevId: 420039198
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryProcessor.java b/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryProcessor.java index 6d71415..f0882c6 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryProcessor.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/PostAnalysisQueryProcessor.java
@@ -94,18 +94,18 @@ if (!request.getKeepGoing()) { throw new ViewCreationFailedException(errorMessage, e.getFailureDetail(), e); } - env.getReporter().error(null, errorMessage, e); + env.getReporter().error(null, errorMessage + ": " + e.getFailureDetail().getMessage()); } catch (IOException e) { String errorMessage = "I/O error doing post analysis query"; + FailureDetail failureDetail = + FailureDetail.newBuilder() + .setMessage(errorMessage + ": " + e.getMessage()) + .setQuery(Query.newBuilder().setCode(Query.Code.OUTPUT_FORMATTER_IO_EXCEPTION)) + .build(); if (!request.getKeepGoing()) { - FailureDetail failureDetail = - FailureDetail.newBuilder() - .setMessage(errorMessage + ": " + e.getMessage()) - .setQuery(Query.newBuilder().setCode(Query.Code.OUTPUT_FORMATTER_IO_EXCEPTION)) - .build(); throw new ViewCreationFailedException(errorMessage, failureDetail, e); } - env.getReporter().error(null, errorMessage, e); + env.getReporter().error(null, failureDetail.getMessage()); } catch (QueryRuntimeHelperException e) { throw new ExitException(DetailedExitCode.of(e.getFailureDetail())); } catch (OptionsParsingException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/events/Reporter.java b/src/main/java/com/google/devtools/build/lib/events/Reporter.java index c9e5190..7898542 100644 --- a/src/main/java/com/google/devtools/build/lib/events/Reporter.java +++ b/src/main/java/com/google/devtools/build/lib/events/Reporter.java
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.util.io.OutErr; import java.io.PrintStream; import java.util.concurrent.ConcurrentLinkedQueue; +import javax.annotation.Nullable; import net.starlark.java.syntax.Location; /** @@ -170,9 +171,15 @@ handle(Event.of(EventKind.FINISH, location, message)); } - public void error(Location location, String message, Throwable error) { + public void error(Location location, String message) { + error(location, message, /*error=*/ null); + } + + public void error(Location location, String message, @Nullable Throwable error) { handle(Event.error(location, message)); - error.printStackTrace(new PrintStream(getOutErr().getErrorStream())); + if (error != null) { + error.printStackTrace(new PrintStream(getOutErr().getErrorStream())); + } } /**
diff --git a/src/test/shell/integration/configured_query_test.sh b/src/test/shell/integration/configured_query_test.sh index 0f5e02f..2d5ec9c 100755 --- a/src/test/shell/integration/configured_query_test.sh +++ b/src/test/shell/integration/configured_query_test.sh
@@ -1381,4 +1381,18 @@ expect_log "Unknown configuration ID 'notaconfighash'" } +function test_error_keep_going() { + local -r pkg=$FUNCNAME + mkdir -p $pkg + cat > $pkg/BUILD <<'EOF' +sh_library(name='maple', deps=[':japanese']) +sh_library(name='japanese') +EOF + + # This causes a failure in the cquery function, which should produce an + # actionable error, not a stack trace. + bazel cquery --keep_going "config(//$pkg:oak, notaconfighash)" > output 2>"$TEST_log" && fail "Expected error" + expect_not_log "QueryException" +} + run_suite "${PRODUCT_NAME} configured query tests"