aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-02-09 14:42:21 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-02-09 14:42:21 +0000
commit9f212f7efffddf81a261be9bcd4e43cc1749a515 (patch)
tree256ce0139a220e2847a8fd4b683888496d5c42f6 /src/main
parent4fdd776a8177efd52fbdfc4e3a03ee498e4891ad (diff)
Skylark: enable relative paths in load statements. Only paths with 1 segment are treated as relative paths.
Obsolete tests are removed from ASTFileLookupFunctionTest. -- MOS_MIGRATED_REVID=85885578
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java10
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.
*/