Clear marker file on repository override

Bazel internally uses a marker file to check if the definition
of an external repository has changed. If an external repository
is overridden by a command-line flag, we cannot just keep the
old marker file, as on the next call without the override, the
effect of the override has to be undone. Therefore, clear the
marker file, if an override is active for the given repository.

Fixes #8543.

Change-Id: I775791c45da9321619b6dc2c7477c645852a6f99
PiperOrigin-RevId: 262086344
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
index cb4bbce..2c51e56 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
@@ -148,6 +148,7 @@
         .getRelative(repositoryName.strippedName());
 
     if (Preconditions.checkNotNull(overrides).containsKey(repositoryName)) {
+      DigestWriter.clearMarkerFile(directories, repositoryName);
       return setupOverride(overrides.get(repositoryName), env, repoRoot);
     }
 
@@ -506,6 +507,15 @@
       return RepositoryFunction.getExternalRepositoryDirectory(directories)
           .getChild("@" + ruleName + ".marker");
     }
+
+    static void clearMarkerFile(BlazeDirectories directories, RepositoryName repoName)
+        throws RepositoryFunctionException {
+      try {
+        getMarkerPath(directories, repoName.strippedName()).delete();
+      } catch (IOException e) {
+        throw new RepositoryFunctionException(e, Transience.TRANSIENT);
+      }
+    }
   }
 
   private class RepositoryFetching implements FetchProgress {
diff --git a/src/test/shell/bazel/workspace_test.sh b/src/test/shell/bazel/workspace_test.sh
index 67d9ac6..1da0978 100755
--- a/src/test/shell/bazel/workspace_test.sh
+++ b/src/test/shell/bazel/workspace_test.sh
@@ -288,6 +288,54 @@
 
 }
 
+function test_workspace_override_starlark(){
+  mkdir -p original
+  create_workspace_with_default_repos original/WORKSPACE
+  cat > original/BUILD <<'EOF'
+genrule(
+    name = "gen",
+    cmd = "echo 'original' > $@",
+    outs = ["gen.out"],
+)
+EOF
+  tar cvf original.tar original
+  rm -rf original
+
+  mkdir -p override
+  create_workspace_with_default_repos override/WORKSPACE
+  cat > override/BUILD <<'EOF'
+genrule(
+    name = "gen",
+    cmd = "echo 'override' > $@",
+    outs = ["gen.out"],
+)
+EOF
+
+  cat >> $(create_workspace_with_default_repos WORKSPACE) <<EOF
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+    name = "o",
+    url = "file://$PWD/original.tar",
+    strip_prefix = "original",
+)
+EOF
+  bazel build --override_repository="o=$PWD/override" @o//:gen &> $TEST_log \
+    || fail "Expected build to succeed"
+  assert_contains "override" bazel-genfiles/external/o/gen.out
+
+  bazel build @o//:gen &> $TEST_log \
+    || fail "Expected build to succeed"
+  assert_contains "original" bazel-genfiles/external/o/gen.out
+
+  bazel build --override_repository="o=$PWD/override" @o//:gen &> $TEST_log \
+    || fail "Expected build to succeed"
+  assert_contains "override" bazel-genfiles/external/o/gen.out
+
+  bazel build @o//:gen &> $TEST_log \
+    || fail "Expected build to succeed"
+  assert_contains "original" bazel-genfiles/external/o/gen.out
+}
+
 function test_workspace_addition_change() {
   mkdir -p repo_one
   mkdir -p repo_two