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}