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
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 2404b99..c106081 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 @@
       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 @@
       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 @@
     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 @@
     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 02d41e6..e151140 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 @@
     // 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 3c87431..fc46f78 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 @@
     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 1ee65a8..8336dc4 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 @@
   }
 
   /**
+   * 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.
    */