diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java index 48c7f60466cb55..422cb5af577b60 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java @@ -237,6 +237,8 @@ public void beforeCommand(CommandEnvironment env) { RepositoryOptions repoOptions = env.getOptions().getOptions(RepositoryOptions.class); if (repoOptions != null) { + downloadManager.setDisableDownload(repoOptions.disableDownload); + repositoryCache.setHardlink(repoOptions.useHardlinks); if (repoOptions.experimentalScaleTimeouts > 0.0) { starlarkRepositoryFunction.setTimeoutScaling(repoOptions.experimentalScaleTimeouts); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java index c1e3770bec5a98..44b93346666fcb 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java @@ -56,6 +56,15 @@ public class RepositoryOptions extends OptionsBase { + " cache hit, rather than copying. This is intended to save disk space.") public boolean useHardlinks; + @Option( + name = "experimental_repository_disable_download", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.BAZEL_CLIENT_OPTIONS, + effectTags = {OptionEffectTag.UNKNOWN}, + metadataTags = {OptionMetadataTag.EXPERIMENTAL}, + help = "If set, downloading external repositories is not allowed.") + public boolean disableDownload; + @Option( name = "distdir", oldName = "experimental_distdir", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloadManager.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloadManager.java index 26243acecdbb04..9e9b1fb87bad0c 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloadManager.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/DownloadManager.java @@ -46,6 +46,7 @@ public class DownloadManager { private List distdir = ImmutableList.of(); private UrlRewriter rewriter; private final Downloader downloader; + private boolean disableDownload = false; public DownloadManager(RepositoryCache repositoryCache, Downloader downloader) { this.repositoryCache = repositoryCache; @@ -60,6 +61,10 @@ public void setUrlRewriter(UrlRewriter rewriter) { this.rewriter = rewriter; } + public void setDisableDownload(boolean disableDownload) { + this.disableDownload = disableDownload; + } + /** * Downloads file to disk and returns path. * @@ -194,6 +199,10 @@ public Path download( } } + if (disableDownload) { + throw new IOException(String.format("Failed to download repo %s: download is disabled.", repo)); + } + try { downloader.download( urls, authHeaders, checksum, canonicalId, destination, eventHandler, clientEnv, type); diff --git a/src/test/shell/bazel/starlark_repository_test.sh b/src/test/shell/bazel/starlark_repository_test.sh index 06da53d3246f44..086c6f1249b8e4 100755 --- a/src/test/shell/bazel/starlark_repository_test.sh +++ b/src/test/shell/bazel/starlark_repository_test.sh @@ -2061,4 +2061,92 @@ EOF || fail "Expected success despite needing a file behind basic auth" } +function test_disable_download_should_prevent_downloading() { + mkdir x + echo 'exports_files(["file.txt"])' > x/BUILD + echo 'Hello World' > x/file.txt + tar cvf x.tar x + sha256=$(sha256sum x.tar | head -c 64) + serve_file x.tar + + mkdir main + cd main + cat > WORKSPACE < BUILD <<'EOF' +genrule( + name = "it", + srcs = ["@ext//x:file.txt"], + outs = ["it.txt"], + cmd = "cp $< $@", +) +EOF + + bazel build --experimental_repository_disable_download //:it > "${TEST_log}" 2>&1 \ + && fail "Expected failure" || : + expect_log "Failed to download repo ext: download is disabled" +} + +function test_disable_download_should_allow_distdir() { + mkdir x + echo 'exports_files(["file.txt"])' > x/BUILD + echo 'Hello World' > x/file.txt + tar cvf x.tar x + sha256=$(sha256sum x.tar | head -c 64) + + mkdir main + cp x.tar main + cd main + cat > WORKSPACE < BUILD <<'EOF' +genrule( + name = "it", + srcs = ["@ext//x:file.txt"], + outs = ["it.txt"], + cmd = "cp $< $@", +) +EOF + + bazel build --distdir="." --experimental_repository_disable_download //:it || fail "Failed to build" +} + +function test_disable_download_should_allow_local_repository() { + mkdir x + echo 'exports_files(["file.txt"])' > x/BUILD + echo 'Hello World' > x/file.txt + touch x/WORKSPACE + + mkdir main + cd main + cat > WORKSPACE < BUILD <<'EOF' +genrule( + name = "it", + srcs = ["@ext//:file.txt"], + outs = ["it.txt"], + cmd = "cp $< $@", +) +EOF + + bazel build --experimental_repository_disable_download //:it || fail "Failed to build" +} + run_suite "local repository tests"