diff options
author | 2018-04-11 11:22:38 -0700 | |
---|---|---|
committer | 2018-04-11 11:24:30 -0700 | |
commit | bb956ec22c2c9bb2aa2afa19eccebdfbec9728f7 (patch) | |
tree | 9acee1ed858315a079cb5c51ca3211cb82a67fd6 /src | |
parent | a2e5ae96d710fa2db363f1b29ab5a7b8425520f1 (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.java | 16 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java | 60 |
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()); } } |