Fix using load statement on git_repository with strip_prefix Prevent git_repository from creating directory outside of its repository root while implementing strip_prefix. Fixes https://github.com/bazelbuild/bazel/issues/10062 Closes #12539. PiperOrigin-RevId: 344216891
diff --git a/src/test/shell/bazel/git_repository_test.sh b/src/test/shell/bazel/git_repository_test.sh index b3ad02d..4d352a2 100755 --- a/src/test/shell/bazel/git_repository_test.sh +++ b/src/test/shell/bazel/git_repository_test.sh
@@ -78,10 +78,12 @@ cp "$(rlocation io_bazel/src/test/shell/bazel/testdata/pluto-repo.tar.gz)" $repos_dir cp "$(rlocation io_bazel/src/test/shell/bazel/testdata/outer-planets-repo.tar.gz)" $repos_dir cp "$(rlocation io_bazel/src/test/shell/bazel/testdata/refetch-repo.tar.gz)" $repos_dir + cp "$(rlocation io_bazel/src/test/shell/bazel/testdata/strip-prefix-repo.tar.gz)" $repos_dir cd $repos_dir tar zxf pluto-repo.tar.gz tar zxf outer-planets-repo.tar.gz tar zxf refetch-repo.tar.gz + tar zxf strip-prefix-repo.tar.gz } # Test cloning a Git repository using the git_repository rule. @@ -481,4 +483,33 @@ expect_log "Exactly one of commit" } +# Verifies that load statement works while using strip_prefix. +# +# This test uses the strip-prefix Git repository, which contains the +# following files: +# +# strip-prefix +# └── prefix-foo +# ├── BUILD +# ├── WORKSPACE +# └── defs.bzl +function test_git_repository_with_strip_prefix_for_load_statement() { + setup_error_test + local strip_prefix_repo_dir=$TEST_TMPDIR/repos/strip-prefix + + cd $WORKSPACE_DIR + cat >> $(create_workspace_with_default_repos WORKSPACE) <<EOF +load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") +git_repository( + name = "foo", + remote = "$strip_prefix_repo_dir", + commit = "f8167a60de4460e89601724fb13b4fc505da3f3d", + strip_prefix = "prefix-foo", +) +load("@foo//:defs.bzl", "FOO") +EOF + + bazel info >& $TEST_log || fail "Expect bazel info to succeed." +} + run_suite "git_repository tests"
diff --git a/src/test/shell/bazel/testdata/BUILD b/src/test/shell/bazel/testdata/BUILD index 0b1caf6..ac54260 100644 --- a/src/test/shell/bazel/testdata/BUILD +++ b/src/test/shell/bazel/testdata/BUILD
@@ -11,6 +11,7 @@ "outer-planets-repo.tar.gz", "pluto-repo.tar.gz", "refetch-repo.tar.gz", + "strip-prefix-repo.tar.gz", ], visibility = ["//src/test/shell/bazel:__pkg__"], )
diff --git a/src/test/shell/bazel/testdata/README.md b/src/test/shell/bazel/testdata/README.md index a187d0c..7a4e673 100644 --- a/src/test/shell/bazel/testdata/README.md +++ b/src/test/shell/bazel/testdata/README.md
@@ -11,13 +11,15 @@ * outer-planets-repo.tar.gz * pluto-repo.tar.gz * refetch-repo.tar.gz +* strip-prefix.tar.gz For reference, the following files contain the output of `git log -p --decorate` -for the two repositories: +for the four repositories: * outer-planets.git_log * pluto.git_log * refetch.git_log +* strip-prefix.git_log These files were created by manually creating a git repository and tarring up the result using `tar -zcvf`.
diff --git a/src/test/shell/bazel/testdata/strip-prefix-repo.tar.gz b/src/test/shell/bazel/testdata/strip-prefix-repo.tar.gz new file mode 100644 index 0000000..206c015 --- /dev/null +++ b/src/test/shell/bazel/testdata/strip-prefix-repo.tar.gz Binary files differ
diff --git a/src/test/shell/bazel/testdata/strip-prefix.git_log b/src/test/shell/bazel/testdata/strip-prefix.git_log new file mode 100644 index 0000000..153900b --- /dev/null +++ b/src/test/shell/bazel/testdata/strip-prefix.git_log
@@ -0,0 +1,19 @@ +commit f8167a60de4460e89601724fb13b4fc505da3f3d (HEAD -> main) +Author: Yun Peng <pcloudy@google.com> +Date: Mon Nov 23 17:31:04 2020 +0100 + + First commit + +diff --git a/prefix-foo/BUILD b/prefix-foo/BUILD +new file mode 100644 +index 0000000..e69de29 +diff --git a/prefix-foo/WORKSPACE b/prefix-foo/WORKSPACE +new file mode 100644 +index 0000000..e69de29 +diff --git a/prefix-foo/defs.bzl b/prefix-foo/defs.bzl +new file mode 100644 +index 0000000..3563ad1 +--- /dev/null ++++ b/prefix-foo/defs.bzl +@@ -0,0 +1 @@ ++FOO=123
diff --git a/tools/build_defs/repo/git.bzl b/tools/build_defs/repo/git.bzl index 4d02ae8..d362cda 100644 --- a/tools/build_defs/repo/git.bzl +++ b/tools/build_defs/repo/git.bzl
@@ -31,7 +31,7 @@ root = ctx.path(".") directory = str(root) if ctx.attr.strip_prefix: - directory = directory + "-tmp" + directory = root.get_child(".tmp_git_root") git_ = git_repo(ctx, directory) @@ -39,8 +39,8 @@ dest_link = "{}/{}".format(directory, ctx.attr.strip_prefix) if not ctx.path(dest_link).exists: fail("strip_prefix at {} does not exist in repo".format(ctx.attr.strip_prefix)) - ctx.delete(root) - ctx.symlink(dest_link, root) + for item in ctx.path(dest_link).readdir(): + ctx.symlink(item, root.get_child(item.basename)) return {"commit": git_.commit, "shallow_since": git_.shallow_since}