diff options
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" |