Jason Michalski has uploaded a new change for review.
https://bazel-review.googlesource.com/4080
Change subject: Make the runfiles symlinks avaliable from skylark.
......................................................................
Make the runfiles symlinks avaliable from skylark.
This change allows skylark rules to access the symlinks and
root_symlinks fromt the default and data runfiles. Packaging rules such
as tar_pkg will be able to include symlinked runfiles afer this change.
Fixes: #1109
Change-Id: I221e4cabe8d3f7b555f4c3f0ae108a12474a2db5
---
M src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
M
src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
2 files changed, 76 insertions(+), 2 deletions(-)
diff --git
a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index 0de1b2d..c0088fa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -129,6 +129,12 @@
// equals to the third one if they are not the same instance (which they
almost never are)
//
// Goodnight, prince(ss)?, and sweet dreams.
+ @Immutable
+ @SkylarkModule(
+ name = "symlinkentry",
+ category = SkylarkModuleCategory.NONE,
+ doc = "An interface for a runfile symlink."
+ )
private static final class SymlinkEntry {
private final PathFragment path;
private final Artifact artifact;
@@ -138,10 +144,20 @@
this.artifact = artifact;
}
+ @SkylarkCallable(
+ name = "path",
+ doc = "Returns the symlink path",
+ structField = true
+ )
public PathFragment getPath() {
return path;
}
+ @SkylarkCallable(
+ name = "file",
+ doc = "Returns the file referenced by this symlink",
+ structField = true
+ )
public Artifact getArtifact() {
return artifact;
}
@@ -562,6 +578,7 @@
/**
* Returns the root symlinks.
*/
+ @SkylarkCallable(name = "root_symlinks", doc = "Returns the set of root
symlinks", structField = true)
public NestedSet<SymlinkEntry> getRootSymlinks() {
return rootSymlinks;
}
diff --git
a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index 5e5fb7d..49982a1 100644
---
a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++
b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -951,6 +951,29 @@
scratch.file("test/__init__.py");
scratch.file(
"test/rule.bzl",
+ "def symlink_impl(ctx):",
+ " symlinks = {",
+ " 'symlink_' + f.short_path: f",
+ " for f in getattr(ctx.attr.symlink, 'files', [])",
+ " }",
+ " root_symlinks = {",
+ " 'root_symlink_' + f.short_path: f",
+ " for f in getattr(ctx.attr.root_symlink, 'files', [])",
+ " }",
+ " runfiles = ctx.runfiles(",
+ " symlinks=symlinks,",
+ " root_symlinks=root_symlinks,",
+ " )",
+ " return struct(",
+ " runfiles=runfiles",
+ " )",
+ "symlink_rule = rule(",
+ " implementation = symlink_impl,",
+ " attrs = {",
+ " 'symlink': attr.label(allow_files=True),",
+ " 'root_symlink': attr.label(allow_files=True)",
+ " },",
+ ")",
"def _impl(ctx):",
" return",
"skylark_rule = rule(",
@@ -961,11 +984,15 @@
")");
scratch.file(
"test/BUILD",
- "load('/test/rule', 'skylark_rule')",
+ "load('/test/rule', 'skylark_rule', 'symlink_rule')",
"py_library(name = 'lib', srcs = ['a.py', 'b.py'])",
"skylark_rule(name = 'foo', dep = ':lib')",
"py_library(name = 'lib_with_init', srcs =
['a.py', 'b.py', '__init__.py'])",
- "skylark_rule(name = 'foo_with_init', dep = ':lib_with_init')");
+ "skylark_rule(name = 'foo_with_init', dep = ':lib_with_init')",
+ "symlink_rule(name = 'lib_with_symlink', symlink = ':a.py')",
+ "skylark_rule(name = 'foo_with_symlink', dep
= ':lib_with_symlink')",
+ "symlink_rule(name = 'lib_with_root_symlink', root_symlink
= ':a.py')",
+ "skylark_rule(name = 'foo_with_root_symlink', dep
= ':lib_with_root_symlink')");
SkylarkRuleContext ruleContext = createRuleContext("//test:foo");
Object filenames =
@@ -988,6 +1015,36 @@
assertThat(noEmptyFilenames).isInstanceOf(SkylarkList.class);
SkylarkList noEmptyFilenamesList = (SkylarkList) noEmptyFilenames;
assertThat(noEmptyFilenamesList).containsExactly().inOrder();
+
+ SkylarkRuleContext ruleWithSymlinkContext =
createRuleContext("//test:foo_with_symlink");
+ Object symlinkPaths =
+ evalRuleContextCode(
+ ruleWithSymlinkContext, "[str(s.path) for s in
ruleContext.attr.dep.data_runfiles.symlinks]");
+ assertThat(symlinkPaths).isInstanceOf(SkylarkList.class);
+ SkylarkList symlinkPathsList = (SkylarkList) symlinkPaths;
+
assertThat(symlinkPathsList).containsExactly("symlink_test/a.py").inOrder();
+
+ Object symlinkFilenames =
+ evalRuleContextCode(
+ ruleWithSymlinkContext, "[s.file.short_path for s in
ruleContext.attr.dep.data_runfiles.symlinks]");
+ assertThat(symlinkFilenames).isInstanceOf(SkylarkList.class);
+ SkylarkList symlinkFilenamesList = (SkylarkList) symlinkFilenames;
+
assertThat(symlinkFilenamesList).containsExactly("test/a.py").inOrder();
+
+ SkylarkRuleContext ruleWithRootSymlinkContext =
createRuleContext("//test:foo_with_root_symlink");
+ Object rootSymlinkPaths =
+ evalRuleContextCode(
+ ruleWithRootSymlinkContext, "[str(s.path) for s in
ruleContext.attr.dep.data_runfiles.root_symlinks]");
+ assertThat(rootSymlinkPaths).isInstanceOf(SkylarkList.class);
+ SkylarkList rootSymlinkPathsList = (SkylarkList) rootSymlinkPaths;
+
assertThat(rootSymlinkPathsList).containsExactly("root_symlink_test/a.py").inOrder();
+
+ Object rootSymlinkFilenames =
+ evalRuleContextCode(
+ ruleWithRootSymlinkContext, "[s.file.short_path for s in
ruleContext.attr.dep.data_runfiles.root_symlinks]");
+ assertThat(rootSymlinkFilenames).isInstanceOf(SkylarkList.class);
+ SkylarkList rootSymlinkFilenamesList = (SkylarkList)
rootSymlinkFilenames;
+
assertThat(rootSymlinkFilenamesList).containsExactly("test/a.py").inOrder();
}
@Test
--
To view, visit
https://bazel-review.googlesource.com/4080
To unsubscribe, visit
https://bazel-review.googlesource.com/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I221e4cabe8d3f7b555f4c3f0ae108a12474a2db5
Gerrit-PatchSet: 1
Gerrit-Project: bazel
Gerrit-Branch: master
Gerrit-Owner: Jason Michalski <
arm...@armooo.net>