Track client environment in Skyframe
...to determine which actions have to be recomputed based on changes
to the client environment. Note that this change does it the simple way
and reconsideres all actions on a changed client environment, while still
only reexecuting those, where the part that was inherited from the environment
actually did change.
--
Change-Id: Ie1116d094642165e5e959447a6fcf49d19b37d6e
Reviewed-on: https://bazel-review.googlesource.com/#/c/5431
MOS_MIGRATED_REVID=133010705
diff --git a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java
index 41dfd5d..479e152 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java
@@ -22,6 +22,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.util.Clock;
import com.google.devtools.build.lib.vfs.Path;
@@ -163,7 +164,8 @@
// Mutations may result in IllegalStateException.
@Test
public void testEntryToStringIsIdempotent() throws Exception {
- ActionCache.Entry entry = new ActionCache.Entry("actionKey", false);
+ ActionCache.Entry entry =
+ new ActionCache.Entry("actionKey", ImmutableMap.<String, String>of(), false);
entry.toString();
entry.addFile(new PathFragment("foo/bar"), Metadata.CONSTANT_METADATA);
entry.toString();
@@ -217,7 +219,8 @@
}
private void putKey(String key, ActionCache ac, boolean discoversInputs) {
- ActionCache.Entry entry = new ActionCache.Entry(key, discoversInputs);
+ ActionCache.Entry entry =
+ new ActionCache.Entry(key, ImmutableMap.<String, String>of(), discoversInputs);
entry.getFileDigest();
ac.put(key, entry);
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index e7d0655..3cb4951 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -15,6 +15,7 @@
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables;
import com.google.common.eventbus.EventBus;
@@ -182,6 +183,7 @@
ruleClassProvider.getDefaultsPackageContent(
analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
packageManager = skyframeExecutor.getPackageManager();
loadingPhaseRunner = skyframeExecutor.getLoadingPhaseRunner(
@@ -285,6 +287,7 @@
ruleClassProvider.getDefaultsPackageContent(
analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
skyframeExecutor.invalidateFilesUnderPathForTesting(reporter,
ModifiedFileSet.EVERYTHING_MODIFIED, rootDirectory);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index aac6fe6..7da4ca5 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -227,8 +227,13 @@
analysisMock.getProductName());
skyframeExecutor.preparePackageLoading(
new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)),
- ConstantRuleVisibility.PUBLIC, true, 7, "",
- UUID.randomUUID(), tsgm);
+ ConstantRuleVisibility.PUBLIC,
+ true,
+ 7,
+ "",
+ UUID.randomUUID(),
+ ImmutableMap.of(),
+ tsgm);
useConfiguration();
setUpSkyframe();
// Also initializes ResourceManager.
@@ -310,10 +315,15 @@
private void setUpSkyframe() {
PathPackageLocator pkgLocator = PathPackageLocator.create(
outputBase, packageCacheOptions.packagePath, reporter, rootDirectory, rootDirectory);
- skyframeExecutor.preparePackageLoading(pkgLocator,
- packageCacheOptions.defaultVisibility, true,
- 7, ruleClassProvider.getDefaultsPackageContent(optionsParser),
- UUID.randomUUID(), tsgm);
+ skyframeExecutor.preparePackageLoading(
+ pkgLocator,
+ packageCacheOptions.defaultVisibility,
+ true,
+ 7,
+ ruleClassProvider.getDefaultsPackageContent(optionsParser),
+ UUID.randomUUID(),
+ ImmutableMap.<String, String>of(),
+ tsgm);
skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index af92ecf..b5ecba0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -17,6 +17,7 @@
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Root;
@@ -122,6 +123,7 @@
ruleClassProvider.getDefaultsPackageContent(
analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
mockToolsConfig = new MockToolsConfig(rootDirectory);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index 8b8d039..6b1eebb 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -49,15 +49,13 @@
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.common.options.OptionsParser;
-
-import org.junit.Before;
-
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
+import org.junit.Before;
/**
* This is a specialization of {@link FoundationTestCase} that's useful for
@@ -131,7 +129,8 @@
skyframeExecutor.preparePackageLoading(
new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)),
defaultVisibility, true, GLOBBING_THREADS, defaultsPackageContents,
- UUID.randomUUID(), new TimestampGranularityMonitor(BlazeClock.instance()));
+ UUID.randomUUID(), ImmutableMap.of(),
+ new TimestampGranularityMonitor(BlazeClock.instance()));
}
private void setUpSkyframe(PackageCacheOptions packageCacheOptions) {
@@ -144,8 +143,10 @@
GLOBBING_THREADS,
loadingMock.getDefaultsPackageContent(),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
- skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
+ skyframeExecutor.setDeletedPackages(
+ ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
}
private PackageCacheOptions parsePackageCacheOptions(String... options) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index 3a2798f..3069a1d 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -55,20 +55,17 @@
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionName;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
-
import javax.annotation.Nullable;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
/**
* Tests for incremental loading; these cover both normal operation and diff awareness, for which a
@@ -488,7 +485,8 @@
skyframeExecutor.preparePackageLoading(
new PathPackageLocator(outputBase, ImmutableList.of(workspace)),
ConstantRuleVisibility.PUBLIC, true, 7, "",
- UUID.randomUUID(), new TimestampGranularityMonitor(BlazeClock.instance()));
+ UUID.randomUUID(), ImmutableMap.of(),
+ new TimestampGranularityMonitor(BlazeClock.instance()));
}
Path addFile(String fileName, String... content) throws IOException {
@@ -567,7 +565,8 @@
skyframeExecutor.preparePackageLoading(
new PathPackageLocator(outputBase, ImmutableList.of(workspace)),
ConstantRuleVisibility.PUBLIC, true, 7, "",
- UUID.randomUUID(), new TimestampGranularityMonitor(BlazeClock.instance()));
+ UUID.randomUUID(), ImmutableMap.of(),
+ new TimestampGranularityMonitor(BlazeClock.instance()));
skyframeExecutor.invalidateFilesUnderPathForTesting(
new Reporter(), modifiedFileSet, workspace);
((SequencedSkyframeExecutor) skyframeExecutor).handleDiffs(new Reporter());
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
index afa781a..ceb26a1 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
@@ -26,6 +26,7 @@
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.eventbus.EventBus;
@@ -620,9 +621,10 @@
7,
analysisMock.getDefaultsPackageContent(),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(clock));
- loadingPhaseRunner = skyframeExecutor.getLoadingPhaseRunner(
- pkgFactory.getRuleClassNames(), useNewImpl);
+ loadingPhaseRunner =
+ skyframeExecutor.getLoadingPhaseRunner(pkgFactory.getRuleClassNames(), useNewImpl);
this.options = Options.getDefaults(LoadingOptions.class);
}
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index 9afcce1..5735458 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -24,6 +24,7 @@
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
@@ -55,17 +56,15 @@
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.common.options.OptionsParser;
import com.google.devtools.common.options.OptionsParsingException;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
/**
* Tests for package loading.
@@ -112,8 +111,10 @@
7,
analysisMock.getDefaultsPackageContent(),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
- skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
+ skyframeExecutor.setDeletedPackages(
+ ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
}
private PackageCacheOptions parsePackageCacheOptions(String... options) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index 2aec594..f6ee2ee 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -71,10 +71,16 @@
private CustomInMemoryFs fs = new CustomInMemoryFs(new ManualClock());
private void preparePackageLoading(Path... roots) {
- getSkyframeExecutor().preparePackageLoading(
- new PathPackageLocator(outputBase, ImmutableList.copyOf(roots)),
- ConstantRuleVisibility.PUBLIC, true,
- 7, "", UUID.randomUUID(), new TimestampGranularityMonitor(BlazeClock.instance()));
+ getSkyframeExecutor()
+ .preparePackageLoading(
+ new PathPackageLocator(outputBase, ImmutableList.copyOf(roots)),
+ ConstantRuleVisibility.PUBLIC,
+ true,
+ 7,
+ "",
+ UUID.randomUUID(),
+ ImmutableMap.<String, String>of(),
+ new TimestampGranularityMonitor(BlazeClock.instance()));
}
@Override
@@ -435,10 +441,16 @@
Label.parseAbsoluteUnchecked("//foo:b.txt"))
.inOrder();
getSkyframeExecutor().resetEvaluator();
- getSkyframeExecutor().preparePackageLoading(
- new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)),
- ConstantRuleVisibility.PUBLIC, true, 7, "",
- UUID.randomUUID(), tsgm);
+ getSkyframeExecutor()
+ .preparePackageLoading(
+ new PathPackageLocator(outputBase, ImmutableList.<Path>of(rootDirectory)),
+ ConstantRuleVisibility.PUBLIC,
+ true,
+ 7,
+ "",
+ UUID.randomUUID(),
+ ImmutableMap.of(),
+ tsgm);
value = validPackage(skyKey);
assertThat(
(Iterable<Label>)
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
index b5a9494..902c62f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
@@ -18,6 +18,7 @@
import static org.junit.Assert.fail;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
@@ -33,14 +34,12 @@
import com.google.devtools.build.lib.vfs.ModifiedFileSet;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
import java.io.IOException;
import java.util.Collection;
import java.util.UUID;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class SkyframeLabelVisitorTest extends SkyframeLabelVisitorTestCase {
@@ -410,6 +409,7 @@
7,
loadingMock.getDefaultsPackageContent(),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
this.visitor = getSkyframeExecutor().pkgLoader();
scratch.file("pkg/BUILD", "sh_library(name = 'x', deps = ['z'])", "sh_library(name = 'z')");
@@ -454,6 +454,7 @@
7,
loadingMock.getDefaultsPackageContent(),
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
this.visitor = getSkyframeExecutor().pkgLoader();
scratch.file("a/BUILD", "subinclude('//b:c/d/foo')");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 089d6a4..23f7171 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -17,6 +17,7 @@
import static org.junit.Assert.assertFalse;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
@@ -28,15 +29,13 @@
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
-
+import java.util.Collection;
+import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import java.util.Collection;
-import java.util.UUID;
-
/**
* Tests for the hash code calculated for Skylark RuleClasses based on the transitive closure
* of the imports of their respective definition SkylarkEnvironments.
@@ -164,6 +163,7 @@
7,
"",
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
SkyKey pkgLookupKey = PackageValue.key(PackageIdentifier.parse("@//" + pkg));
EvaluationResult<PackageValue> result =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
index 838302f..78100f7 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.fail;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
@@ -30,14 +31,12 @@
import com.google.devtools.build.skyframe.ErrorInfo;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
-
+import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import java.util.UUID;
-
/**
* Tests for SkylarkImportLookupFunction.
*/
@@ -55,6 +54,7 @@
7,
"",
UUID.randomUUID(),
+ ImmutableMap.of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 0a2c7dd..a8ffdfe 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -195,6 +195,7 @@
evaluationProgressReceiver);
final SequentialBuildDriver driver = new SequentialBuildDriver(evaluator);
PrecomputedValue.BUILD_ID.set(differencer, UUID.randomUUID());
+ PrecomputedValue.CLIENT_ENV.set(differencer, ImmutableMap.<String, String>of());
PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
return new Builder() {
diff --git a/src/test/shell/integration/action_env_test.sh b/src/test/shell/integration/action_env_test.sh
index 24e87ee..156473b 100755
--- a/src/test/shell/integration/action_env_test.sh
+++ b/src/test/shell/integration/action_env_test.sh
@@ -72,4 +72,52 @@
expect_log "FOO=client_foo"
}
+function test_redo_action() {
+ export FOO=initial_foo
+ export UNRELATED=some_value
+ bazel build --action_env=FOO pkg:showenv || fail "bazel build showenv failed"
+ cat `bazel info bazel-genfiles`/pkg/env.txt > $TEST_log
+ expect_log "FOO=initial_foo"
+
+ # If an unrelated value changes, we expect the action not to be executed again
+ export UNRELATED=some_other_value
+ bazel build --action_env=FOO pkg:showenv 2> $TEST_log \
+ || fail "bazel build showenv failed"
+ expect_log "Critical Path: 0.00s"
+
+ # However, if a used variable changes, we expect the change to be propagated
+ export FOO=changed_foo
+ bazel build --action_env=FOO pkg:showenv || fail "bazel build showenv failed"
+ cat `bazel info bazel-genfiles`/pkg/env.txt > $TEST_log
+ expect_log "FOO=changed_foo"
+
+ # But repeating the build with no further changes, no action should happen
+ bazel build --action_env=FOO pkg:showenv 2> $TEST_log \
+ || fail "bazel build showenv failed"
+ expect_log "Critical Path: 0.00s"
+
+}
+
+function test_latest_wins_arg() {
+ export FOO=bar
+ export BAR=baz
+ bazel build --action_env=BAR --action_env=FOO --action_env=FOO=foo \
+ pkg:showenv || fail "bazel build showenv failed"
+ cat `bazel info bazel-genfiles`/pkg/env.txt > $TEST_log
+ expect_log "FOO=foo"
+ expect_log "BAR=baz"
+ expect_not_log "FOO=bar"
+}
+
+function test_latest_wins_env() {
+ export FOO=bar
+ export BAR=baz
+ bazel build --action_env=BAR --action_env=FOO=foo --action_env=FOO \
+ pkg:showenv || fail "bazel build showenv failed"
+ cat `bazel info bazel-genfiles`/pkg/env.txt > $TEST_log
+ expect_log "FOO=bar"
+ expect_log "BAR=baz"
+ expect_not_log "FOO=foo"
+}
+
run_suite "Tests for bazel's handling of environment variables in actions"