aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2018-04-11 11:22:38 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-11 11:24:30 -0700
commitbb956ec22c2c9bb2aa2afa19eccebdfbec9728f7 (patch)
tree9acee1ed858315a079cb5c51ca3211cb82a67fd6 /src
parenta2e5ae96d710fa2db363f1b29ab5a7b8425520f1 (diff)
Expose "mnemonic" and "env" on skylark "Action" objects.
RELNOTES: Exposed "mnemonic" and "env" fields on skylark "Action" objects. PiperOrigin-RevId: 192479783
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java16
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java60
2 files changed, 70 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index c053036424..626b8731ad 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -303,6 +303,11 @@ public abstract class AbstractAction implements Action, SkylarkValue {
+ getOutputs() + "]" + ")";
}
+ @SkylarkCallable(
+ name = "mnemonic",
+ structField = true,
+ doc = "The mnemonic for this action."
+ )
@Override
public abstract String getMnemonic();
@@ -628,6 +633,17 @@ public abstract class AbstractAction implements Action, SkylarkValue {
return null;
}
+ @SkylarkCallable(
+ name = "env",
+ structField = true,
+ doc = "The 'fixed' environment variables for this action. This includes only environment "
+ + "settings which are explicitly set by the action definition, and thus omits settings "
+ + "which are only pre-set in the execution environment."
+ )
+ public SkylarkDict<String, String> getEnv() {
+ return SkylarkDict.copyOf(null, env.getFixedEnv());
+ }
+
@Override
@Nullable
public PlatformInfo getExecutionPlatform() {
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
index 0adabd111f..b101eec037 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
@@ -18,12 +18,15 @@ import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.SkylarkProvider.SkylarkKey;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -68,20 +71,36 @@ public class SkylarkActionProviderTest extends AnalysisTestCase {
}
@Test
+ @SuppressWarnings("unchecked")
public void aspectGetsActionProviderForSkylarkRule() throws Exception {
scratch.file(
"test/aspect.bzl",
"foo = provider()",
"def _impl(target, ctx):",
- " return [foo(actions = target.actions)]",
+ " mnemonics = [a.mnemonic for a in target.actions]",
+ " envs = [a.env for a in target.actions]",
+ " inputs = [a.inputs.to_list() for a in target.actions]",
+ " outputs = [a.outputs.to_list() for a in target.actions]",
+ " argv = [a.argv for a in target.actions]",
+ " return [foo(",
+ " actions = target.actions,",
+ " mnemonics = mnemonics,",
+ " envs = envs,",
+ " inputs = inputs,",
+ " outputs = outputs,",
+ " argv = argv",
+ " )]",
"MyAspect = aspect(implementation=_impl)");
scratch.file(
"test/rule.bzl",
"def impl(ctx):",
" output_file0 = ctx.new_file('myfile0')",
" output_file1 = ctx.new_file('myfile1')",
- " ctx.action(outputs=[output_file0], command='fakecmd0', mnemonic='MyAction0')",
- " ctx.action(outputs=[output_file1], command='fakecmd1', mnemonic='MyAction1')",
+ " executable = ctx.new_file('executable')",
+ " ctx.actions.run(outputs=[output_file0], executable=executable,",
+ " mnemonic='MyAction0', env={'foo':'bar', 'pet':'puppy'})",
+ " ctx.actions.run_shell(outputs=[executable, output_file1],",
+ " command='fakecmd', mnemonic='MyAction1', env={'pet':'bunny'})",
" return None",
"my_rule = rule(impl)");
scratch.file(
@@ -96,12 +115,41 @@ public class SkylarkActionProviderTest extends AnalysisTestCase {
SkylarkKey fooKey = new SkylarkKey(Label.parseAbsolute("//test:aspect.bzl"), "foo");
assertThat(configuredAspect.get(fooKey).getValue("actions")).isNotNull();
- @SuppressWarnings("unchecked")
+
SkylarkList<ActionAnalysisMetadata> actions =
(SkylarkList<ActionAnalysisMetadata>) configuredAspect.get(fooKey).getValue("actions");
assertThat(actions).hasSize(2);
- assertThat(actions.stream().map(action -> action.getMnemonic()).collect(Collectors.toList()))
- .containsExactly("MyAction0", "MyAction1");
+ SkylarkList<String> mnemonics =
+ (SkylarkList<String>) configuredAspect.get(fooKey).getValue("mnemonics");
+ assertThat(mnemonics).containsExactly("MyAction0", "MyAction1");
+
+ SkylarkList<SkylarkDict<String, String>> envs =
+ (SkylarkList<SkylarkDict<String, String>>) configuredAspect.get(fooKey).getValue("envs");
+ assertThat(envs).containsExactly(
+ SkylarkDict.of(null, "foo", "bar", "pet", "puppy"),
+ SkylarkDict.of(null, "pet", "bunny"));
+
+ SkylarkList<SkylarkList<Artifact>> inputs =
+ (SkylarkList<SkylarkList<Artifact>>) configuredAspect.get(fooKey).getValue("inputs");
+ assertThat(flattenArtifactNames(inputs)).containsExactly("executable");
+
+ SkylarkList<SkylarkList<Artifact>> outputs =
+ (SkylarkList<SkylarkList<Artifact>>) configuredAspect.get(fooKey).getValue("outputs");
+ assertThat(flattenArtifactNames(outputs)).containsExactly("myfile0", "executable", "myfile1");
+
+ SkylarkList<SkylarkList<String>> argv =
+ (SkylarkList<SkylarkList<String>>) configuredAspect.get(fooKey).getValue("argv");
+ assertThat(argv.get(0)).hasSize(1);
+ assertThat(argv.get(0).get(0)).endsWith("executable");
+ assertThat(argv.get(1)).contains("fakecmd");
+ }
+
+ private static List<String> flattenArtifactNames(
+ SkylarkList<SkylarkList<Artifact>> artifactLists) {
+ return artifactLists.stream()
+ .flatMap(artifacts -> artifacts.stream())
+ .map(artifact -> artifact.getFilename())
+ .collect(Collectors.toList());
}
}