aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Runtime.java8
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java16
-rwxr-xr-xsrc/test/shell/bazel/local_repository_test.sh21
5 files changed, 41 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 0ce234dcee..3b20a1327e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -1336,7 +1336,8 @@ public final class PackageFactory {
PackageContext context = new PackageContext(pkgBuilder, globber, eventHandler);
buildPkgEnv(pkgEnv, context, ruleFactory);
pkgEnv.setupDynamic(PKG_CONTEXT, context);
- pkgEnv.setupDynamic(Runtime.PKG_NAME, packageId.toString());
+ pkgEnv.setupDynamic(Runtime.PKG_NAME, packageId.getPackageFragment().getPathString());
+ pkgEnv.setupDynamic(Runtime.REPOSITORY_NAME, packageId.getRepository().toString());
if (containsError) {
pkgBuilder.setContainsErrors();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
index ab2b99ea71..e5e4771d9f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
@@ -146,7 +146,8 @@ public class ASTFileLookupFunction implements SkyFunction {
// the two below don't matter for extracting the ValidationEnvironment:
/*astFileContentHashCode=*/null,
/*importMap=*/null)
- .setupDynamic(Runtime.PKG_NAME, Runtime.NONE)));
+ .setupDynamic(Runtime.PKG_NAME, Runtime.NONE)
+ .setupDynamic(Runtime.REPOSITORY_NAME, Runtime.NONE)));
}
} else {
ast = BuildFileAST.parseBuildFile(path, fileSize, env.getListener(), false);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Runtime.java b/src/main/java/com/google/devtools/build/lib/syntax/Runtime.java
index ef008c37d7..754d9049e5 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Runtime.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Runtime.java
@@ -82,6 +82,14 @@ public final class Runtime {
+ "function is loaded), but not as a top level function call in the extension module.")
public static final String PKG_NAME = "PACKAGE_NAME";
+ @SkylarkSignature(name = "REPOSITORY_NAME", returnType = String.class,
+ doc = "The name of the repository the rule or build extension is called from. "
+ + "For example, in packages that are called into existence by the WORKSPACE stanza "
+ + "<code>local_repository(name='local', path=...)</code> it will be set to "
+ + "<code>@local</code>. In packages in the main repository, it will be empty. "
+ + "It can only be accessed in functions (transitively) called from BUILD files.")
+ public static final String REPOSITORY_NAME = "REPOSITORY_NAME";
+
/**
* Set up a given environment for supported class methods.
*/
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 2cb842c63c..4b1283e517 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -71,21 +71,21 @@ public class PackageFactoryApparatus {
/**
* Parses and evaluates {@code buildFile} and returns the resulting {@link Package} instance.
*/
- public Package createPackage(String packageName, Path buildFile)
- throws Exception {
- return createPackage(packageName, buildFile, eventHandler);
+ public Package createPackage(String packageName, Path buildFile) throws Exception {
+ return createPackage(PackageIdentifier.createInDefaultRepo(packageName), buildFile,
+ eventHandler);
}
/**
- * Parses and evaluates {@code buildFile} with custom {@code eventHandler} and returns the resulting
- * {@link Package} instance.
+ * Parses and evaluates {@code buildFile} with custom {@code eventHandler} and returns the
+ * resulting {@link Package} instance.
*/
- public Package createPackage(String packageName, Path buildFile, EventHandler reporter)
- throws Exception {
+ public Package createPackage(PackageIdentifier packageIdentifier, Path buildFile,
+ EventHandler reporter) throws Exception {
try {
Package pkg =
factory.createPackageForTesting(
- PackageIdentifier.createInDefaultRepo(packageName),
+ packageIdentifier,
buildFile,
getPackageLocator(),
reporter);
diff --git a/src/test/shell/bazel/local_repository_test.sh b/src/test/shell/bazel/local_repository_test.sh
index 519baf4395..afd8e30594 100755
--- a/src/test/shell/bazel/local_repository_test.sh
+++ b/src/test/shell/bazel/local_repository_test.sh
@@ -871,4 +871,25 @@ function test_recursive_wildcard_in_remote_repository() {
expect_not_log "@r//a/y/z:n"
}
+function test_package_name_constants() {
+ local r=$TEST_TMPDIR/r
+ rm -fr $r
+ mkdir -p $r/a
+ cat > $r/a/BUILD <<'EOF'
+genrule(
+ name = 'b',
+ srcs = [],
+ outs = ['bo'],
+ cmd = 'echo ' + REPOSITORY_NAME + ' ' + PACKAGE_NAME + ' > $@')
+EOF
+
+ cat > WORKSPACE <<EOF
+local_repository(name='r', path='$r')
+EOF
+
+ bazel build @r//a:b || fail "build failed"
+ cat bazel-genfiles/external/r/a/bo > $TEST_log
+ expect_log "@r a"
+}
+
run_suite "local repository tests"