diff options
Diffstat (limited to 'src/main/java/com')
4 files changed, 39 insertions, 7 deletions
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 2404b99436..c10608166c 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 @@ -386,8 +386,9 @@ public class PackageFunction implements SkyFunction { return getExternalPackage(env, packageLookupValue.getRoot()); } + PathFragment buildFileFragment = packageNameFragment.getChild("BUILD"); RootedPath buildFileRootedPath = RootedPath.toRootedPath(packageLookupValue.getRoot(), - packageNameFragment.getChild("BUILD")); + buildFileFragment); FileValue buildFileValue; try { buildFileValue = (FileValue) env.getValueOrThrow(FileValue.key(buildFileRootedPath), @@ -455,8 +456,8 @@ public class PackageFunction implements SkyFunction { throw new PackageFunctionException(new BuildFileContainsErrorsException( packageName, e.getMessage()), Transience.TRANSIENT); } - SkylarkImportResult importResult = fetchImportsFromBuildFile( - buildFilePath, packageId.getRepository(), preludeStatements, inputSource, packageName, env); + SkylarkImportResult importResult = fetchImportsFromBuildFile(buildFilePath, buildFileFragment, + packageId.getRepository(), preludeStatements, inputSource, packageName, env); if (importResult == null) { return null; } @@ -506,7 +507,8 @@ public class PackageFunction implements SkyFunction { return new PackageValue(pkg); } - private SkylarkImportResult fetchImportsFromBuildFile(Path buildFilePath, RepositoryName repo, + private SkylarkImportResult fetchImportsFromBuildFile(Path buildFilePath, + PathFragment buildFileFragment, RepositoryName repo, List<Statement> preludeStatements, ParserInputSource inputSource, String packageName, Environment env) throws PackageFunctionException { StoredEventHandler eventHandler = new StoredEventHandler(); @@ -527,7 +529,8 @@ public class PackageFunction implements SkyFunction { ImmutableList.Builder<SkylarkFileDependency> fileDependencies = ImmutableList.builder(); try { for (PathFragment importFile : imports) { - SkyKey importsLookupKey = SkylarkImportLookupValue.key(repo, importFile); + SkyKey importsLookupKey = + SkylarkImportLookupValue.key(repo, buildFileFragment, importFile); SkylarkImportLookupValue importLookupValue = (SkylarkImportLookupValue) env.getValueOrThrow(importsLookupKey, SkylarkImportFailedException.class, InconsistentFilesystemException.class, ASTLookupInputException.class, 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 02d41e6c92..e151140640 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 @@ -83,7 +83,8 @@ public class SkylarkImportLookupFunction implements SkyFunction { // TODO(bazel-team): Refactor this code and PackageFunction to reduce code duplications. for (PathFragment importFile : ast.getImports()) { try { - SkyKey importsLookupKey = SkylarkImportLookupValue.key(arg.getRepository(), importFile); + SkyKey importsLookupKey = + SkylarkImportLookupValue.key(arg.getRepository(), file, importFile); SkylarkImportLookupValue importsLookupValue; importsLookupValue = (SkylarkImportLookupValue) env.getValueOrThrow( importsLookupKey, ASTLookupInputException.class); 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 3c87431129..fc46f78398 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 @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.packages.PackageIdentifier; import com.google.devtools.build.lib.packages.PackageIdentifier.RepositoryName; @@ -56,11 +57,28 @@ public class SkylarkImportLookupValue implements SkyValue { return dependency; } + @VisibleForTesting static SkyKey key(PackageIdentifier pkgIdentifier) throws ASTLookupInputException { return key(pkgIdentifier.getRepository(), pkgIdentifier.getPackageFragment()); } - static SkyKey key(RepositoryName repo, PathFragment fileToImport) throws ASTLookupInputException { + static SkyKey key(RepositoryName repo, PathFragment fromFile, PathFragment fileToImport) + throws ASTLookupInputException { + PathFragment computedPath; + if (fileToImport.isAbsolute()) { + computedPath = fileToImport.toRelative(); + } else if (fileToImport.segmentCount() > 1) { + // TODO(bazel-team): we treat paths with more then 1 segments as absolute paths + // for a transition period. Remove this after the transition is over. + computedPath = fileToImport; + } else { + computedPath = fromFile.getParentDirectory().getRelative(fileToImport); + } + return key(repo, computedPath); + } + + private static SkyKey key(RepositoryName repo, PathFragment fileToImport) + throws ASTLookupInputException { // Skylark import lookup keys need to be valid AST file lookup keys. ASTFileLookupValue.checkInputArgument(fileToImport); return new SkyKey( diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java index 1ee65a82b2..8336dc49da 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.vfs; import com.google.common.base.Function; +import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; @@ -587,6 +588,15 @@ public final class PathFragment implements Comparable<PathFragment>, Serializabl } /** + * Returns a relative PathFragment created from this absolute PathFragment using the + * same segments and drive letter. + */ + public PathFragment toRelative() { + Preconditions.checkArgument(isAbsolute); + return new PathFragment(driveLetter, false, segments); + } + + /** * Given a path, returns the Windows drive letter ('X'), or an null character if no volume * name was specified. */ |