Give helpful information if the user encounters action conflicts from a single target. PiperOrigin-RevId: 421073213
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index deb0d1a..c2938be 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -1118,7 +1118,10 @@ } catch (MissingDepException e) { Preconditions.checkState(env.valuesMissing(), e.getMessage()); return null; - } catch (ActionConflictException | InvalidExecGroupException e) { + } catch (ActionConflictException e) { + e.reportTo(env.getListener()); + throw new ConfiguredValueCreationException(ctgValue, e.getMessage()); + } catch (InvalidExecGroupException e) { throw new ConfiguredValueCreationException(ctgValue, e.getMessage()); }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java index 7c4be7b..c749089 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -369,6 +369,23 @@ } @Test + public void actionConflictFromSameTarget() throws Exception { + scratch.file( + "conflict/conflict.bzl", + "def _conflict(ctx):", + " file = ctx.actions.declare_file('single_file')", + " ctx.actions.write(output = file, content = 'a')", + " ctx.actions.write(output = file, content = 'b')", + " return [DefaultInfo(files = depset([file]))]", + "my_rule = rule(implementation = _conflict)"); + scratch.file( + "conflict/BUILD", "load(':conflict.bzl', 'my_rule')", "my_rule(name = 'conflict')"); + reporter.removeHandler(failFastHandler); + assertThrows(ViewCreationFailedException.class, () -> update("//conflict")); + assertContainsEvent("file 'conflict/single_file' is generated by these conflicting actions:"); + } + + @Test public void actionConflictWithDependentRule() throws IOException { scratch.file( "conflict/conflict.bzl",