diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
41 files changed, 218 insertions, 74 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java index 4509092cca..2642687713 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java @@ -342,7 +342,7 @@ public class ArtifactFactory implements ArtifactResolver, ArtifactSerializer, Ar return null; } - RepositoryName repoName = PackageIdentifier.DEFAULT_REPOSITORY_NAME; + RepositoryName repoName = PackageIdentifier.MAIN_REPOSITORY_NAME; Pair<RepositoryName, PathFragment> repo = RepositoryName.fromPathFragment(dir); if (repo != null) { diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java index b694cc631c..780e881660 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java @@ -386,11 +386,14 @@ public abstract class DependencyResolver { } try { if (attribute.getType() == BuildType.LABEL) { - Label label = BuildType.LABEL.cast(actualValue); + Label label = rule.getLabel().resolveRepositoryRelative( + BuildType.LABEL.cast(actualValue)); builder.put(attribute, LabelAndConfiguration.of(label, actualConfig)); } else if (attribute.getType() == BuildType.LABEL_LIST) { for (Label label : BuildType.LABEL_LIST.cast(actualValue)) { - builder.put(attribute, LabelAndConfiguration.of(label, actualConfig)); + builder.put(attribute, LabelAndConfiguration.of( + rule.getLabel().resolveRepositoryRelative(label), + actualConfig)); } } else { throw new IllegalStateException( 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 48a9fea963..7c48f5440d 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 @@ -18,6 +18,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.AggregatingAttributeMapper; import com.google.devtools.build.lib.packages.Rule; @@ -363,6 +364,14 @@ public class SkylarkRepositoryContext { // Resolve the label given by value into a file path. private SkylarkPath getPathFromLabel(Label label) throws EvalException { // Look for package. + if (label.getPackageIdentifier().getRepository().isDefault()) { + try { + label = Label.create(label.getPackageIdentifier().makeAbsolute(), + label.getName()); + } catch (LabelSyntaxException e) { + throw new IllegalStateException(e); // Can't happen because the input label is valid + } + } SkyKey pkgSkyKey = PackageLookupValue.key(label.getPackageIdentifier()); PackageLookupValue pkgLookupValue = (PackageLookupValue) env.getValue(pkgSkyKey); if (pkgLookupValue == null) { diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java index b1bcffa482..030e689b82 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java @@ -48,7 +48,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin * Package names that aren't made relative to the current repository because they mean special * things to Bazel. */ - private static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of( + public static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of( // Used for select new PathFragment("conditions"), // dependencies that are a function of the configuration @@ -59,7 +59,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin Label.EXTERNAL_PACKAGE_NAME); public static final PackageIdentifier EXTERNAL_PACKAGE_IDENTIFIER = - PackageIdentifier.createInDefaultRepo(EXTERNAL_PACKAGE_NAME); + PackageIdentifier.createInMainRepo(EXTERNAL_PACKAGE_NAME); public static final String EXTERNAL_PATH_PREFIX = "external"; @@ -71,9 +71,28 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin * {@literal @}foo//bar * {@literal @}foo//bar:baz * </pre> + * + * <p>Treats labels in the default repository as being in the main repository instead. */ public static Label parseAbsolute(String absName) throws LabelSyntaxException { - String repo = PackageIdentifier.DEFAULT_REPOSITORY; + return parseAbsolute(absName, true); + } + + /** + * Factory for Labels from absolute string form. e.g. + * <pre> + * //foo/bar + * //foo/bar:quux + * {@literal @}foo//bar + * {@literal @}foo//bar:baz + * </pre> + * + * @param defaultToMain Treat labels in the default repository as being in the main + * one instead. + */ + public static Label parseAbsolute(String absName, boolean defaultToMain) + throws LabelSyntaxException { + String repo = defaultToMain ? "@" : PackageIdentifier.DEFAULT_REPOSITORY; int packageStartPos = absName.indexOf("//"); if (packageStartPos > 0) { repo = absName.substring(0, packageStartPos); @@ -83,8 +102,12 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin LabelValidator.PackageAndTarget labelParts = LabelValidator.parseAbsoluteLabel(absName); PackageIdentifier pkgIdWithoutRepo = validate(labelParts.getPackageName(), labelParts.getTargetName()); + PathFragment packageFragment = pkgIdWithoutRepo.getPackageFragment(); + if (repo.isEmpty() && ABSOLUTE_PACKAGE_NAMES.contains(packageFragment)) { + repo = "@"; + } return new Label( - PackageIdentifier.create(repo, pkgIdWithoutRepo.getPackageFragment()), + PackageIdentifier.create(repo, packageFragment), labelParts.getTargetName()); } catch (BadLabelException e) { throw new LabelSyntaxException(e.getMessage()); @@ -98,14 +121,18 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin * * <p>Do not use this when the argument is not hard-wired. */ - public static Label parseAbsoluteUnchecked(String absName) { + public static Label parseAbsoluteUnchecked(String absName, boolean defaultToMain) { try { - return parseAbsolute(absName); + return parseAbsolute(absName, defaultToMain); } catch (LabelSyntaxException e) { throw new IllegalArgumentException(e); } } + public static Label parseAbsoluteUnchecked(String absName) { + return parseAbsoluteUnchecked(absName, true); + } + /** * Factory for Labels from separate components. * @@ -243,7 +270,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin } private Object writeReplace() { - return new LabelSerializationProxy(toString()); + return new LabelSerializationProxy(getUnambiguousCanonicalForm()); } private void readObject(ObjectInputStream stream) throws InvalidObjectException { @@ -322,7 +349,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin /** * Renders this label in canonical form. * - * <p>invariant: {@code parseAbsolute(x.toString()).equals(x)} + * <p>invariant: {@code parseAbsolute(x.toString(), false).equals(x)} */ @Override public String toString() { @@ -332,21 +359,46 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin /** * Renders this label in canonical form. * - * <p>invariant: {@code parseAbsolute(x.toString()).equals(x)} + * <p>invariant: {@code parseAbsolute(x.getCanonicalForm(), false).equals(x)} */ public String getCanonicalForm() { + return getDefaultCanonicalForm(); + } + + public String getUnambiguousCanonicalForm() { return packageIdentifier.getRepository() + "//" + packageIdentifier.getPackageFragment() + ":" + name; } /** + * Renders this label in canonical form, except with labels in the main and default + * repositories conflated. + */ + public String getDefaultCanonicalForm() { + String repository; + if (packageIdentifier.getRepository().isMain()) { + repository = ""; + } else { + repository = packageIdentifier.getRepository().getName(); + } + return repository + "//" + packageIdentifier.getPackageFragment() + + ":" + name; + } + + /** * Renders this label in shorthand form. * * <p>Labels with canonical form {@code //foo/bar:bar} have the shorthand form {@code //foo/bar}. * All other labels have identical shorthand and canonical forms. */ public String toShorthandString() { - return packageIdentifier.getRepository() + (getPackageFragment().getBaseName().equals(name) + String repository; + if (packageIdentifier.getRepository().isMain()) { + repository = ""; + } else { + repository = packageIdentifier.getRepository().getName(); + } + return repository + (getPackageFragment().getBaseName().equals(name) ? "//" + getPackageFragment() : toString()); } @@ -391,7 +443,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin } if (LabelValidator.isAbsolute(relName)) { - return resolveRepositoryRelative(parseAbsolute(relName)); + return resolveRepositoryRelative(parseAbsolute(relName, false)); } else if (relName.equals(":")) { throw new LabelSyntaxException("':' is not a valid package-relative label"); } else if (relName.charAt(0) == ':') { @@ -407,11 +459,12 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin * <p>This is necessary so that dependency edges in remote repositories do not need to explicitly * mention their repository name. Otherwise, referring to e.g. <code>//a:b</code> in a remote * repository would point back to the main repository, which is usually not what is intended. + * + * <p>The return value will not be in the default repository. */ public Label resolveRepositoryRelative(Label relative) { if (packageIdentifier.getRepository().isDefault() - || !relative.packageIdentifier.getRepository().isDefault() - || ABSOLUTE_PACKAGE_NAMES.contains(relative.getPackageIdentifier().getPackageFragment())) { + || !relative.packageIdentifier.getRepository().isDefault()) { return relative; } else { try { diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java b/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java index 5d7e6d0f93..c28e18565d 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java @@ -44,6 +44,6 @@ public class LabelSerializationProxy implements Externalizable { } private Object readResolve() { - return Label.parseAbsoluteUnchecked(labelString); + return Label.parseAbsoluteUnchecked(labelString, false); } } diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java index 4c995eb5cf..69fb31adb8 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java @@ -60,19 +60,22 @@ public final class PackageIdentifier implements Comparable<PackageIdentifier>, S } } - // Temporary factory for identifiers without explicit repositories. - // TODO(bazel-team): remove all usages of this. + /** + * This is only used by legacy callers. Actually creates the package identifier in the main + * repository, not the default one. + */ + // TODO(lberki): Remove this method. + @Deprecated public static PackageIdentifier createInDefaultRepo(String name) { - return createInDefaultRepo(new PathFragment(name)); + return create(MAIN_REPOSITORY_NAME, new PathFragment(name)); } - public static PackageIdentifier createInDefaultRepo(PathFragment name) { - try { - return create(DEFAULT_REPOSITORY, name); - } catch (LabelSyntaxException e) { - throw new IllegalArgumentException("could not create package identifier for " + name - + ": " + e.getMessage()); - } + public static PackageIdentifier createInMainRepo(String name) { + return createInMainRepo(new PathFragment(name)); + } + + public static PackageIdentifier createInMainRepo(PathFragment name) { + return create(MAIN_REPOSITORY_NAME, name); } /** @@ -136,6 +139,14 @@ public final class PackageIdentifier implements Comparable<PackageIdentifier>, S return repository.getPathFragment().getRelative(pkgName); } + public PackageIdentifier makeAbsolute() { + if (!repository.isDefault()) { + return this; + } + + return create(MAIN_REPOSITORY_NAME, pkgName); + } + /** * Returns the name of this package. * @@ -145,7 +156,7 @@ public final class PackageIdentifier implements Comparable<PackageIdentifier>, S */ @Override public String toString() { - return (repository.isDefault() ? "" : repository + "//") + pkgName; + return (repository.isDefault() || repository.isMain() ? "" : repository + "//") + pkgName; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java index 6f5811d58a..9a4e5a7ca1 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java @@ -178,6 +178,13 @@ public final class RepositoryName implements Serializable { } /** + * Returns if this is the default repository, that is, {@link #name} is "@". + */ + public boolean isMain() { + return name.equals("@"); + } + + /** * Returns the repository name, with leading "{@literal @}" (or "" for the default repository). */ // TODO(bazel-team): Use this over toString()- easier to track its usage. @@ -189,7 +196,7 @@ public final class RepositoryName implements Serializable { * Returns the path at which this repository is mapped within the exec root. */ public PathFragment getPathFragment() { - return isDefault() || this.equals(PackageIdentifier.MAIN_REPOSITORY_NAME) + return isDefault() || isMain() ? PathFragment.EMPTY_FRAGMENT : new PathFragment(Label.EXTERNAL_PATH_PREFIX).getRelative(strippedName()); } diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java index f8c1a83525..c405efad0e 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java @@ -270,7 +270,7 @@ public abstract class TargetPattern implements Serializable { Preconditions.checkArgument(excludedSubdirectories.isEmpty(), "Target pattern \"%s\" of type %s cannot be evaluated with excluded subdirectories: %s.", getOriginalPattern(), getType(), excludedSubdirectories); - if (resolver.isPackage(PackageIdentifier.createInDefaultRepo(path))) { + if (resolver.isPackage(PackageIdentifier.createInMainRepo(path))) { // User has specified a package name. lookout for default target. callback.process(resolver.getExplicitTarget(label("//" + path)).getTargets()); } else { @@ -281,7 +281,7 @@ public abstract class TargetPattern implements Serializable { // first BUILD file is found (i.e. longest prefix match). for (int i = pieces.size() - 1; i > 0; i--) { String packageName = SLASH_JOINER.join(pieces.subList(0, i)); - if (resolver.isPackage(PackageIdentifier.createInDefaultRepo(packageName))) { + if (resolver.isPackage(PackageIdentifier.createInMainRepo(packageName))) { String targetName = SLASH_JOINER.join(pieces.subList(i, pieces.size())); callback.process( resolver @@ -304,7 +304,7 @@ public abstract class TargetPattern implements Serializable { public PackageIdentifier getDirectory() { int lastSlashIndex = path.lastIndexOf('/'); // The package name cannot be illegal because we verified it during target parsing - return PackageIdentifier.createInDefaultRepo( + return PackageIdentifier.createInMainRepo( lastSlashIndex < 0 ? "" : path.substring(0, lastSlashIndex)); } @@ -591,7 +591,7 @@ public abstract class TargetPattern implements Serializable { String originalPattern = pattern; final boolean includesRepo = pattern.startsWith("@"); - RepositoryName repository = PackageIdentifier.DEFAULT_REPOSITORY_NAME; + RepositoryName repository = null; if (includesRepo) { int pkgStart = pattern.indexOf("//"); if (pkgStart < 0) { @@ -638,6 +638,14 @@ public abstract class TargetPattern implements Serializable { + "' should not end in a slash"); } + if (repository == null) { + if (packagePart.startsWith(Label.EXTERNAL_PACKAGE_NAME.toString())) { + repository = PackageIdentifier.DEFAULT_REPOSITORY_NAME; + } else { + repository = PackageIdentifier.MAIN_REPOSITORY_NAME; + } + } + if (packagePart.endsWith("/...")) { String realPackagePart = removeSuffix(packagePart, "/..."); PackageIdentifier packageIdentifier; diff --git a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java index 993113ad8c..96a20fb964 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java @@ -114,7 +114,7 @@ public class AggregatingAttributeMapper extends AbstractAttributeMapper { for (Object value : visitAttribute(attribute.getName(), attribute.getType())) { if (value != null) { for (Label label : extractLabels(type, value)) { - observer.acceptLabelAttribute(label, attribute); + observer.acceptLabelAttribute(getLabel().resolveRepositoryRelative(label), attribute); } } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java index 875d9dcb33..9d2af18fb9 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java @@ -29,7 +29,6 @@ import com.google.devtools.build.lib.util.Preconditions; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -196,13 +195,15 @@ public final class AspectDefinition { continue; } if (aspectAttribute.getType() == BuildType.LABEL) { - Label label = BuildType.LABEL.cast(aspectAttribute.getDefaultValue(from)); + Label label = from.getLabel().resolveRepositoryRelative( + BuildType.LABEL.cast(aspectAttribute.getDefaultValue(from))); if (label != null) { labelBuilder.put(aspectAttribute, label); } } else if (aspectAttribute.getType() == BuildType.LABEL_LIST) { - List<Label> labelList = BuildType.LABEL_LIST.cast(aspectAttribute.getDefaultValue(from)); - labelBuilder.putAll(aspectAttribute, labelList); + for (Label label : BuildType.LABEL_LIST.cast(aspectAttribute.getDefaultValue(from))) { + labelBuilder.put(aspectAttribute, from.getLabel().resolveRepositoryRelative(label)); + } } } } diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index 9181d761e8..d2f70902ec 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -699,7 +699,7 @@ public final class PackageFactory { inputFile.getName())); } if (license == null && pkgBuilder.getDefaultLicense() == License.NO_LICENSE - && pkgBuilder.getBuildFileLabel().toString().startsWith("//third_party/")) { + && RuleClass.isThirdPartyPackage(pkgBuilder.getPackageIdentifier())) { throw new EvalException(ast.getLocation(), "third-party file '" + inputFile.getName() + "' lacks a license declaration " + "with one of the following types: notice, reciprocal, permissive, " diff --git a/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java b/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java index f7e3aedfd5..144dc8903f 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java @@ -58,7 +58,7 @@ public class RelativePackageNameResolver { relativePkg = pkg.substring(2); } else if (pkg.startsWith("/")) { throw new InvalidPackageNameException( - PackageIdentifier.createInDefaultRepo(pkg), + PackageIdentifier.createInMainRepo(pkg), "package name cannot start with a single slash"); } else { isAbsolute = false; @@ -75,7 +75,7 @@ public class RelativePackageNameResolver { result = result.normalize(); if (result.containsUplevelReferences()) { throw new InvalidPackageNameException( - PackageIdentifier.createInDefaultRepo(pkg), + PackageIdentifier.createInMainRepo(pkg), "package name contains too many '..' segments"); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 8064936556..9accac3899 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -30,6 +30,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Ordering; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; +import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.BuildType.SelectorList; @@ -103,6 +104,9 @@ import javax.annotation.concurrent.Immutable; public final class RuleClass { public static final Function<? super Rule, Map<String, Label>> NO_EXTERNAL_BINDINGS = Functions.<Map<String, Label>>constant(ImmutableMap.<String, Label>of()); + + private static final PathFragment THIRD_PARTY_PREFIX = new PathFragment("third_party"); + /** * A constraint for the package name of the Rule instances. */ @@ -1540,7 +1544,7 @@ public final class RuleClass { */ private static void checkThirdPartyRuleHasLicense(Rule rule, Package.Builder pkgBuilder, EventHandler eventHandler) { - if (rule.getLabel().getPackageName().startsWith("third_party/")) { + if (isThirdPartyPackage(rule.getLabel().getPackageIdentifier())) { License license = rule.getLicense(); if (license == null) { license = pkgBuilder.getDefaultLicense(); @@ -1778,4 +1782,20 @@ public final class RuleClass { public boolean outputsDefaultExecutable() { return outputsDefaultExecutable; } + + public static boolean isThirdPartyPackage(PackageIdentifier packageIdentifier) { + if (!packageIdentifier.getRepository().isMain()) { + return false; + } + + if (!packageIdentifier.getPackageFragment().startsWith(THIRD_PARTY_PREFIX)) { + return false; + } + + if (packageIdentifier.getPackageFragment().segmentCount() <= 1) { + return false; + } + + return true; + } } diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java index a187ca9116..ff4dff418e 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.pkgcache; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.Constants; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; @@ -186,4 +187,15 @@ public class PackageCacheOptions extends OptionsBase { } } + + public ImmutableSet<PackageIdentifier> getDeletedPackages() { + if (deletedPackages == null) { + return ImmutableSet.of(); + } + ImmutableSet.Builder<PackageIdentifier> newDeletedPackages = ImmutableSet.builder(); + for (PackageIdentifier pkg : deletedPackages) { + newDeletedPackages.add(pkg.makeAbsolute()); + } + return newDeletedPackages.build(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java index 93a5e01357..f00606daf4 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.pkgcache; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -98,9 +99,10 @@ public class PathPackageLocator implements Serializable { */ public Path getPackageBuildFileNullable(PackageIdentifier packageIdentifier, AtomicReference<? extends UnixGlob.FilesystemCalls> cache) { - if (packageIdentifier.getRepository().isDefault()) { + Preconditions.checkArgument(!packageIdentifier.getRepository().isDefault()); + if (packageIdentifier.getRepository().isMain()) { return getFilePath(packageIdentifier.getPackageFragment().getRelative("BUILD"), cache); - } else if (!packageIdentifier.getRepository().isDefault()) { + } else { Verify.verify(outputBase != null, String.format( "External package '%s' needs to be loaded but this PathPackageLocator instance does not " + "support external packages", packageIdentifier)); @@ -116,8 +118,6 @@ public class PathPackageLocator implements Serializable { } else { return null; } - } else { - return null; } } diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java b/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java index 413eb1c166..d00db1e1e7 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java @@ -60,7 +60,7 @@ public final class TargetPatternResolverUtil { if (LabelValidator.validatePackageName(packageName) != null) { throw new TargetParsingException("'" + packageName + "' is not a valid package name"); } - if (!resolver.isPackage(PackageIdentifier.createInDefaultRepo(packageName))) { + if (!resolver.isPackage(PackageIdentifier.createInMainRepo(packageName))) { throw new TargetParsingException( TargetPatternResolverUtil.getParsingErrorMessage( "no such package '" + packageName + "': BUILD file not found on package path", diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java index f5186c85d3..3e96693be4 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java @@ -773,7 +773,7 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> { Map<SkyKey, PathFragment> keys = new HashMap<>(); for (PathFragment pathFragment : currentToOriginal.keySet()) { keys.put( - PackageLookupValue.key(PackageIdentifier.createInDefaultRepo(pathFragment)), + PackageLookupValue.key(PackageIdentifier.createInMainRepo(pathFragment)), pathFragment); } Map<SkyKey, SkyValue> lookupValues = graph.getSuccessfulValues(keys.keySet()); diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java index a4cc45d0f9..4949acda8f 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java +++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java @@ -229,7 +229,7 @@ public abstract class OutputFormatter implements Serializable { out.print(target.getTargetKind()); out.print(' '); } - out.println(target.getLabel()); + out.println(target.getLabel().getDefaultCanonicalForm()); } } }; @@ -306,7 +306,8 @@ public abstract class OutputFormatter implements Serializable { throws IOException, InterruptedException { for (Target target : partialResult) { Location location = target.getLocation(); - out.println(location.print() + ": " + target.getTargetKind() + " " + target.getLabel()); + out.println(location.print() + ": " + target.getTargetKind() + + " " + target.getLabel().getDefaultCanonicalForm()); } } }; @@ -348,7 +349,7 @@ public abstract class OutputFormatter implements Serializable { Object value = Iterables.getOnlyElement(values.first); out.printf(" %s = ", attr.getPublicName()); if (value instanceof Label) { - value = value.toString(); + value = ((Label) value).getDefaultCanonicalForm(); } else if (value instanceof List<?> && EvalUtils.isImmutable(value)) { // Display it as a list (and not as a tuple). Attributes can never be tuples. value = new ArrayList<>((List<?>) value); @@ -398,7 +399,7 @@ public abstract class OutputFormatter implements Serializable { @Override public String toString() { - return rank + " " + label; + return rank + " " + label.getDefaultCanonicalForm(); } } @@ -423,7 +424,7 @@ public abstract class OutputFormatter implements Serializable { if (toSave != null) { toSave.add(new RankAndLabel(rank, label)); } else { - out.println(rank + " " + label); + out.println(rank + " " + label.getDefaultCanonicalForm()); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java index 339592ed3c..38f73c13ea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java @@ -170,7 +170,7 @@ public class SkylarkRuleClassFunctions { @Override public Label load(String from) throws Exception { try { - return Label.parseAbsolute(from); + return Label.parseAbsolute(from, false); } catch (LabelSyntaxException e) { throw new Exception(from); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java index 81fc5732d0..65a300ce66 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java @@ -629,7 +629,8 @@ public class JavaCompileAction extends AbstractAction { } if (targetLabel != null) { result.add("--target_label"); - if (targetLabel.getPackageIdentifier().getRepository().isDefault()) { + if (targetLabel.getPackageIdentifier().getRepository().isDefault() + || targetLabel.getPackageIdentifier().getRepository().isMain()) { result.add(targetLabel.toString()); } else { // @-prefixed strings will be assumed to be filenames and expanded by @@ -677,6 +678,7 @@ public class JavaCompileAction extends AbstractAction { Label label = getTargetName(jar); builder.add( label.getPackageIdentifier().getRepository().isDefault() + || label.getPackageIdentifier().getRepository().isMain() ? label.toString() // Escape '@' prefix for .params file. : "@" + label); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java index 02b2a34cfe..787fb7fe4d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java @@ -315,7 +315,8 @@ public class JavaHeaderCompileActionBuilder { } if (targetLabel != null) { result.add("--target_label"); - if (targetLabel.getPackageIdentifier().getRepository().isDefault()) { + if (targetLabel.getPackageIdentifier().getRepository().isDefault() + || targetLabel.getPackageIdentifier().getRepository().isMain()) { result.add(targetLabel.toString()); } else { // @-prefixed strings will be assumed to be params filenames and expanded, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java index 4ed2341fa2..baae5551e1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java @@ -513,7 +513,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { private static String xcodeTargetName(Label label, String labelSuffix) { String pathFromWorkspaceRoot = label + labelSuffix; - if (label.getPackageIdentifier().getRepository().isDefault()) { + if (label.getPackageIdentifier().getRepository().isMain()) { pathFromWorkspaceRoot = pathFromWorkspaceRoot.replace("//", "") .replace(':', '/'); } else { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java index c14358173b..8b37d9f933 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java @@ -274,7 +274,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver path.getParentDirectory(), "Must pass in files, not root directory"); Preconditions.checkArgument(!parent.isAbsolute(), path); SkyKey depKey = - ContainingPackageLookupValue.key(PackageIdentifier.createInDefaultRepo(parent)); + ContainingPackageLookupValue.key(PackageIdentifier.createInMainRepo(parent)); depKeys.put(path, depKey); keysRequested.add(depKey); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java index ffee11cffb..0405f63c24 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java @@ -39,6 +39,7 @@ public abstract class ContainingPackageLookupValue implements SkyValue { public static SkyKey key(PackageIdentifier id) { Preconditions.checkArgument(!id.getPackageFragment().isAbsolute(), id); + Preconditions.checkArgument(!id.getRepository().isDefault(), id); return SkyKey.create(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, id); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java index 8045c59c96..92888d2427 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java @@ -120,7 +120,7 @@ public final class EnvironmentBackedRecursivePackageProvider implements Recursiv } List<Path> roots = new ArrayList<>(); - if (repository.isDefault()) { + if (repository.isMain()) { roots.addAll(packageLocator.getPathEntries()); } else { RepositoryDirectoryValue repositoryValue = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java index 5703c42283..a306f4fe94 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java @@ -171,7 +171,7 @@ public final class GraphBackedRecursivePackageProvider implements RecursivePacka } List<Path> roots = new ArrayList<>(); - if (repository.isDefault()) { + if (repository.isMain()) { roots.addAll(pkgPath.getPathEntries()); } else { RepositoryDirectoryValue repositoryValue = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java index 40210495c4..90aee2df45 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java @@ -569,6 +569,8 @@ public class PackageFunction implements SkyFunction { Environment env, SkylarkImportLookupFunction skylarkImportLookupFunctionForInlining) throws PackageFunctionException, InterruptedException { + Preconditions.checkArgument(!packageId.getRepository().isDefault()); + ImmutableList<SkylarkImport> imports = buildFileAST.getImports(); Map<String, Extension> importMap = Maps.newHashMapWithExpectedSize(imports.size()); ImmutableList.Builder<SkylarkFileDependency> fileDependencies = ImmutableList.builder(); @@ -803,7 +805,7 @@ public class PackageFunction implements SkyFunction { - label.getPackageFragment().segmentCount(), labelNameFragment.segmentCount()); message += " (perhaps you meant to put the colon here: '"; - if (containingPkg.getRepository().isDefault()) { + if (containingPkg.getRepository().isDefault() || containingPkg.getRepository().isMain()) { message += "//"; } message += containingPkg + ":" + labelNameInContainingPackage + "'?)"; @@ -1245,7 +1247,7 @@ public class PackageFunction implements SkyFunction { } static boolean isDefaultsPackage(PackageIdentifier packageIdentifier) { - return packageIdentifier.getRepository().isDefault() + return packageIdentifier.getRepository().isMain() && packageIdentifier.getPackageFragment().equals(DEFAULTS_PACKAGE_NAME); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java index 9a53dd317b..e4d9dd50df 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java @@ -54,8 +54,7 @@ public class PackageLookupFunction implements SkyFunction { return PackageLookupValue.success(pkgLocator.getPathEntries().get(0)); } - if (!packageKey.getRepository().equals(PackageIdentifier.MAIN_REPOSITORY_NAME) - && !packageKey.getRepository().isDefault()) { + if (!packageKey.getRepository().isMain()) { return computeExternalPackageLookupValue(skyKey, env, packageKey); } else if (packageKey.equals(Label.EXTERNAL_PACKAGE_IDENTIFIER)) { return computeWorkspaceLookupValue(env, packageKey); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java index 9460b853bd..e9d5bf5100 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java @@ -93,10 +93,11 @@ public abstract class PackageLookupValue implements SkyValue { static SkyKey key(PathFragment directory) { Preconditions.checkArgument(!directory.isAbsolute(), directory); - return key(PackageIdentifier.createInDefaultRepo(directory)); + return key(PackageIdentifier.createInMainRepo(directory)); } public static SkyKey key(PackageIdentifier pkgIdentifier) { + Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault()); return SkyKey.create(SkyFunctions.PACKAGE_LOOKUP, pkgIdentifier); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java index 840a4c8ec2..d637a7fecf 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java @@ -54,6 +54,7 @@ public class PackageValue implements NotComparableSkyValue { } public static SkyKey key(PackageIdentifier pkgIdentifier) { + Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault()); return SkyKey.create(SkyFunctions.PACKAGE, pkgIdentifier); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java index 2261b77878..9caa115f4a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java @@ -223,7 +223,7 @@ public class PrepareDepsOfPatternFunction implements SkyFunction { rulesOnly ? FilteringPolicies.RULES_ONLY : FilteringPolicies.NO_FILTER; PathFragment pathFragment = TargetPatternResolverUtil.getPathFragment(directory); List<Path> roots = new ArrayList<>(); - if (repository.isDefault()) { + if (repository.isMain()) { roots.addAll(pkgPath.getPathEntries()); } else { RepositoryDirectoryValue repositoryValue = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java index ce9a912cdf..a32e88b7a5 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java @@ -152,7 +152,7 @@ abstract class RecursiveDirectoryTraversalFunction PackageIdentifier packageId = PackageIdentifier.create( recursivePkgKey.getRepository(), rootRelativePath); - if (packageId.getRepository().isDefault() + if ((packageId.getRepository().isDefault() || packageId.getRepository().isMain()) && fileValue.isSymlink() && fileValue.getUnresolvedLinkTarget().startsWith(directories.getOutputBase().asFragment())) { // Symlinks back to the output base are not traversed so that we avoid convenience symlinks. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java index b318519163..9bec1eeb25 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java @@ -85,6 +85,7 @@ public class RecursivePkgValue implements SkyValue { ImmutableSet<PathFragment> excludedPaths) { PathFragment.checkAllPathsAreUnder(excludedPaths, rootedPath.getRelativePath()); + Preconditions.checkState(!repositoryName.isDefault()); this.repositoryName = repositoryName; this.rootedPath = Preconditions.checkNotNull(rootedPath); this.excludedPaths = Preconditions.checkNotNull(excludedPaths); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index f4ece81d97..b948490519 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -710,7 +710,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { execPath.getParentDirectory(), "Must pass in files, not root directory"); Preconditions.checkArgument(!parent.isAbsolute(), execPath); packageKeys.add(ContainingPackageLookupValue.key( - PackageIdentifier.createInDefaultRepo(parent))); + PackageIdentifier.createInMainRepo(parent))); } EvaluationResult<ContainingPackageLookupValue> result; @@ -736,7 +736,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { Map<PathFragment, Root> roots = new HashMap<>(); for (PathFragment execPath : execPaths) { ContainingPackageLookupValue value = result.get(ContainingPackageLookupValue.key( - PackageIdentifier.createInDefaultRepo(execPath.getParentDirectory()))); + PackageIdentifier.createInMainRepo(execPath.getParentDirectory()))); if (value.hasContainingPackage()) { roots.put(execPath, Root.asSourceRoot(value.getContainingPackageRoot())); } else { @@ -1552,6 +1552,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { * Returns whether the given package should be consider deleted and thus should be ignored. */ public boolean isPackageDeleted(PackageIdentifier packageName) { + Preconditions.checkState(!packageName.getRepository().isDefault(), + "package must be absolute: %s", packageName); return deletedPackages.get().contains(packageName); } @@ -1586,7 +1588,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { workingDirectory), packageCacheOptions.defaultVisibility, packageCacheOptions.showLoadingProgress, packageCacheOptions.globbingThreads, defaultsPackageContents, commandId); - setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.deletedPackages)); + setDeletedPackages(packageCacheOptions.getDeletedPackages()); incrementalBuildMonitor = new SkyframeIncrementalBuildMonitor(); invalidateTransientErrors(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java index 2b1f76c2d4..47ee3efcac 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java @@ -232,7 +232,7 @@ public class SkylarkImportLookupFunction implements SkyFunction { for (PathFragment importPath : pathsToLookup) { PathFragment relativeImportPath = importPath.toRelative(); PackageIdentifier pkgToLookUp = - PackageIdentifier.createInDefaultRepo(relativeImportPath.getParentDirectory()); + PackageIdentifier.createInMainRepo(relativeImportPath.getParentDirectory()); lookupMap.put(ContainingPackageLookupValue.key(pkgToLookUp), importPath); } @@ -303,6 +303,8 @@ public class SkylarkImportLookupFunction implements SkyFunction { static ImmutableMap<String, Label> findLabelsForLoadStatements( ImmutableCollection<SkylarkImport> imports, Label containingFileLabel, Environment env) throws SkylarkImportFailedException { + Preconditions.checkArgument( + !containingFileLabel.getPackageIdentifier().getRepository().isDefault()); Map<String, Label> outputMap = Maps.newHashMapWithExpectedSize(imports.size()); // Filter relative vs. absolute paths. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java index 2fbaf10baa..201e8fcab5 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java @@ -69,6 +69,7 @@ public class SkylarkImportLookupValue implements SkyValue { public SkylarkImportLookupKey(Label importLabel, boolean inWorkspace) { Preconditions.checkNotNull(importLabel); + Preconditions.checkArgument(!importLabel.getPackageIdentifier().getRepository().isDefault()); this.importLabel = importLabel; this.inWorkspace = inWorkspace; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java index 9c39849040..f1aa03dadc 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -45,6 +46,7 @@ public final class TargetMarkerValue implements SkyValue { @ThreadSafe public static SkyKey key(Label label) { + Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); return SkyKey.create(SkyFunctions.TARGET_MARKER, label); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java index d8e9b26798..6fb4fcf059 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.NoSuchTargetException; +import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -170,6 +171,7 @@ public class TransitiveTargetValue implements SkyValue { @ThreadSafe public static SkyKey key(Label label) { + Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); return SkyKey.create(SkyFunctions.TRANSITIVE_TARGET, label); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java index 59252d8f3f..2070ff2b66 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java @@ -125,6 +125,7 @@ public class TransitiveTraversalValue implements SkyValue { @ThreadSafe public static SkyKey key(Label label) { + Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); return SkyKey.create(SkyFunctions.TRANSITIVE_TRAVERSAL, label); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java index 8536558087..ea6f4dc544 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; -import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.Package.LegacyBuilder; import com.google.devtools.build.lib.packages.Package.NameConflictException; @@ -44,6 +44,7 @@ public class WorkspaceFileFunction implements SkyFunction { private final PackageFactory packageFactory; private final BlazeDirectories directories; private final RuleClassProvider ruleClassProvider; + private static final PackageIdentifier rootPackage = PackageIdentifier.createInMainRepo(""); public WorkspaceFileFunction( RuleClassProvider ruleClassProvider, @@ -105,7 +106,7 @@ public class WorkspaceFileFunction implements SkyFunction { BuildFileAST ast = workspaceASTValue.getASTs().get(key.getIndex()); PackageFunction.SkylarkImportResult importResult = PackageFunction.fetchImportsFromBuildFile( - repoWorkspace, Label.EXTERNAL_PACKAGE_IDENTIFIER, ast, env, null); + repoWorkspace, rootPackage, ast, env, null); if (importResult == null) { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java index 2edd38fc3b..8a1bb7eaf5 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java @@ -210,7 +210,7 @@ public class SkylarkImports { // Absolute label. Label importLabel; try { - importLabel = Label.parseAbsolute(importString); + importLabel = Label.parseAbsolute(importString, false); } catch (LabelSyntaxException e) { throw new SkylarkImportSyntaxException(INVALID_LABEL_PREFIX + e.getMessage()); } |