From 9a9c3b93f9eefdfa166f24a893d51d8d4abc8d3a Mon Sep 17 00:00:00 2001 From: Damien Martin-Guillerez Date: Mon, 18 Jan 2016 15:25:56 +0000 Subject: 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 --- .../lib/bazel/repository/MavenServerFunction.java | 16 +++++---- .../lib/rules/repository/RepositoryFunction.java | 42 +++++++++++++--------- 2 files changed, 36 insertions(+), 22 deletions(-) (limited to 'src/main/java') 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 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 { *

This exception should be used by child classes to limit the types of exceptions * {@link RepositoryDelegatorFunction} has to know how to catch.

*/ - 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; -- cgit v1.2.3