diff options
author | Damien Martin-Guillerez <dmarting@google.com> | 2017-02-08 17:22:02 +0000 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2017-02-08 17:50:55 +0000 |
commit | 777f3afea4195e094d45bdfc317b236146117ff7 (patch) | |
tree | 98d58442dc08e35a66370795ec67a53574985732 /src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java | |
parent | f5bb3d248ff1dd9e5157551bbf5052c61a7643ce (diff) |
Introduce a Skyframe function: ActionEnvironmentFunction
ActionEnvironmentFunction returns the list of environment
variable with the one overwritten by --action_env being
replaced. This let other Skyframe function declares
dependency to any value of the environment and being
influenced by the --action_env flag.
This will be used to declare dependency of remote repositories
on environment variables (step 3 of
https://bazel.build/designs/2016/10/18/repository-invalidation.html)
--
Change-Id: I1ed3fb6f48e8e17d4d64c903fccecb6ed7596350
Reviewed-on: https://cr.bazel.build/7974
PiperOrigin-RevId: 146918603
MOS_MIGRATED_REVID=146918603
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java | 78 |
1 files changed, 78 insertions, 0 deletions
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 new file mode 100644 index 0000000000..ea4cde03df --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java @@ -0,0 +1,78 @@ +// Copyright 2017 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.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.annotation.Nullable; + +/** + * Skyframe function that provides the effective value for a client environment variable. This will + * either be the value coming from the default client environment, or the value coming from the + * --action_env flag, if the variable's value is explicitly set. + */ +public final class ActionEnvironmentFunction implements SkyFunction { + + @Nullable + @Override + public String extractTag(SkyKey skyKey) { + return null; + } + + @Nullable + @Override + public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException { + Map<String, String> actionEnv = PrecomputedValue.ACTION_ENV.get(env); + String key = (String) skyKey.argument(); + if (actionEnv.containsKey(key) && actionEnv.get(key) != null) { + return new ClientEnvironmentValue(actionEnv.get(key)); + } + return env.getValue(SkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, key)); + } + + /** @return the SkyKey to invoke this function for the environment variable {@code variable}. */ + public static SkyKey key(String variable) { + return SkyKey.create(SkyFunctions.ACTION_ENVIRONMENT_VARIABLE, variable); + } + + /** + * Returns a map of environment variable key => values, getting them from Skyframe. Returns null + * if and only if some dependencies from Skyframe still need to be resolved. + */ + public static Map<String, String> getEnvironmentView(Environment env, Iterable<String> keys) + throws InterruptedException { + ImmutableList.Builder<SkyKey> skyframeKeysBuilder = ImmutableList.builder(); + for (String key : keys) { + skyframeKeysBuilder.add(key(key)); + } + ImmutableList<SkyKey> skyframeKeys = skyframeKeysBuilder.build(); + Map<SkyKey, SkyValue> values = env.getValues(skyframeKeys); + if (env.valuesMissing()) { + return null; + } + // To return the initial order and support null values, we use a LinkedHashMap. + LinkedHashMap<String, String> result = new LinkedHashMap<>(); + for (SkyKey key : skyframeKeys) { + ClientEnvironmentValue value = (ClientEnvironmentValue) values.get(key); + result.put(key.argument().toString(), value.getValue()); + } + return Collections.unmodifiableMap(result); + } +} |