diff options
author | Rumou Duan <rduan@google.com> | 2016-06-06 18:52:08 +0000 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2016-06-07 07:48:39 +0000 |
commit | 73876205d11794a5b748dc3e800261c0f459ef76 (patch) | |
tree | 641af04fa8d3d502c3842bbc4991ab3b1850d960 /src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java | |
parent | 2410ef4c777c6b4db397365ae5b78af3a9b3c446 (diff) |
Skyframe changes to support SpawnActionTemplate.
1. Adds ActionTemplateExpansion{Function, Value} for ActionTemplate expansion.
2. Changes ArtifactFunction to support evaluating TreeFileArtifacts and TreeArtifacts generated by ActionTemplate.
--
MOS_MIGRATED_REVID=124160939
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java new file mode 100644 index 0000000000..26d254b9eb --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java @@ -0,0 +1,88 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.skyframe; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; +import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; +import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate; +import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey; +import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionException; +import com.google.devtools.build.skyframe.SkyFunctionException.Transience; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; + +import javax.annotation.Nullable; + +/** + * The SkyFunction for {@link ActionTemplateExpansionValue}. + * + * <p>Given an action template, this function resolves its input TreeArtifact, then expands the + * action template into a list of actions using the expanded {@link TreeFileArtifact}s under the + * input TreeArtifact. + */ +public class ActionTemplateExpansionFunction implements SkyFunction { + + @Override + public SkyValue compute(SkyKey skyKey, Environment env) + throws ActionTemplateExpansionFunctionException { + ActionTemplateExpansionKey key = (ActionTemplateExpansionKey) skyKey.argument(); + SpawnActionTemplate actionTemplate = key.getActionTemplate(); + + // Requests the TreeArtifactValue object for the input TreeArtifact. + SkyKey artifactValueKey = ArtifactValue.key(actionTemplate.getInputTreeArtifact(), true); + TreeArtifactValue treeArtifactValue = (TreeArtifactValue) env.getValue(artifactValueKey); + + // Input TreeArtifact is not ready yet. + if (env.valuesMissing()) { + return null; + } + Iterable<TreeFileArtifact> inputTreeFileArtifacts = treeArtifactValue.getChildren(); + Iterable<Action> expandedActions; + try { + // Expand the action template using the list of expanded input TreeFileArtifacts. + expandedActions = ImmutableList.<Action>copyOf( + actionTemplate.generateActionForInputArtifacts(inputTreeFileArtifacts, key)); + } catch (ActionConflictException e) { + e.reportTo(env.getListener()); + throw new ActionTemplateExpansionFunctionException(e); + } catch (ArtifactPrefixConflictException e) { + env.getListener().handle(Event.error(e.getMessage())); + throw new ActionTemplateExpansionFunctionException(e); + } + + return new ActionTemplateExpansionValue(expandedActions); + } + + /** Exception thrown by {@link ActionTemplateExpansionFunction}. */ + public static final class ActionTemplateExpansionFunctionException extends SkyFunctionException { + ActionTemplateExpansionFunctionException(ActionConflictException e) { + super(e, Transience.PERSISTENT); + } + + ActionTemplateExpansionFunctionException(ArtifactPrefixConflictException e) { + super(e, Transience.PERSISTENT); + } + } + + @Nullable + @Override + public String extractTag(SkyKey skyKey) { + return null; + } +} |