Don't keep packages in the default repository around after loading.

Previously, this would get thrown when referring to the same package
from both the main and default repositories:
java.lang.IllegalArgumentException: Multiple entries with same key: tools/cpp=/home/brian/971-Robot-Code and tools/cpp=/home/brian/971-Robot-Code
	at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:136)
	at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:98)
	at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:84)
	at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:295)
	at com.google.devtools.build.lib.buildtool.BuildTool.transformPackageRoots(BuildTool.java:301)
	at com.google.devtools.build.lib.buildtool.BuildTool.buildTargets(BuildTool.java:209)
	at com.google.devtools.build.lib.buildtool.BuildTool.processRequest(BuildTool.java:334)
	at com.google.devtools.build.lib.runtime.commands.TestCommand.doTest(TestCommand.java:119)
	at com.google.devtools.build.lib.runtime.commands.TestCommand.exec(TestCommand.java:104)
	at com.google.devtools.build.lib.runtime.BlazeCommandDispatcher.exec(BlazeCommandDispatcher.java:371)
	at com.google.devtools.build.lib.runtime.BlazeRuntime$3.exec(BlazeRuntime.java:1016)
	at com.google.devtools.build.lib.server.RPCService.executeRequest(RPCService.java:65)
	at com.google.devtools.build.lib.server.RPCServer.executeRequest(RPCServer.java:434)
	at com.google.devtools.build.lib.server.RPCServer.serve(RPCServer.java:229)
	at com.google.devtools.build.lib.runtime.BlazeRuntime.serverMain(BlazeRuntime.java:975)
	at com.google.devtools.build.lib.runtime.BlazeRuntime.main(BlazeRuntime.java:772)
	at com.google.devtools.build.lib.bazel.BazelMain.main(BazelMain.java:55)

And this would get thrown for any packages in the main repository loaded
from other repositories:
java.lang.RuntimeException: Unrecoverable error while evaluating node 'PACKAGE:@//tools/build_rules/go/toolchain' (requested by nodes )
	at com.google.devtools.build.skyframe.ParallelEvaluator$Evaluate.run(ParallelEvaluator.java:982)
	at com.google.devtools.build.lib.concurrent.AbstractQueueVisitor$WrappedRunnable.run(AbstractQueueVisitor.java:499)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Invalid BUILD file name for package '@//tools/build_rules/go/toolchain': /home/brian/bazel/tools/build_rules/go/toolchain/BUILD
	at com.google.devtools.build.lib.packages.Package.finishInit(Package.java:299)
	at com.google.devtools.build.lib.packages.Package$Builder.finishBuild(Package.java:1308)
	at com.google.devtools.build.lib.skyframe.PackageFunction.compute(PackageFunction.java:501)
	at com.google.devtools.build.skyframe.ParallelEvaluator$Evaluate.run(ParallelEvaluator.java:933)
	... 4 more

Sponsor's comment: note the abundance of new Label.resolveRepositoryRelative() calls. They are ugly, but it's only making existing ugliness explicit. Yes, we should fix it, especially in the implementation of configurable attributes.

Refs #940

--
Change-Id: I8bd7f7b00bec58a7157507595421bc50c81b404c
Reviewed-on: https://bazel-review.googlesource.com/#/c/2591
MOS_MIGRATED_REVID=117429733
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 f8c1a83..c405efa 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 @@
       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 @@
         // 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 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 @@
 
       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 @@
             + "' 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;