diff options
author | 2017-09-06 17:51:18 +0200 | |
---|---|---|
committer | 2017-09-07 09:57:12 +0200 | |
commit | 4a12e66757a5d12080744c7289342db1a0f67df7 (patch) | |
tree | 3f5dfa0b66a3004c2d22ab2a9983b998b718be0d /src/main/java/com | |
parent | 313a0e04eb7c173359b1e18a6cbe5dd5915bb0a8 (diff) |
Update PackageLookupFunction to report the corrected label when a
package crosses into a local repository.
Part of #3553.
Change-Id: Ib21de0a1843e72055c53ef34922d69290aee72ed
PiperOrigin-RevId: 167726591
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java | 10 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java | 58 |
2 files changed, 65 insertions, 3 deletions
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 c0a115ad6c..09fd17d974 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 @@ -229,9 +229,13 @@ public class PackageLookupFunction implements SkyFunction { if (localRepository.exists() && !localRepository.getRepository().equals(packageIdentifier.getRepository())) { // There is a repository mismatch, this is an error. - // TODO(jcater): Work out the correct package name for this error message. - return PackageLookupValue.invalidPackageName( - "Package crosses into repository " + localRepository.getRepository().getName()); + // The correct package path is the one originally given, minus the part that is the local + // repository. + PathFragment packagePathUnderExecRoot = packageIdentifier.getPathUnderExecRoot(); + PathFragment remainingPath = packagePathUnderExecRoot.relativeTo(localRepository.getPath()); + PackageIdentifier correctPackage = + PackageIdentifier.create(localRepository.getRepository(), remainingPath); + return PackageLookupValue.incorrectRepositoryReference(packageIdentifier, correctPackage); } // There's no local repository, keep going. 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 875edb041c..c1f9ba2a9b 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 @@ -117,6 +117,11 @@ public abstract class PackageLookupValue implements SkyValue { return new InvalidNamePackageLookupValue(errorMsg); } + public static PackageLookupValue incorrectRepositoryReference( + PackageIdentifier invalidPackage, PackageIdentifier correctPackage) { + return new IncorrectRepositoryReferencePackageLookupValue(invalidPackage, correctPackage); + } + /** * For a successful package lookup, returns the root (package path entry) that the package * resides in. @@ -280,6 +285,59 @@ public abstract class PackageLookupValue implements SkyValue { } } + /** Value indicating the package name was in error. */ + public static class IncorrectRepositoryReferencePackageLookupValue + extends UnsuccessfulPackageLookupValue { + + private final PackageIdentifier invalidPackageIdentifier; + private final PackageIdentifier correctedPackageIdentifier; + + private IncorrectRepositoryReferencePackageLookupValue( + PackageIdentifier invalidPackageIdentifier, PackageIdentifier correctedPackageIdentifier) { + this.invalidPackageIdentifier = invalidPackageIdentifier; + this.correctedPackageIdentifier = correctedPackageIdentifier; + } + + public PackageIdentifier getInvalidPackageIdentifier() { + return invalidPackageIdentifier; + } + + public PackageIdentifier getCorrectedPackageIdentifier() { + return correctedPackageIdentifier; + } + + @Override + ErrorReason getErrorReason() { + return ErrorReason.INVALID_PACKAGE_NAME; + } + + @Override + public String getErrorMsg() { + return String.format( + "Invalid package reference %s crosses into repository %s:" + + " did you mean to use %s instead?", + invalidPackageIdentifier, + correctedPackageIdentifier.getRepository(), + correctedPackageIdentifier); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof IncorrectRepositoryReferencePackageLookupValue)) { + return false; + } + IncorrectRepositoryReferencePackageLookupValue other = + (IncorrectRepositoryReferencePackageLookupValue) obj; + return Objects.equal(invalidPackageIdentifier, other.invalidPackageIdentifier) + && Objects.equal(correctedPackageIdentifier, other.correctedPackageIdentifier); + } + + @Override + public int hashCode() { + return Objects.hashCode(invalidPackageIdentifier, correctedPackageIdentifier); + } + } + /** Marker value for a deleted package. */ public static class DeletedPackageLookupValue extends UnsuccessfulPackageLookupValue { |