Move RepositoryName to its own top-level class

As it's about to get more important in its own right.

The only change that isn't just moving code around is making
RepositoryName.validate package-private.

--
MOS_MIGRATED_REVID=112956571
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
index 7b83569..0900596 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
@@ -21,7 +21,7 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.actions.Artifact.SpecialArtifactType;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.Preconditions;
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
index 18a94b7..83a7ed1 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
@@ -22,7 +22,7 @@
 import com.google.common.hash.Hashing;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.bazel.rules.workspace.MavenJarRule;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.Rule;
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index b29e820..4c995eb 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -14,27 +14,14 @@
 
 package com.google.devtools.build.lib.cmdline;
 
-import com.google.common.base.Throwables;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.Interner;
 import com.google.common.collect.Interners;
-import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.Preconditions;
-import com.google.devtools.build.lib.util.StringCanonicalizer;
-import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.vfs.Canonicalizer;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectStreamException;
 import java.io.Serializable;
-import java.util.concurrent.ExecutionException;
-import java.util.regex.Pattern;
 
 import javax.annotation.concurrent.Immutable;
 
@@ -60,194 +47,6 @@
     return INTERNER.intern(new PackageIdentifier(repository, pkgName));
   }
 
-  /**
-   * A human-readable name for the repository.
-   */
-  public static final class RepositoryName implements Serializable {
-    private static final Pattern VALID_REPO_NAME = Pattern.compile("@[\\w\\-.]*");
-
-    /** Helper for serializing {@link RepositoryName}. */
-    private static final class SerializationProxy implements Serializable {
-      private RepositoryName repositoryName;
-
-      private SerializationProxy(RepositoryName repositoryName) {
-        this.repositoryName = repositoryName;
-      }
-
-      private void writeObject(ObjectOutputStream out) throws IOException {
-        out.writeObject(repositoryName.toString());
-      }
-
-      private void readObject(ObjectInputStream in)
-          throws IOException, ClassNotFoundException {
-        try {
-          repositoryName = RepositoryName.create((String) in.readObject());
-        } catch (LabelSyntaxException e) {
-          throw new IOException("Error serializing repository name: " + e.getMessage());
-        }
-      }
-
-      @SuppressWarnings("unused")
-      private void readObjectNoData() throws ObjectStreamException {
-      }
-
-      private Object readResolve() {
-        return repositoryName;
-      }
-    }
-
-    private void readObject(@SuppressWarnings("unused") ObjectInputStream in) throws IOException {
-      throw new IOException("Serialization is allowed only by proxy");
-    }
-
-    private Object writeReplace() {
-      return new SerializationProxy(this);
-    }
-
-    private static final LoadingCache<String, RepositoryName> repositoryNameCache =
-        CacheBuilder.newBuilder()
-          .weakValues()
-          .build(
-              new CacheLoader<String, RepositoryName> () {
-                @Override
-                public RepositoryName load(String name) throws LabelSyntaxException {
-                  String errorMessage = validate(name);
-                  if (errorMessage != null) {
-                    errorMessage = "invalid repository name '"
-                        + StringUtilities.sanitizeControlChars(name) + "': " + errorMessage;
-                    throw new LabelSyntaxException(errorMessage);
-                  }
-                  return new RepositoryName(StringCanonicalizer.intern(name));
-                }
-              });
-
-    /**
-     * Makes sure that name is a valid repository name and creates a new RepositoryName using it.
-     *
-     * @throws LabelSyntaxException if the name is invalid
-     */
-    public static RepositoryName create(String name) throws LabelSyntaxException {
-      try {
-        return repositoryNameCache.get(name);
-      } catch (ExecutionException e) {
-        Throwables.propagateIfInstanceOf(e.getCause(), LabelSyntaxException.class);
-        throw new IllegalStateException("Failed to create RepositoryName from " + name, e);
-      }
-    }
-
-    /**
-     * Extracts the repository name from a PathFragment that was created with
-     * {@code PackageIdentifier.getPathFragment}.
-     *
-     * @return a {@code Pair} of the extracted repository name and the path fragment with stripped
-     * of "external/"-prefix and repository name, or null if none was found or the repository name
-     * was invalid.
-     */
-    public static Pair<RepositoryName, PathFragment> fromPathFragment(PathFragment path) {
-      if (path.segmentCount() < 2 || !path.getSegment(0).equals(Label.EXTERNAL_PATH_PREFIX)) {
-        return null;
-      }
-      try {
-        RepositoryName repoName = RepositoryName.create("@" + path.getSegment(1));
-        PathFragment subPath = path.subFragment(2, path.segmentCount());
-        return Pair.of(repoName, subPath);
-      } catch (LabelSyntaxException e) {
-        return null;
-      }
-    }
-
-    private final String name;
-
-    private RepositoryName(String name) {
-      this.name = name;
-    }
-
-    /**
-     * Performs validity checking.  Returns null on success, an error message otherwise.
-     */
-    private static String validate(String name) {
-      if (name.isEmpty()) {
-        return null;
-      }
-
-      // Some special cases for more user-friendly error messages.
-      if (!name.startsWith("@")) {
-        return "workspace names must start with '@'";
-      }
-      if (name.equals("@.")) {
-        return "workspace names are not allowed to be '@.'";
-      }
-      if (name.equals("@..")) {
-        return "workspace names are not allowed to be '@..'";
-      }
-
-      if (!VALID_REPO_NAME.matcher(name).matches()) {
-        return "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'";
-      }
-
-      return null;
-    }
-
-    /**
-     * Returns the repository name without the leading "{@literal @}".  For the default repository,
-     * returns "".
-     */
-    public String strippedName() {
-      if (name.isEmpty()) {
-        return name;
-      }
-      return name.substring(1);
-    }
-
-    /**
-     * Returns if this is the default repository, that is, {@link #name} is "".
-     */
-    public boolean isDefault() {
-      return name.isEmpty();
-    }
-
-    /**
-     * Returns the repository name, with leading "{@literal @}" (or "" for the default repository).
-     */
-    // TODO(bazel-team): Use this over toString()- easier to track its usage.
-    public String getName() {
-      return name;
-    }
-
-    /**
-     * Returns the path at which this repository is mapped within the exec root.
-     */
-    public PathFragment getPathFragment() {
-      return isDefault()
-          ? PathFragment.EMPTY_FRAGMENT
-          : new PathFragment(Label.EXTERNAL_PATH_PREFIX).getRelative(strippedName());
-    }
-
-    /**
-     * Returns the repository name, with leading "{@literal @}" (or "" for the default repository).
-     */
-    @Override
-    public String toString() {
-      return name;
-    }
-
-    @Override
-    public boolean equals(Object object) {
-      if (this == object) {
-        return true;
-      }
-      if (!(object instanceof RepositoryName)) {
-        return false;
-      }
-      return name.equals(((RepositoryName) object).name);
-    }
-
-    @Override
-    public int hashCode() {
-      return name.hashCode();
-    }
-  }
-
   public static final String DEFAULT_REPOSITORY = "";
   public static final RepositoryName DEFAULT_REPOSITORY_NAME;
   public static final RepositoryName MAIN_REPOSITORY_NAME;
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
new file mode 100644
index 0000000..2aa253d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
@@ -0,0 +1,220 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.cmdline;
+
+import com.google.common.base.Throwables;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.util.StringCanonicalizer;
+import com.google.devtools.build.lib.util.StringUtilities;
+import com.google.devtools.build.lib.vfs.PathFragment;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.util.concurrent.ExecutionException;
+import java.util.regex.Pattern;
+
+/**
+ * A human-readable name for the repository.
+ */
+public final class RepositoryName implements Serializable {
+  private static final Pattern VALID_REPO_NAME = Pattern.compile("@[\\w\\-.]*");
+
+  /** Helper for serializing {@link RepositoryName}. */
+  private static final class SerializationProxy implements Serializable {
+    private RepositoryName repositoryName;
+
+    private SerializationProxy(RepositoryName repositoryName) {
+      this.repositoryName = repositoryName;
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+      out.writeObject(repositoryName.toString());
+    }
+
+    private void readObject(ObjectInputStream in)
+        throws IOException, ClassNotFoundException {
+      try {
+        repositoryName = RepositoryName.create((String) in.readObject());
+      } catch (LabelSyntaxException e) {
+        throw new IOException("Error serializing repository name: " + e.getMessage());
+      }
+    }
+
+    @SuppressWarnings("unused")
+    private void readObjectNoData() throws ObjectStreamException {
+    }
+
+    private Object readResolve() {
+      return repositoryName;
+    }
+  }
+
+  private void readObject(@SuppressWarnings("unused") ObjectInputStream in) throws IOException {
+    throw new IOException("Serialization is allowed only by proxy");
+  }
+
+  private Object writeReplace() {
+    return new SerializationProxy(this);
+  }
+
+  private static final LoadingCache<String, RepositoryName> repositoryNameCache =
+      CacheBuilder.newBuilder()
+        .weakValues()
+        .build(
+            new CacheLoader<String, RepositoryName>() {
+              @Override
+              public RepositoryName load(String name) throws LabelSyntaxException {
+                String errorMessage = validate(name);
+                if (errorMessage != null) {
+                  errorMessage = "invalid repository name '"
+                      + StringUtilities.sanitizeControlChars(name) + "': " + errorMessage;
+                  throw new LabelSyntaxException(errorMessage);
+                }
+                return new RepositoryName(StringCanonicalizer.intern(name));
+              }
+            });
+
+  /**
+   * Makes sure that name is a valid repository name and creates a new RepositoryName using it.
+   *
+   * @throws LabelSyntaxException if the name is invalid
+   */
+  public static RepositoryName create(String name) throws LabelSyntaxException {
+    try {
+      return repositoryNameCache.get(name);
+    } catch (ExecutionException e) {
+      Throwables.propagateIfInstanceOf(e.getCause(), LabelSyntaxException.class);
+      throw new IllegalStateException("Failed to create RepositoryName from " + name, e);
+    }
+  }
+
+  /**
+   * Extracts the repository name from a PathFragment that was created with
+   * {@code PackageIdentifier.getPathFragment}.
+   *
+   * @return a {@code Pair} of the extracted repository name and the path fragment with stripped
+   * of "external/"-prefix and repository name, or null if none was found or the repository name
+   * was invalid.
+   */
+  public static Pair<RepositoryName, PathFragment> fromPathFragment(PathFragment path) {
+    if (path.segmentCount() < 2 || !path.getSegment(0).equals(Label.EXTERNAL_PATH_PREFIX)) {
+      return null;
+    }
+    try {
+      RepositoryName repoName = RepositoryName.create("@" + path.getSegment(1));
+      PathFragment subPath = path.subFragment(2, path.segmentCount());
+      return Pair.of(repoName, subPath);
+    } catch (LabelSyntaxException e) {
+      return null;
+    }
+  }
+
+  private final String name;
+
+  private RepositoryName(String name) {
+    this.name = name;
+  }
+
+  /**
+   * Performs validity checking.  Returns null on success, an error message otherwise.
+   */
+  static String validate(String name) {
+    if (name.isEmpty()) {
+      return null;
+    }
+
+    // Some special cases for more user-friendly error messages.
+    if (!name.startsWith("@")) {
+      return "workspace names must start with '@'";
+    }
+    if (name.equals("@.")) {
+      return "workspace names are not allowed to be '@.'";
+    }
+    if (name.equals("@..")) {
+      return "workspace names are not allowed to be '@..'";
+    }
+
+    if (!VALID_REPO_NAME.matcher(name).matches()) {
+      return "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'";
+    }
+
+    return null;
+  }
+
+  /**
+   * Returns the repository name without the leading "{@literal @}".  For the default repository,
+   * returns "".
+   */
+  public String strippedName() {
+    if (name.isEmpty()) {
+      return name;
+    }
+    return name.substring(1);
+  }
+
+  /**
+   * Returns if this is the default repository, that is, {@link #name} is "".
+   */
+  public boolean isDefault() {
+    return name.isEmpty();
+  }
+
+  /**
+   * Returns the repository name, with leading "{@literal @}" (or "" for the default repository).
+   */
+  // TODO(bazel-team): Use this over toString()- easier to track its usage.
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * Returns the path at which this repository is mapped within the exec root.
+   */
+  public PathFragment getPathFragment() {
+    return isDefault()
+        ? PathFragment.EMPTY_FRAGMENT
+        : new PathFragment(Label.EXTERNAL_PATH_PREFIX).getRelative(strippedName());
+  }
+
+  /**
+   * Returns the repository name, with leading "{@literal @}" (or "" for the default repository).
+   */
+  @Override
+  public String toString() {
+    return name;
+  }
+
+  @Override
+  public boolean equals(Object object) {
+    if (this == object) {
+      return true;
+    }
+    if (!(object instanceof RepositoryName)) {
+      return false;
+    }
+    return name.equals(((RepositoryName) object).name);
+  }
+
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+}
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 254be3c..5617c94 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
@@ -21,7 +21,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException;
 import com.google.devtools.build.lib.cmdline.LabelValidator.PackageAndTarget;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.util.BatchCallback;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.StringUtilities;
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java
index 6cf7ddc..05c914a 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.cmdline;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.util.BatchCallback;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
index 808085b..0daec5d 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
@@ -15,7 +15,7 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.Package;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
index 2d8ecd3..903fc63 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Rule;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index 48a8eb4..6979a42 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
 import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java
index bfa8c1c..21d4eb2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java
@@ -17,7 +17,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey;
 import com.google.devtools.build.lib.vfs.PathFragment;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java
index 3d0b5b6..f015509 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java
@@ -16,7 +16,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey;
 import com.google.devtools.build.lib.vfs.PathFragment;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
index db6639d..a388389 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
index c099dcb..f5c3ada 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
@@ -24,7 +24,7 @@
 import com.google.common.collect.Sets.SetView;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.cmdline.TargetPattern;
 import com.google.devtools.build.lib.cmdline.TargetPattern.Type;
 import com.google.devtools.build.lib.events.Event;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
index a2e3910..f98a01d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
@@ -17,7 +17,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.cmdline.ResolvedTargets;
 import com.google.devtools.build.lib.cmdline.TargetParsingException;
 import com.google.devtools.build.lib.cmdline.TargetPattern;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java
index ac8801c..b5b560a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java
@@ -16,7 +16,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.cmdline.ResolvedTargets;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java
index 9b726c3..136a94b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java
@@ -15,7 +15,7 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
 import com.google.devtools.build.lib.pkgcache.FilteringPolicy;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
index 9746831..ce9a912 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
index 5764b6c..b24ee7a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
@@ -21,7 +21,7 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.cmdline.ResolvedTargets;
 import com.google.devtools.build.lib.cmdline.TargetParsingException;
 import com.google.devtools.build.lib.cmdline.TargetPatternResolver;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java
index dbbbe8c..a701802 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java
@@ -15,7 +15,7 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
index 019de51..8919578 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java
index 4aea6ea..e647b81 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.base.Objects;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
index 17aecaf..2e43b80 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
@@ -17,9 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
 
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
 import org.junit.Test;
@@ -54,34 +52,6 @@
     assertThat(mainA.getRepository()).isEqualTo(PackageIdentifier.MAIN_REPOSITORY_NAME);
   }
 
-  public void assertNotValid(String name, String expectedMessage) {
-    try {
-      RepositoryName.create(name);
-      fail();
-    } catch (LabelSyntaxException expected) {
-      assertThat(expected.getMessage()).contains(expectedMessage);
-    }
-  }
-
-  @Test
-  public void testValidateRepositoryName() throws Exception {
-    assertEquals("@foo", RepositoryName.create("@foo").toString());
-    assertThat(RepositoryName.create("").toString()).isEmpty();
-    assertEquals("@foo_bar", RepositoryName.create("@foo_bar").toString());
-    assertEquals("@foo-bar", RepositoryName.create("@foo-bar").toString());
-    assertEquals("@foo.bar", RepositoryName.create("@foo.bar").toString());
-    assertEquals("@..foo", RepositoryName.create("@..foo").toString());
-    assertEquals("@foo..", RepositoryName.create("@foo..").toString());
-    assertEquals("@.foo", RepositoryName.create("@.foo").toString());
-
-    assertNotValid("x", "workspace names must start with '@'");
-    assertNotValid("@.", "workspace names are not allowed to be '@.'");
-    assertNotValid("@..", "workspace names are not allowed to be '@..'");
-    assertNotValid("@foo/bar", "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'");
-    assertNotValid("@foo@", "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'");
-    assertNotValid("@foo\0", "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'");
-  }
-
   @Test
   public void testToString() throws Exception {
     PackageIdentifier local = PackageIdentifier.create("", new PathFragment("bar/baz"));
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java
new file mode 100644
index 0000000..b84af2f
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java
@@ -0,0 +1,59 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.cmdline;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for @{link RepositoryName}.
+ */
+@RunWith(JUnit4.class)
+public class RepositoryNameTest {
+
+  public void assertNotValid(String name, String expectedMessage) {
+    try {
+      RepositoryName.create(name);
+      fail();
+    } catch (LabelSyntaxException expected) {
+      assertThat(expected.getMessage()).contains(expectedMessage);
+    }
+  }
+
+  @Test
+  public void testValidateRepositoryName() throws Exception {
+    assertEquals("@foo", RepositoryName.create("@foo").toString());
+    assertThat(RepositoryName.create("").toString()).isEmpty();
+    assertEquals("@foo_bar", RepositoryName.create("@foo_bar").toString());
+    assertEquals("@foo-bar", RepositoryName.create("@foo-bar").toString());
+    assertEquals("@foo.bar", RepositoryName.create("@foo.bar").toString());
+    assertEquals("@..foo", RepositoryName.create("@..foo").toString());
+    assertEquals("@foo..", RepositoryName.create("@foo..").toString());
+    assertEquals("@.foo", RepositoryName.create("@.foo").toString());
+
+    assertNotValid("x", "workspace names must start with '@'");
+    assertNotValid("@.", "workspace names are not allowed to be '@.'");
+    assertNotValid("@..", "workspace names are not allowed to be '@..'");
+    assertNotValid("@foo/bar", "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'");
+    assertNotValid("@foo@", "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'");
+    assertNotValid("@foo\0", "workspace names may contain only A-Z, a-z, 0-9, '-', '_' and '.'");
+  }
+
+}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index 0f61571..ae89788 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
index 61ec920..2b264e3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.RootedPath;
diff --git a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java
index 8b343dc..68b1530 100644
--- a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java
+++ b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/Resolver.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.bazel.BazelMain;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
@@ -98,9 +98,9 @@
           || target.getTargetKind().startsWith("source ")) {
         continue;
       } else if (target.getTargetKind().startsWith("maven_jar ")) {
-        PackageIdentifier.RepositoryName repositoryName;
+        RepositoryName repositoryName;
         try {
-          repositoryName = PackageIdentifier.RepositoryName.create("@" + target.getName());
+          repositoryName = RepositoryName.create("@" + target.getName());
         } catch (LabelSyntaxException e) {
           handler.handle(Event.error(location, "Invalid repository name for " + target + ": "
               + e.getMessage()));