Allow labels like @foo//:foo to be shortened @foo

Fixes #1924

RELNOTES: Labels like "@foo//:foo" can now be written as "@foo" in build files

--
MOS_MIGRATED_REVID=139848658
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index b5a6990..753909c 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -81,6 +81,7 @@
    * <pre>
    * //foo/bar
    * //foo/bar:quux
+   * {@literal @}foo
    * {@literal @}foo//bar
    * {@literal @}foo//bar:baz
    * </pre>
@@ -96,6 +97,7 @@
    * <pre>
    * //foo/bar
    * //foo/bar:quux
+   * {@literal @}foo
    * {@literal @}foo//bar
    * {@literal @}foo//bar:baz
    * </pre>
@@ -110,6 +112,9 @@
     if (packageStartPos > 0) {
       repo = absName.substring(0, packageStartPos);
       absName = absName.substring(packageStartPos);
+    } else if (absName.startsWith("@")) {
+      repo = absName;
+      absName = "//:" + absName.substring(1);
     }
     try {
       LabelValidator.PackageAndTarget labelParts = LabelValidator.parseAbsoluteLabel(absName);
@@ -324,7 +329,7 @@
   public String getPackageName() {
     return packageIdentifier.getPackageFragment().getPathString();
   }
-  
+
   /**
    * Returns the execution root for the workspace, relative to the execroot (e.g., for label
    * {@code @repo//pkg:b}, it will returns {@code external/repo/pkg} and for label {@code //pkg:a},
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
index 47dd0b1..3766a76 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
@@ -21,13 +21,11 @@
 
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
+import java.util.regex.Pattern;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.regex.Pattern;
-
 /**
  * Tests for {@link Label}.
  */
@@ -55,6 +53,12 @@
       assertEquals("", l.getPackageName());
       assertEquals("bar", l.getName());
     }
+    {
+      Label l = Label.parseAbsolute("@foo");
+      assertEquals("@foo", l.getPackageIdentifier().getRepository().getName());
+      assertEquals("", l.getPackageName());
+      assertEquals("foo", l.getName());
+    }
   }
 
   private static String parseCommandLine(String label, String prefix) throws LabelSyntaxException {
@@ -249,6 +253,10 @@
       Label l = Label.parseAbsolute("//foo/bar");
       assertEquals("//foo/bar:bar", l.toString());
     }
+    {
+      Label l = Label.parseAbsolute("@foo");
+      assertEquals("@foo//:foo", l.toString());
+    }
   }
 
   @Test
@@ -434,7 +442,7 @@
           "invalid repository name 'foo': workspace names must start with '@'");
     }
   }
-  
+
   @Test
   public void testGetWorkspaceRoot() throws Exception {
     Label label = Label.parseAbsolute("//bar/baz");