aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jingwen Chen <jingwen@google.com>2016-10-19 14:36:44 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2016-10-19 15:02:06 +0000
commita87d202652c822796630aaf2bc8925183c8db883 (patch)
tree332599310d457bd7ac7dcc9f402a5f4ed62a3f96
parent0c06a666ba8b3e5f3582c853185cc173fe4c79bf (diff)
Made HttpDownloader download calls non-static.
To set and use a RepositoryCache instance in HttpDownloader while parsing the command line options, we can pass an AtomicReference<HttpDownloader> instance from BazelRepositoryModule to the HttpArchiveFunctions. However, we'll need to change HttpDownloader download() calls to be non-static in order to initialize an instance of HttpDownloader in BazelRepositoryModule. Remaining TODOs: - RepositoryCache implementation and unit testing - RepositoryCache lockfiles - RepositoryCache integration testing GITHUB: #1752 -- MOS_MIGRATED_REVID=136593517
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java76
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java13
-rw-r--r--src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java9
12 files changed, 101 insertions, 96 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 9f6783487c..111786eee2 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -608,6 +608,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/bazel/dash",
"//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
+ "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
"//src/main/java/com/google/devtools/build/lib/remote",
"//src/main/java/com/google/devtools/build/lib/sandbox",
"//src/main/java/com/google/devtools/build/lib/ssd",
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 282508b9e5..da9b9b9b25 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
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.bazel.repository.NewGitRepositoryFunction;
import com.google.devtools.build.lib.bazel.repository.NewHttpArchiveFunction;
import com.google.devtools.build.lib.bazel.repository.RepositoryOptions;
import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache;
+import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryFunction;
import com.google.devtools.build.lib.bazel.repository.skylark.SkylarkRepositoryModule;
import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryFunction;
@@ -81,21 +82,22 @@ public class BazelRepositoryModule extends BlazeModule {
// A map of repository handlers that can be looked up by rule class name.
private final ImmutableMap<String, RepositoryFunction> repositoryHandlers;
private final AtomicBoolean isFetch = new AtomicBoolean(false);
- private final SkylarkRepositoryFunction skylarkRepositoryFunction =
- new SkylarkRepositoryFunction();
+ private final SkylarkRepositoryFunction skylarkRepositoryFunction;
private final RepositoryDelegatorFunction delegator;
- private final AtomicReference<RepositoryCache> repositoryCache = new AtomicReference<>();
+ private final AtomicReference<HttpDownloader> httpDownloader =
+ new AtomicReference<>(new HttpDownloader());
public BazelRepositoryModule() {
+ this.skylarkRepositoryFunction = new SkylarkRepositoryFunction(httpDownloader);
this.repositoryHandlers =
ImmutableMap.<String, RepositoryFunction>builder()
.put(LocalRepositoryRule.NAME, new LocalRepositoryFunction())
- .put(HttpArchiveRule.NAME, new HttpArchiveFunction(repositoryCache))
+ .put(HttpArchiveRule.NAME, new HttpArchiveFunction(httpDownloader))
.put(GitRepositoryRule.NAME, new GitRepositoryFunction())
- .put(HttpJarRule.NAME, new HttpJarFunction())
- .put(HttpFileRule.NAME, new HttpFileFunction())
- .put(MavenJarRule.NAME, new MavenJarFunction())
- .put(NewHttpArchiveRule.NAME, new NewHttpArchiveFunction())
+ .put(HttpJarRule.NAME, new HttpJarFunction(httpDownloader))
+ .put(HttpFileRule.NAME, new HttpFileFunction(httpDownloader))
+ .put(MavenJarRule.NAME, new MavenJarFunction(httpDownloader))
+ .put(NewHttpArchiveRule.NAME, new NewHttpArchiveFunction(httpDownloader))
.put(NewGitRepositoryRule.NAME, new NewGitRepositoryFunction())
.put(NewLocalRepositoryRule.NAME, new NewLocalRepositoryFunction())
.put(AndroidSdkRepositoryRule.NAME, new AndroidSdkRepositoryFunction())
@@ -171,7 +173,8 @@ public class BazelRepositoryModule extends BlazeModule {
RepositoryOptions repoOptions = optionsProvider.getOptions(RepositoryOptions.class);
if (repoOptions != null && repoOptions.experimentalRepositoryCache != null) {
- repositoryCache.set(new RepositoryCache(repoOptions.experimentalRepositoryCache));
+ httpDownloader.get().setRepositoryCache(
+ new RepositoryCache(repoOptions.experimentalRepositoryCache));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java
index ca9a446fd0..059c5987fd 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpArchiveFunction.java
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.bazel.repository;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.RuleDefinition;
-import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache;
import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.bazel.rules.workspace.HttpArchiveRule;
import com.google.devtools.build.lib.packages.Rule;
@@ -39,17 +38,10 @@ import java.util.concurrent.atomic.AtomicReference;
*/
public class HttpArchiveFunction extends RepositoryFunction {
- private final AtomicReference<RepositoryCache> repositoryCache;
+ protected final AtomicReference<HttpDownloader> httpDownloader;
- protected HttpArchiveFunction() {
- repositoryCache = new AtomicReference<>();
- }
-
- /**
- * @param repositoryCache the reference to the repository cache.
- */
- public HttpArchiveFunction(AtomicReference<RepositoryCache> repositoryCache) {
- this.repositoryCache = repositoryCache;
+ public HttpArchiveFunction(AtomicReference<HttpDownloader> httpDownloader) {
+ this.httpDownloader = httpDownloader;
}
@Override
@@ -70,18 +62,16 @@ public class HttpArchiveFunction extends RepositoryFunction {
public SkyValue fetch(
Rule rule, Path outputDirectory, BlazeDirectories directories, Environment env)
throws RepositoryFunctionException, InterruptedException {
- // The output directory is always under .external-repository (to stay out of the way of
+ // The output directory is always under output_base/external (to stay out of the way of
// artifacts from this repository) and uses the rule's name to avoid conflicts with other
// remote repository rules. For example, suppose you had the following WORKSPACE file:
//
// http_archive(name = "png", url = "http://example.com/downloads/png.tar.gz", sha256 = "...")
//
- // This would download png.tar.gz to .external-repository/png/png.tar.gz.
+ // This would download png.tar.gz to output_base/external/png/png.tar.gz.
createDirectory(outputDirectory);
- Path downloadedPath = (repositoryCache == null || repositoryCache.get() == null)
- ? HttpDownloader.download(rule, outputDirectory, env.getListener(), clientEnvironment)
- : HttpDownloader.download(rule, outputDirectory, env.getListener(), clientEnvironment,
- repositoryCache.get());
+ Path downloadedPath = httpDownloader.get().download(rule, outputDirectory,
+ env.getListener(), clientEnvironment);
DecompressorValue.decompress(getDescriptor(rule, downloadedPath, outputDirectory));
return RepositoryDirectoryValue.create(outputDirectory);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java
index 1ded55400b..be19da3d08 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpFileFunction.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.bazel.repository;
import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.bazel.rules.workspace.HttpFileRule;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper;
@@ -22,11 +23,17 @@ import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Downloads a jar file from a URL.
*/
public class HttpFileFunction extends HttpArchiveFunction {
+
+ public HttpFileFunction(AtomicReference<HttpDownloader> httpDownloader) {
+ super(httpDownloader);
+ }
+
@Override
protected DecompressorDescriptor getDescriptor(Rule rule, Path downloadPath, Path outputDirectory)
throws RepositoryFunctionException {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java
index a09ee1c8d0..d260a3957b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/HttpJarFunction.java
@@ -15,14 +15,21 @@
package com.google.devtools.build.lib.bazel.repository;
import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.bazel.rules.workspace.HttpJarRule;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.vfs.Path;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Downloads a jar file from a URL.
*/
public class HttpJarFunction extends HttpArchiveFunction {
+
+ public HttpJarFunction(AtomicReference<HttpDownloader> httpDownloader) {
+ super(httpDownloader);
+ }
+
@Override
protected DecompressorDescriptor getDescriptor(Rule rule, Path downloadPath, Path outputDirectory)
throws RepositoryFunctionException {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
index a41f3ab076..60ed5558f3 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
@@ -35,6 +35,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
import com.google.devtools.build.skyframe.SkyValue;
import java.io.IOException;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
import org.apache.maven.settings.Server;
import org.eclipse.aether.RepositorySystem;
@@ -53,6 +54,11 @@ import org.eclipse.aether.resolution.ArtifactResult;
* Implementation of maven_jar.
*/
public class MavenJarFunction extends HttpArchiveFunction {
+
+ public MavenJarFunction(AtomicReference<HttpDownloader> httpDownloader) {
+ super(httpDownloader);
+ }
+
private static final String DEFAULT_SERVER = "default";
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java
index 04ad0b708c..24562c3c21 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/NewHttpArchiveFunction.java
@@ -29,7 +29,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
import com.google.devtools.build.skyframe.SkyValue;
import java.io.IOException;
-
+import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
/**
@@ -38,6 +38,10 @@ import javax.annotation.Nullable;
*/
public class NewHttpArchiveFunction extends HttpArchiveFunction {
+ public NewHttpArchiveFunction(AtomicReference<HttpDownloader> httpDownloader) {
+ super(httpDownloader);
+ }
+
@Nullable
@Override
public SkyValue fetch(
@@ -57,7 +61,7 @@ public class NewHttpArchiveFunction extends HttpArchiveFunction {
}
// Download.
- Path downloadedPath = HttpDownloader.download(
+ Path downloadedPath = httpDownloader.get().download(
rule, outputDirectory, env.getListener(), clientEnvironment);
// Decompress.
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java
index 5f738cd1e4..c25699ae76 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java
@@ -40,8 +40,6 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
-import javax.annotation.Nullable;
-
/**
* Helper class for downloading a file from a URL.
*/
@@ -51,28 +49,13 @@ public class HttpDownloader {
private static final String UNITS = " KMGTPEY";
private static final double LOG_OF_KB = Math.log(1024);
- private final String urlString;
- private final String sha256;
- private final String type;
- private final Path outputDirectory;
- private final EventHandler eventHandler;
private final ScheduledExecutorService scheduler;
- private final Map<String, String> clientEnv;
- private HttpDownloader(
- EventHandler eventHandler, String urlString, String sha256, Path outputDirectory,
- String type, Map<String, String> clientEnv) {
- this.urlString = urlString;
- this.sha256 = sha256;
- this.outputDirectory = outputDirectory;
- this.eventHandler = eventHandler;
+ public HttpDownloader() {
this.scheduler = Executors.newScheduledThreadPool(1);
- this.type = type;
- this.clientEnv = clientEnv;
}
- @Nullable
- public static Path download(
+ public Path download(
Rule rule, Path outputDirectory, EventHandler eventHandler, Map<String, String> clientEnv)
throws RepositoryFunctionException, InterruptedException {
WorkspaceAttributeMapper mapper = WorkspaceAttributeMapper.of(rule);
@@ -89,42 +72,11 @@ public class HttpDownloader {
}
try {
- return new HttpDownloader(eventHandler, url, sha256, outputDirectory, type, clientEnv)
- .download();
- } catch (IOException e) {
- throw new RepositoryFunctionException(new IOException("Error downloading from "
- + url + " to " + outputDirectory + ": " + e.getMessage()),
- SkyFunctionException.Transience.TRANSIENT);
- }
- }
-
- @SuppressWarnings("unused")
- @Nullable
- public static Path download(
- Rule rule, Path outputDirectory, EventHandler eventHandler, Map<String, String> clientEnv,
- RepositoryCache repositoryCache)
- throws RepositoryFunctionException, InterruptedException {
-
- /* TODO(jingwen): No-op with the cache controller for now.
- * This will be the place where we detect cache hits with the sha256 value
- * and copy the values accordingly.
- *
- * For now, delegating operation to the original download method.
- */
- return download(rule, outputDirectory, eventHandler, clientEnv);
- }
-
- @Nullable
- public static Path download(
- String url, String sha256, String type, Path output, EventHandler eventHandler, Map<String,
- String> clientEnv)
- throws RepositoryFunctionException, InterruptedException {
- try {
- return new HttpDownloader(eventHandler, url, sha256, output, type, clientEnv).download();
+ return download(url, sha256, type, outputDirectory, eventHandler, clientEnv);
} catch (IOException e) {
throw new RepositoryFunctionException(
new IOException(
- "Error downloading from " + url + " to " + output + ": " + e.getMessage()),
+ "Error downloading from " + url + " to " + outputDirectory + ": " + e.getMessage()),
SkyFunctionException.Transience.TRANSIENT);
}
}
@@ -132,7 +84,10 @@ public class HttpDownloader {
/**
* Attempt to download a file from the repository's URL. Returns the path to the file downloaded.
*/
- public Path download() throws IOException, InterruptedException {
+ public Path download(
+ String urlString, String sha256, String type, Path outputDirectory,
+ EventHandler eventHandler, Map<String, String> clientEnv)
+ throws IOException, InterruptedException {
URL url = new URL(urlString);
Path destination;
if (type == null) {
@@ -160,10 +115,10 @@ public class HttpDownloader {
}
AtomicInteger totalBytes = new AtomicInteger(0);
- final ScheduledFuture<?> loggerHandle = getLoggerHandle(totalBytes);
+ final ScheduledFuture<?> loggerHandle = getLoggerHandle(totalBytes, eventHandler, urlString);
try (OutputStream out = destination.getOutputStream();
- HttpConnection connection = HttpConnection.createAndConnect(url, this.clientEnv)) {
+ HttpConnection connection = HttpConnection.createAndConnect(url, clientEnv)) {
InputStream inputStream = connection.getInputStream();
int read;
byte[] buf = new byte[BUFFER_SIZE];
@@ -191,11 +146,11 @@ public class HttpDownloader {
}, 0, TimeUnit.SECONDS);
}
- compareHashes(destination);
+ compareHashes(destination, sha256);
return destination;
}
- private void compareHashes(Path destination) throws IOException {
+ private void compareHashes(Path destination, String sha256) throws IOException {
if (sha256.isEmpty()) {
return;
}
@@ -214,7 +169,8 @@ public class HttpDownloader {
}
}
- private ScheduledFuture<?> getLoggerHandle(final AtomicInteger totalBytes) {
+ private ScheduledFuture<?> getLoggerHandle(
+ final AtomicInteger totalBytes, EventHandler eventHandler, String urlString) {
final Runnable logger = new Runnable() {
@Override
public void run() {
@@ -256,4 +212,8 @@ public class HttpDownloader {
}
return hasher.hash().toString();
}
+
+ public void setRepositoryCache(@SuppressWarnings("unused") RepositoryCache repositoryCache) {
+ // TODO(jingwen): Implement repository cache bridge
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
index 4614b21d0a..69ffa1c402 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
@@ -55,6 +55,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
/** Skylark API for the repository_rule's context. */
@SkylarkModule(
@@ -73,6 +74,7 @@ public class SkylarkRepositoryContext {
private final SkylarkClassObject attrObject;
private final SkylarkOS osObject;
private final Environment env;
+ private final AtomicReference<HttpDownloader> httpDownloader;
/**
* Convert attribute name from native naming convention to Skylark naming convention.
@@ -92,12 +94,14 @@ public class SkylarkRepositoryContext {
* argument).
*/
SkylarkRepositoryContext(
- Rule rule, Path outputDirectory, Environment environment, Map<String, String> env)
+ Rule rule, Path outputDirectory, Environment environment,
+ Map<String, String> env, AtomicReference<HttpDownloader> httpDownloader)
throws EvalException {
this.rule = rule;
this.outputDirectory = outputDirectory;
this.env = environment;
this.osObject = new SkylarkOS(env);
+ this.httpDownloader = httpDownloader;
WorkspaceAttributeMapper attrs = WorkspaceAttributeMapper.of(rule);
ImmutableMap.Builder<String, Object> attrBuilder = new ImmutableMap.Builder<>();
for (String name : attrs.getAttributeNames()) {
@@ -485,7 +489,7 @@ public class SkylarkRepositoryContext {
try {
checkInOutputDirectory(outputPath);
makeDirectories(outputPath.getPath());
- HttpDownloader.download(url, sha256, null, outputPath.getPath(), env.getListener(),
+ httpDownloader.get().download(url, sha256, null, outputPath.getPath(), env.getListener(),
osObject.getEnvironmentVariables());
if (executable) {
outputPath.getPath().setExecutable(true);
@@ -562,9 +566,13 @@ public class SkylarkRepositoryContext {
SkylarkPath outputPath = getPath("download_and_extract()", output);
checkInOutputDirectory(outputPath);
createDirectory(outputPath.getPath());
- Path downloadedPath = HttpDownloader
- .download(url, sha256, type, outputPath.getPath(), env.getListener(),
- osObject.getEnvironmentVariables());
+ Path downloadedPath;
+ try {
+ downloadedPath = httpDownloader.get().download(url, sha256, type, outputPath.getPath(),
+ env.getListener(), osObject.getEnvironmentVariables());
+ } catch (IOException e) {
+ throw new RepositoryFunctionException(e, Transience.TRANSIENT);
+ }
DecompressorValue.decompress(
DecompressorDescriptor.builder()
.setTargetKind(rule.getTargetKind())
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 0d3ba70ef1..71a8fdacd9 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
@@ -36,7 +37,7 @@ import com.google.devtools.build.skyframe.SkyValue;
import java.io.IOException;
import java.util.Map;
-
+import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nullable;
/**
@@ -55,6 +56,12 @@ public class SkylarkRepositoryFunction extends RepositoryFunction {
}
}
+ private final AtomicReference<HttpDownloader> httpDownloader;
+
+ public SkylarkRepositoryFunction(AtomicReference<HttpDownloader> httpDownloader) {
+ this.httpDownloader = httpDownloader;
+ }
+
/**
* Skylark repository context functions can throw the result of this function to notify the
* SkylarkRepositoryFunction that a dependency was missing and the evaluation of the function must
@@ -89,8 +96,8 @@ public class SkylarkRepositoryFunction extends RepositoryFunction {
.setSkylark()
.setEventHandler(env.getListener())
.build();
- SkylarkRepositoryContext skylarkRepositoryContext =
- new SkylarkRepositoryContext(rule, outputDirectory, env, getClientEnvironment());
+ SkylarkRepositoryContext skylarkRepositoryContext = new SkylarkRepositoryContext(
+ rule, outputDirectory, env, getClientEnvironment(), httpDownloader);
// This has side-effect, we don't care about the output.
// Also we do a lot of stuff in there, maybe blocking operations and we should certainly make
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
index 79b8fed690..6d19070576 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.fail;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.CharStreams;
+import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.Package;
@@ -40,6 +41,7 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -87,12 +89,15 @@ public class SkylarkRepositoryContextTest {
.externalPackageData()
.createAndAddRepositoryRule(
packageBuilder, buildRuleClass(attributes), null, kwargs, ast);
+ AtomicReference<HttpDownloader> httpDownloader =
+ new AtomicReference<>(Mockito.mock(HttpDownloader.class));
context =
new SkylarkRepositoryContext(
rule,
outputDirectory,
Mockito.mock(SkyFunction.Environment.class),
- ImmutableMap.of("FOO", "BAR"));
+ ImmutableMap.of("FOO", "BAR"),
+ httpDownloader);
}
protected void setUpContexForRule(String name) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
index 9b63536d30..e0e0b857ea 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.rules.cpp.FdoSupportFunction;
@@ -38,9 +39,11 @@ import com.google.devtools.build.skyframe.SkyFunctionName;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import org.mockito.Mockito;
/**
* Integration test for skylark repository not as heavyweight than shell integration tests.
@@ -66,8 +69,12 @@ public class SkylarkRepositoryIntegrationTest extends BuildViewTestCase {
@Override
public ImmutableMap<SkyFunctionName, SkyFunction> getSkyFunctions() {
// Add both the local repository and the skylark repository functions
+ // The HttpDownloader mock injected with the SkylarkRepositoryFunction
+ AtomicReference<HttpDownloader> httpDownloader =
+ new AtomicReference<>(Mockito.mock(HttpDownloader.class));
RepositoryFunction localRepositoryFunction = new LocalRepositoryFunction();
- SkylarkRepositoryFunction skylarkRepositoryFunction = new SkylarkRepositoryFunction();
+ SkylarkRepositoryFunction skylarkRepositoryFunction =
+ new SkylarkRepositoryFunction(httpDownloader);
ImmutableMap<String, RepositoryFunction> repositoryHandlers =
ImmutableMap.of(LocalRepositoryRule.NAME, localRepositoryFunction);