Add --include_artifacts option to bazel aquery and to bazel dump

This option defaults to true. When disabled, bazel aquery will not include action inputs and outputs, making the output much shorter.

Fixes https://github.com/bazelbuild/bazel/issues/7221

RELNOTES: None.
PiperOrigin-RevId: 232466494
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallback.java
index c83ef05..1b60d15 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallback.java
@@ -65,7 +65,10 @@
     this.actionFilters = actionFilters;
     this.actionGraphDump =
         new ActionGraphDump(
-            options.includeCommandline, this.actionFilters, options.includeParamFiles);
+            options.includeCommandline,
+            options.includeArtifacts,
+            this.actionFilters,
+            options.includeParamFiles);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
index e2ca57d..24cea1a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphTextOutputFormatterCallback.java
@@ -183,6 +183,7 @@
           .append('\n');
     }
 
+    if (options.includeArtifacts) {
     stringBuilder
         .append("  Inputs: [")
         .append(
@@ -202,6 +203,7 @@
                 .sorted()
                 .collect(Collectors.joining(", ")))
         .append("]\n");
+    }
 
     if (action instanceof SpawnAction) {
       SpawnAction spawnAction = (SpawnAction) action;
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/AqueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/output/AqueryOptions.java
index 6c28626..4f4b7d1 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/AqueryOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/AqueryOptions.java
@@ -39,6 +39,15 @@
   public boolean includeCommandline;
 
   @Option(
+      name = "include_artifacts",
+      defaultValue = "true",
+      documentationCategory = OptionDocumentationCategory.QUERY,
+      effectTags = {OptionEffectTag.TERMINAL_OUTPUT},
+      help =
+          "Includes names of the action inputs and outputs in the output " + "(potentially large).")
+  public boolean includeArtifacts;
+
+  @Option(
       name = "include_aspects",
       defaultValue = "false",
       documentationCategory = OptionDocumentationCategory.QUERY,
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
index bae37e3..6609bfc 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
@@ -126,6 +126,16 @@
     public boolean actionGraphIncludeCmdLine;
 
     @Option(
+        name = "action_graph:include_artifacts",
+        defaultValue = "true",
+        documentationCategory = OptionDocumentationCategory.OUTPUT_SELECTION,
+        effectTags = {OptionEffectTag.BAZEL_MONITORING},
+        help =
+            "Include inputs and outputs actions in the action graph dump. "
+                + "This option does only apply to --action_graph.")
+    public boolean actionGraphIncludeArtifacts;
+
+    @Option(
       name = "rule_classes",
       defaultValue = "false",
       documentationCategory = OptionDocumentationCategory.OUTPUT_SELECTION,
@@ -240,6 +250,7 @@
                   dumpOptions.dumpActionGraph,
                   dumpOptions.actionGraphTargets,
                   dumpOptions.actionGraphIncludeCmdLine,
+                  dumpOptions.actionGraphIncludeArtifacts,
                   out);
         } catch (CommandLineExpansionException e) {
           env.getReporter().handle(Event.error(null, "Error expanding command line: " + e));
@@ -298,11 +309,13 @@
       String path,
       List<String> actionGraphTargets,
       boolean includeActionCmdLine,
+      boolean includeArtifacts,
       PrintStream out)
       throws CommandLineExpansionException, IOException {
     out.println("Dumping action graph to '" + path + "'");
     ActionGraphContainer actionGraphContainer =
-        executor.getActionGraphContainer(actionGraphTargets, includeActionCmdLine);
+        executor.getActionGraphContainer(
+            actionGraphTargets, includeActionCmdLine, includeArtifacts);
     FileOutputStream protoOutputStream = new FileOutputStream(path);
     actionGraphContainer.writeTo(protoOutputStream);
     protoOutputStream.close();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index e60471a..48aed76 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -732,9 +732,10 @@
 
   @Override
   public ActionGraphContainer getActionGraphContainer(
-      List<String> actionGraphTargets, boolean includeActionCmdLine)
+      List<String> actionGraphTargets, boolean includeActionCmdLine, boolean includeArtifacts)
       throws CommandLineExpansionException {
-    ActionGraphDump actionGraphDump = new ActionGraphDump(actionGraphTargets, includeActionCmdLine);
+    ActionGraphDump actionGraphDump =
+        new ActionGraphDump(actionGraphTargets, includeActionCmdLine, includeArtifacts);
     for (Map.Entry<SkyKey, SkyValue> skyKeyAndValue :
         memoizingEvaluator.getDoneValues().entrySet()) {
       SkyKey key = skyKeyAndValue.getKey();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 379054b..f06f313 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -708,7 +708,7 @@
   }
 
   public abstract ActionGraphContainer getActionGraphContainer(
-      List<String> actionGraphTargets, boolean includeActionCmdLine)
+      List<String> actionGraphTargets, boolean includeActionCmdLine, boolean includeArtifacts)
       throws CommandLineExpansionException;
 
   class BuildViewProvider {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
index 7ec2080..754fbdd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
@@ -65,23 +65,30 @@
   private final KnownRuleConfiguredTargets knownRuleConfiguredTargets;
   private final AqueryActionFilter actionFilters;
   private final boolean includeActionCmdLine;
+  private final boolean includeArtifacts;
   private final boolean includeParamFiles;
 
   private Map<String, Iterable<String>> paramFileNameToContentMap;
 
   public ActionGraphDump(
-      boolean includeActionCmdLine, AqueryActionFilter actionFilters, boolean includeParamFiles) {
+      boolean includeActionCmdLine,
+      boolean includeArtifacts,
+      AqueryActionFilter actionFilters,
+      boolean includeParamFiles) {
     this(
         /* actionGraphTargets= */ ImmutableList.of("..."),
         includeActionCmdLine,
+        includeArtifacts,
         actionFilters,
         includeParamFiles);
   }
 
-  public ActionGraphDump(List<String> actionGraphTargets, boolean includeActionCmdLine) {
+  public ActionGraphDump(
+      List<String> actionGraphTargets, boolean includeActionCmdLine, boolean includeArtifacts) {
     this(
         actionGraphTargets,
         includeActionCmdLine,
+        includeArtifacts,
         /* actionFilters= */ AqueryActionFilter.emptyInstance(),
         /* includeParamFiles */ false);
   }
@@ -89,10 +96,12 @@
   public ActionGraphDump(
       List<String> actionGraphTargets,
       boolean includeActionCmdLine,
+      boolean includeArtifacts,
       AqueryActionFilter actionFilters,
       boolean includeParamFiles) {
     this.actionGraphTargets = ImmutableSet.copyOf(actionGraphTargets);
     this.includeActionCmdLine = includeActionCmdLine;
+    this.includeArtifacts = includeArtifacts;
     this.actionFilters = actionFilters;
     this.includeParamFiles = includeParamFiles;
 
@@ -210,20 +219,22 @@
       }
     }
 
-    // Store inputs
-    Iterable<Artifact> inputs = action.getInputs();
-    if (!(inputs instanceof NestedSet)) {
-      inputs = NestedSetBuilder.wrap(Order.STABLE_ORDER, inputs);
-    }
-    NestedSetView<Artifact> nestedSetView = new NestedSetView<>((NestedSet<Artifact>) inputs);
+    if (includeArtifacts) {
+      // Store inputs
+      Iterable<Artifact> inputs = action.getInputs();
+      if (!(inputs instanceof NestedSet)) {
+        inputs = NestedSetBuilder.wrap(Order.STABLE_ORDER, inputs);
+      }
+      NestedSetView<Artifact> nestedSetView = new NestedSetView<>((NestedSet<Artifact>) inputs);
 
-    if (nestedSetView.directs().size() > 0 || nestedSetView.transitives().size() > 0) {
-      actionBuilder.addInputDepSetIds(knownNestedSets.dataToId(nestedSetView));
-    }
+      if (nestedSetView.directs().size() > 0 || nestedSetView.transitives().size() > 0) {
+        actionBuilder.addInputDepSetIds(knownNestedSets.dataToId(nestedSetView));
+      }
 
-    // store outputs
-    for (Artifact artifact : action.getOutputs()) {
-      actionBuilder.addOutputIds(knownArtifacts.dataToId(artifact));
+      // store outputs
+      for (Artifact artifact : action.getOutputs()) {
+        actionBuilder.addOutputIds(knownArtifacts.dataToId(artifact));
+      }
     }
 
     actionGraphBuilder.addActions(actionBuilder.build());
diff --git a/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java b/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java
index 1dc7c15..9171f65 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java
+++ b/src/test/java/com/google/devtools/build/lib/query2/ActionGraphProtoOutputFormatterCallbackTest.java
@@ -62,6 +62,7 @@
   public final void setUpAqueryOptions() {
     this.options = new AqueryOptions();
     options.aspectDeps = Mode.OFF;
+    options.includeArtifacts = true;
     this.reporter = new Reporter(new EventBus(), events::add);
   }
 
@@ -361,6 +362,25 @@
   }
 
   @Test
+  public void test_includeArtifacts_disabled() throws Exception {
+    options.includeArtifacts = false;
+
+    writeFile("test/BUILD", "java_library(name='foo', srcs=['foo.java'])");
+    ActionGraphContainer actionGraphContainer =
+        getOutput("deps(//test:foo)", AqueryActionFilter.emptyInstance());
+    Action javaCompileAction =
+        Iterables.getOnlyElement(
+            actionGraphContainer.getActionsList().stream()
+                .filter(x -> x.getMnemonic().equals("Javac"))
+                .collect(Collectors.toList()));
+
+    assertThat(javaCompileAction.getInputDepSetIdsList()).isEmpty();
+    assertThat(javaCompileAction.getOutputIdsList()).isEmpty();
+    assertThat(actionGraphContainer.getDepSetOfFilesList()).isEmpty();
+    assertThat(actionGraphContainer.getArtifactsList()).isEmpty();
+  }
+
+  @Test
   public void test_includeParamFile_subsetOfCmdlineArgs() throws Exception {
     if (OS.getCurrent() == OS.DARWIN) {
       return;
diff --git a/src/test/shell/integration/aquery_test.sh b/src/test/shell/integration/aquery_test.sh
index 5611ba3..4bf4ed3 100755
--- a/src/test/shell/integration/aquery_test.sh
+++ b/src/test/shell/integration/aquery_test.sh
@@ -136,6 +136,35 @@
   assert_not_contains "echo unused" output
 }
 
+
+function test_aquery_include_artifacts() {
+  local pkg="${FUNCNAME[0]}"
+  mkdir -p "$pkg" || fail "mkdir -p $pkg"
+  cat > "$pkg/BUILD" <<'EOF'
+genrule(
+    name = "bar",
+    srcs = ["dummy.txt"],
+    outs = ["bar_out.txt"],
+    cmd = "echo unused > $(OUTS)",
+)
+EOF
+  echo "hello aquery" > "$pkg/in.txt"
+
+  bazel aquery --include_artifacts "//$pkg:bar" > output 2> "$TEST_log" \
+    || fail "Expected success"
+  cat output >> "$TEST_log"
+
+  assert_contains "Inputs: \[" output
+  assert_contains "Outputs: \[" output
+
+  bazel aquery --noinclude_artifacts "//$pkg:bar" > output 2> "$TEST_log" \
+    || fail "Expected success"
+  cat output >> "$TEST_log"
+
+  assert_not_contains "Inputs: \[" output
+  assert_not_contains "Outputs: \[" output
+}
+
 function test_aquery_textproto() {
   local pkg="${FUNCNAME[0]}"
   mkdir -p "$pkg" || fail "mkdir -p $pkg"