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