aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-23 15:20:59 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-23 22:16:50 +0000
commitda88192f91398de4a683ed292ff22f287d63241f (patch)
tree8e160a130a377695323635f5fda0540a6c86b6e5 /src/main/java/com/google/devtools
parent1ba4a643b39f6781e8674d39af6a705aa3810bc5 (diff)
Implements repository_ctx.os
repository_ctx.os gives access to os related information: - .system returns the name of the current platform. - .environ returns the list of environment variables. Issue #893: Step 4 of http://goo.gl/OZV3o0. See http://goo.gl/fD4ZsY. -- MOS_MIGRATED_REVID=115337406
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java17
5 files changed, 95 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index c9ed05fb45..8a1eb0da79 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -601,6 +601,7 @@ java_library(
":concurrent",
":events",
":maven-connector",
+ ":runtime",
":util",
"//src/java_tools/singlejar/java/com/google/devtools/build/zip",
"//src/main/java/com/google/devtools/build/lib:build-base",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
index dab80039c6..5e16483f6a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
@@ -55,8 +55,11 @@ import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
import com.google.devtools.build.lib.rules.repository.RepositoryLoaderFunction;
import com.google.devtools.build.lib.runtime.BlazeCommand;
import com.google.devtools.build.lib.runtime.BlazeModule;
+import com.google.devtools.build.lib.runtime.Command;
+import com.google.devtools.build.lib.runtime.CommandEnvironment;
import com.google.devtools.build.lib.skyframe.SkyFunctions;
import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker;
+import com.google.devtools.build.lib.util.AbruptExitException;
import com.google.devtools.build.lib.util.Clock;
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.skyframe.SkyFunction;
@@ -79,6 +82,8 @@ public class BazelRepositoryModule extends BlazeModule {
// A map of repository handlers that can be looked up by rule class name.
private final ImmutableMap<String, RepositoryFunction> repositoryHandlers;
private final AtomicBoolean isFetch = new AtomicBoolean(false);
+ private final SkylarkRepositoryFunction skylarkRepositoryFunction =
+ new SkylarkRepositoryFunction();
public BazelRepositoryModule() {
repositoryHandlers =
@@ -177,8 +182,13 @@ public class BazelRepositoryModule extends BlazeModule {
builder.put(
SkyFunctions.REPOSITORY_DIRECTORY,
new RepositoryDelegatorFunction(
- directories, repositoryHandlers, new SkylarkRepositoryFunction(), isFetch));
+ directories, repositoryHandlers, skylarkRepositoryFunction, isFetch));
builder.put(MavenServerFunction.NAME, new MavenServerFunction(directories));
return builder.build();
}
+
+ @Override
+ public void beforeCommand(Command command, CommandEnvironment env) throws AbruptExitException {
+ skylarkRepositoryFunction.setCommandEnvironment(env);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java
new file mode 100644
index 0000000000..fd51059137
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkOS.java
@@ -0,0 +1,53 @@
+// Copyright 2016 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.bazel.repository.skylark;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+
+import java.util.Map;
+
+/**
+ * A Skylark structure to deliver information about the system we are running on.
+ */
+@Immutable
+@SkylarkModule(
+ name = "repository_os",
+ doc = "Various data about the current platform Bazel is running on."
+)
+final class SkylarkOS {
+
+ private final ImmutableMap<String, String> environ;
+
+ SkylarkOS(Map<String, String> environ) {
+ this.environ = ImmutableMap.copyOf(environ);
+ }
+
+ @SkylarkCallable(name = "environ", structField = true, doc = "The list of environment variables.")
+ public ImmutableMap<String, String> getEnviron() {
+ return environ;
+ }
+
+ @SkylarkCallable(
+ name = "name",
+ structField = true,
+ doc = "A string identifying the current system Bazel is running on."
+ )
+ public String getName() {
+ return System.getProperty("os.name").toLowerCase();
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
index b51b01c9cb..04a868b9d0 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
@@ -35,6 +35,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
import java.io.File;
import java.io.IOException;
import java.util.List;
+import java.util.Map;
/**
* Skylark API for the repository_rule's context.
@@ -52,6 +53,7 @@ public class SkylarkRepositoryContext {
private final Rule rule;
private final Path outputDirectory;
private final SkylarkClassObject attrObject;
+ private final SkylarkOS osObject;
/**
* In native code, private values start with $. In Skylark, private values start with _, because
@@ -65,12 +67,12 @@ public class SkylarkRepositoryContext {
}
/**
- * Create a new context (ctx) object for a skylark repository rule ({@code rule} argument). The
- * environment
+ * Create a new context (ctx) object for a skylark repository rule ({@code rule} argument).
*/
- SkylarkRepositoryContext(Rule rule, Path outputDirectory) {
+ SkylarkRepositoryContext(Rule rule, Path outputDirectory, Map<String, String> env) {
this.rule = rule;
this.outputDirectory = outputDirectory;
+ this.osObject = new SkylarkOS(env);
AggregatingAttributeMapper attrs = AggregatingAttributeMapper.of(rule);
ImmutableMap.Builder<String, Object> attrBuilder = new ImmutableMap.Builder<>();
for (String name : attrs.getAttributeNames()) {
@@ -132,6 +134,15 @@ public class SkylarkRepositoryContext {
}
@SkylarkCallable(
+ name = "os",
+ structField = true,
+ doc = "A struct to access information from the system "
+ )
+ public SkylarkOS getOS() {
+ return osObject;
+ }
+
+ @SkylarkCallable(
name = "execute",
doc =
"Executes the command given by the list of arguments. The execution time of the command"
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 51bbe832f3..9c9a777610 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
+import com.google.devtools.build.lib.runtime.CommandEnvironment;
import com.google.devtools.build.lib.skyframe.FileValue;
import com.google.devtools.build.lib.syntax.BaseFunction;
import com.google.devtools.build.lib.syntax.EvalException;
@@ -32,6 +33,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
import com.google.devtools.build.skyframe.SkyValue;
import java.io.IOException;
+import java.util.Map;
import javax.annotation.Nullable;
@@ -39,6 +41,19 @@ import javax.annotation.Nullable;
* A repository function to delegate work done by skylark remote repositories.
*/
public class SkylarkRepositoryFunction extends RepositoryFunction {
+
+ private CommandEnvironment commandEnvironment = null;
+
+ public void setCommandEnvironment(CommandEnvironment commandEnvironment) {
+ this.commandEnvironment = commandEnvironment;
+ }
+
+ private Map<String, String> getClientEnvironment() {
+ return commandEnvironment != null
+ ? commandEnvironment.getClientEnv()
+ : ImmutableMap.<String, String>of();
+ }
+
@Nullable
@Override
public SkyValue fetch(Rule rule, Path outputDirectory, Environment env)
@@ -52,7 +67,7 @@ public class SkylarkRepositoryFunction extends RepositoryFunction {
.setEventHandler(env.getListener())
.build();
SkylarkRepositoryContext skylarkRepositoryContext =
- new SkylarkRepositoryContext(rule, outputDirectory);
+ new SkylarkRepositoryContext(rule, outputDirectory, getClientEnvironment());
// This has side-effect, we don't care about the output.
// Also we do a lot of stuff in there, maybe blocking operations and we should certainly make
// it possible to return null and not block but it doesn't seem to be easy with Skylark