aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2016-01-18 15:25:56 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2016-01-18 16:52:03 +0000
commit9a9c3b93f9eefdfa166f24a893d51d8d4abc8d3a (patch)
tree2c98cb7594f8253551d33693fc8f80f800e6d10f /src/main/java
parentdaffc359d7c6961d9f741980438549bf74e6132c (diff)
Inlined RepositoryFunction#getExternalPackage
This method was used only twice. Now there is only one entry point for requesting a rule in the external package (RepositoryFunction#getRule(String, Environment)). This is a step towards supporting loading skylark rules in the workspace file from remote repository. -- MOS_MIGRATED_REVID=112407797
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java42
2 files changed, 36 insertions, 22 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java
index c0b9414c32..b2280fa447 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java
@@ -19,10 +19,10 @@ import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.bazel.rules.workspace.MavenServerRule;
import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
-import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException;
+import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryNotFoundException;
import com.google.devtools.build.lib.skyframe.FileValue;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Fingerprint;
@@ -66,15 +66,19 @@ public class MavenServerFunction implements SkyFunction {
}
@Nullable
+ @Override
public SkyValue compute(SkyKey skyKey, Environment env)
throws SkyFunctionException {
String repository = (String) skyKey.argument();
- Package externalPackage = RepositoryFunction.getExternalPackage(env);
- if (externalPackage == null) {
- return null;
+ Rule repositoryRule;
+ try {
+ repositoryRule = RepositoryFunction.getRule(repository, env);
+ if (repositoryRule == null) {
+ return null;
+ }
+ } catch (RepositoryNotFoundException ex) {
+ repositoryRule = null;
}
- Rule repositoryRule = externalPackage.getRule(repository);
-
String serverName;
String url;
Map<String, FileValue> settingsFiles;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index c67c254225..13e47368a6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -89,7 +89,7 @@ public abstract class RepositoryFunction {
* <p>This exception should be used by child classes to limit the types of exceptions
* {@link RepositoryDelegatorFunction} has to know how to catch.</p>
*/
- public static final class RepositoryFunctionException extends SkyFunctionException {
+ public static class RepositoryFunctionException extends SkyFunctionException {
public RepositoryFunctionException(NoSuchPackageException cause, Transience transience) {
super(cause, transience);
}
@@ -109,6 +109,19 @@ public abstract class RepositoryFunction {
}
}
+ /**
+ * Exception thrown when something a repository rule cannot be found.
+ */
+ public static final class RepositoryNotFoundException extends RepositoryFunctionException {
+ public RepositoryNotFoundException(String repositoryName) {
+ super(
+ new BuildFileContainsErrorsException(
+ Label.EXTERNAL_PACKAGE_IDENTIFIER,
+ "The repository named '" + repositoryName + "' could not be resolved"),
+ Transience.PERSISTENT);
+ }
+ }
+
private BlazeDirectories directories;
private byte[] computeRuleKey(Rule rule, byte[] ruleSpecificData) {
@@ -352,8 +365,13 @@ public abstract class RepositoryFunction {
}
}
+ /**
+ * Uses a remote repository name to fetch the corresponding Rule describing how to get it.
+ *
+ * This should be the unique entry point for resolving a remote repository function.
+ */
@Nullable
- public static Package getExternalPackage(Environment env)
+ public static Rule getRule(String repository, Environment env)
throws RepositoryFunctionException {
SkyKey packageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER);
PackageValue packageValue;
@@ -377,7 +395,11 @@ public abstract class RepositoryFunction {
Label.EXTERNAL_PACKAGE_IDENTIFIER, "Could not load //external package"),
Transience.PERSISTENT);
}
- return externalPackage;
+ Rule rule = externalPackage.getRule(repository);
+ if (rule == null) {
+ throw new RepositoryNotFoundException(repository);
+ }
+ return rule;
}
@Nullable
@@ -402,19 +424,7 @@ public abstract class RepositoryFunction {
public static Rule getRule(
RepositoryName repositoryName, @Nullable String ruleClassName, Environment env)
throws RepositoryFunctionException {
- Package externalPackage = getExternalPackage(env);
- if (externalPackage == null) {
- return null;
- }
-
- Rule rule = externalPackage.getRule(repositoryName.strippedName());
- if (rule == null) {
- throw new RepositoryFunctionException(
- new BuildFileContainsErrorsException(
- Label.EXTERNAL_PACKAGE_IDENTIFIER,
- "The repository named '" + repositoryName + "' could not be resolved"),
- Transience.PERSISTENT);
- }
+ Rule rule = getRule(repositoryName.strippedName(), env);
Preconditions.checkState(ruleClassName == null || rule.getRuleClass().equals(ruleClassName),
"Got %s, was expecting a %s", rule, ruleClassName);
return rule;