Catch action conflicts in the same target during configured target analysis, and fail hard in other cases.
--
MOS_MIGRATED_REVID=89720528
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 8b1b1bc..563174d 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
@@ -16,10 +16,13 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
+import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.Actions;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.analysis.Aspect;
import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
@@ -494,8 +497,27 @@
analysisEnvironment.disable(target);
Preconditions.checkNotNull(configuredTarget, target);
- return new ConfiguredTargetValue(configuredTarget,
- ImmutableList.copyOf(analysisEnvironment.getRegisteredActions()));
+ try {
+ return new ConfiguredTargetValue(configuredTarget,
+ filterSharedActionsAndThrowIfConflict(analysisEnvironment.getRegisteredActions()));
+ } catch (ActionConflictException e) {
+ throw new ConfiguredTargetFunctionException(e);
+ }
+ }
+
+ static Map<Artifact, Action> filterSharedActionsAndThrowIfConflict(Iterable<Action> actions)
+ throws ActionConflictException {
+ Map<Artifact, Action> generatingActions = new HashMap<>();
+ for (Action action : actions) {
+ for (Artifact artifact : action.getOutputs()) {
+ Action previousAction = generatingActions.put(artifact, action);
+ if (previousAction != null && previousAction != action
+ && !Actions.canBeShared(previousAction, action)) {
+ throw new ActionConflictException(artifact, previousAction, action);
+ }
+ }
+ }
+ return generatingActions;
}
/**
@@ -522,6 +544,10 @@
super(error, Transience.PERSISTENT);
};
+ private ConfiguredTargetFunctionException(ActionConflictException e) {
+ super(e, Transience.PERSISTENT);
+ }
+
private ConfiguredTargetFunctionException(
@Nullable SkyKey childKey, Exception transitiveError) {
super(transitiveError, childKey);