From f1e46c3f142c0665f90119996f0ebb8048dfb0c7 Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Mon, 28 Oct 2024 12:46:49 +0000 Subject: [PATCH] fix: detect both `WORKSPACE` and `REPO.bazel` in repositories When a repository label is passed, we validate that it **is** a repository by checking for `REPO.bazel`. To support back to `7.0.0` we can check for both `WORKSPACE` _and_ `REPO.bazel`. --- MODULE.bazel | 2 +- toolchain/export/symlink/repository.bzl | 12 ++++++------ toolchain/local/select/repository.bzl | 13 ++++++------- toolchain/repository/BUILD.bazel | 0 toolchain/repository/root.bzl | 14 ++++++++++++++ 5 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 toolchain/repository/BUILD.bazel create mode 100644 toolchain/repository/root.bzl diff --git a/MODULE.bazel b/MODULE.bazel index 843dd77..ddfaaaa 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,7 +2,7 @@ module( name = "toolchain_utils", version = "0.0.0", bazel_compatibility = [ - ">=7.1.0", + ">=7.0.0", ], ) diff --git a/toolchain/export/symlink/repository.bzl b/toolchain/export/symlink/repository.bzl index 672e4ea..a9dcbc9 100644 --- a/toolchain/export/symlink/repository.bzl +++ b/toolchain/export/symlink/repository.bzl @@ -1,3 +1,5 @@ +load("//toolchain/repository:root.bzl", "root") + visibility("//toolchain/export/...") DOC = "Symlinks a repository to another." @@ -11,13 +13,11 @@ ATTRS = { def implementation(rctx): label = rctx.attr.target - workspace = label.relative(":REPO.bazel") - path = rctx.path(workspace) - if not path.exists: - fail("Failed to find `{}`, can only symlink repository labels.".format(path, label)) - target = path.dirname + path = root(rctx, label) + if not path: + fail("Can only symlink repository labels.".format(label)) rctx.delete(".") - rctx.symlink(target, ".") + rctx.symlink(path, ".") symlink = repository_rule( doc = DOC, diff --git a/toolchain/local/select/repository.bzl b/toolchain/local/select/repository.bzl index 4597e5c..57258bb 100644 --- a/toolchain/local/select/repository.bzl +++ b/toolchain/local/select/repository.bzl @@ -1,3 +1,4 @@ +load("//toolchain/repository:root.bzl", "root") load("//toolchain:separator.bzl", "SEPARATOR") load(":resolve.bzl", resolve = "key") @@ -34,19 +35,17 @@ toolchian_local_select( def canonical(rctx, label): prefix = SEPARATOR.join(rctx.name.split(SEPARATOR)[:-1]) - return "@@{}{}{}".format(prefix, SEPARATOR, label.removeprefix("@")) + return Label("@@{}{}{}".format(prefix, SEPARATOR, label.removeprefix("@"))) def implementation(rctx): label = resolve(rctx.attr.map, no_match_error = rctx.attr.no_match_error) canon = canonical(rctx, label) - workspace = Label("{}//:REPO.bazel".format(canon)) - path = rctx.path(workspace) - - if not path.exists: - fail("Missing `{}` for `{}`: {}".format(canon, rctx.name, path)) + path = root(rctx, canon) + if not path: + fail("Missing `{}` for `{}`".format(canon, rctx.name)) rctx.delete(".") - rctx.symlink(path.dirname, ".") + rctx.symlink(path, ".") select = repository_rule( doc = DOC, diff --git a/toolchain/repository/BUILD.bazel b/toolchain/repository/BUILD.bazel new file mode 100644 index 0000000..e69de29 diff --git a/toolchain/repository/root.bzl b/toolchain/repository/root.bzl new file mode 100644 index 0000000..b3a0b4a --- /dev/null +++ b/toolchain/repository/root.bzl @@ -0,0 +1,14 @@ +visibility("//...") + +def root(rctx, label): + workspace = label.relative("WORKSPACE") + path = rctx.path(workspace) + if path.exists: + return path.dirname + + repo = label.relative("REPO.bazel") + path = rctx.path(repo) + if path.exists: + return path.dirname + + return None -- GitLab