Track `getenv` calls in module extensions
Fixes #22404
RELNOTES: Changes to environment variables read via `getenv` now correctly invalidate module extensions.
Closes #22498.
PiperOrigin-RevId: 637058337
Change-Id: Id4aaa4155a728452472eedae4a59c8d29456e512
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java
index 0ee0f67..7e59884 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java
@@ -27,6 +27,7 @@
import com.google.devtools.build.skyframe.SkyValue;
import com.google.devtools.build.skyframe.SkyframeLookupResult;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
@@ -87,15 +88,16 @@
* if and only if some dependencies from Skyframe still need to be resolved.
*/
@Nullable
- public static ImmutableMap<String, String> getEnvironmentView(Environment env, Set<String> keys)
- throws InterruptedException {
+ public static ImmutableMap<String, Optional<String>> getEnvironmentView(
+ Environment env, Set<String> keys) throws InterruptedException {
var skyframeKeys = keys.stream().map(ActionEnvironmentFunction::key).collect(toImmutableSet());
SkyframeLookupResult values = env.getValuesAndExceptions(skyframeKeys);
if (env.valuesMissing()) {
return null;
}
- ImmutableMap.Builder<String, String> result = ImmutableMap.builder();
+ ImmutableMap.Builder<String, Optional<String>> result =
+ ImmutableMap.builderWithExpectedSize(skyframeKeys.size());
for (SkyKey key : skyframeKeys) {
ClientEnvironmentValue value = (ClientEnvironmentValue) values.get(key);
if (value == null) {
@@ -104,9 +106,7 @@
"ClientEnvironmentValue " + key + " was missing, this should never happen"));
return null;
}
- if (value.getValue() != null) {
- result.put(key.argument().toString(), value.getValue());
- }
+ result.put(key.argument().toString(), Optional.ofNullable(value.getValue()));
}
return result.buildOrThrow();
}