aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirengrig <ichern@google.com>2020-02-27 19:29:45 +0100
committerGitHub <noreply@github.com>2020-02-27 13:29:45 -0500
commit6970e21d290ceaa36502d0c94533b26e5ec18c0b (patch)
tree5eddd92ab8d35047c0676d7cbc00e22951bb85b3
parentadd8e42934d1bf63ecf27f5439574383e74ef8fc (diff)
downloadbazel-skylib-6970e21d290ceaa36502d0c94533b26e5ec18c0b.tar.gz
Create a helper rule for selecting a file from outputs of another rul… (#233)
* Create a helper rule for selecting a file from outputs of another rule or a filegroup by subpath * Add tests * Address code review comments * + formatting Co-authored-by: c-parsons <cparsons@google.com>
-rw-r--r--rules/select_file.bzl40
-rw-r--r--tests/select_file/BUILD34
-rw-r--r--tests/select_file/select_me.txt1
-rw-r--r--tests/select_file/subdir/inner.txt1
4 files changed, 76 insertions, 0 deletions
diff --git a/rules/select_file.bzl b/rules/select_file.bzl
new file mode 100644
index 0000000..0ae08fa
--- /dev/null
+++ b/rules/select_file.bzl
@@ -0,0 +1,40 @@
+"""
+select_file() build rule implementation.
+
+Selects a single file from the outputs of some target by given relative path.
+"""
+
+def _impl(ctx):
+ if ctx.attr.subpath and len(ctx.attr.subpath) == 0:
+ fail("Subpath can not be empty.")
+
+ out = None
+ canonical = ctx.attr.subpath.replace("\\", "/")
+ for file_ in ctx.attr.srcs.files.to_list():
+ if file_.path.replace("\\", "/").endswith(canonical):
+ out = file_
+ break
+ if not out:
+ files_str = ",\n".join([
+ str(f.path)
+ for f in ctx.attr.srcs.files.to_list()
+ ])
+ fail("Can not find specified file in [%s]" % files_str)
+ return [DefaultInfo(files = depset([out]))]
+
+select_file = rule(
+ implementation = _impl,
+ doc = "Selects a single file from the outputs of some target \
+by given relative path",
+ attrs = {
+ "srcs": attr.label(
+ allow_files = True,
+ mandatory = True,
+ doc = "The target producing the file among other outputs",
+ ),
+ "subpath": attr.string(
+ mandatory = True,
+ doc = "Relative path to the file",
+ ),
+ },
+)
diff --git a/tests/select_file/BUILD b/tests/select_file/BUILD
new file mode 100644
index 0000000..e795502
--- /dev/null
+++ b/tests/select_file/BUILD
@@ -0,0 +1,34 @@
+load("//rules:select_file.bzl", "select_file")
+load("//rules:diff_test.bzl", "diff_test")
+
+filegroup(
+ name = "fg",
+ srcs = [
+ "subdir/inner.txt",
+ ":select_me.txt",
+ ],
+)
+
+select_file(
+ name = "select_me",
+ srcs = ":fg",
+ subpath = "select_me.txt",
+)
+
+select_file(
+ name = "select_inner",
+ srcs = ":fg",
+ subpath = "subdir/inner.txt",
+)
+
+diff_test(
+ name = "selected_me",
+ file1 = ":select_me",
+ file2 = ":select_me.txt",
+)
+
+diff_test(
+ name = "selected_inner",
+ file1 = ":select_inner",
+ file2 = "subdir/inner.txt",
+)
diff --git a/tests/select_file/select_me.txt b/tests/select_file/select_me.txt
new file mode 100644
index 0000000..4221a1e
--- /dev/null
+++ b/tests/select_file/select_me.txt
@@ -0,0 +1 @@
+Outer
diff --git a/tests/select_file/subdir/inner.txt b/tests/select_file/subdir/inner.txt
new file mode 100644
index 0000000..d87e45a
--- /dev/null
+++ b/tests/select_file/subdir/inner.txt
@@ -0,0 +1 @@
+Inner