Removes skyframe/serialization's dependency on cmdline and vfs. Instead, make cmdline and vfs depend on serialization. This allows a class to have a pointer to its codec, which simplifies automatic recursive composite codecs.

PiperOrigin-RevId: 178683500
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
index ac4a005..66c0f14 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
@@ -18,11 +18,11 @@
 import com.google.common.hash.HashCode;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
 import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathCodec;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -52,8 +52,7 @@
 
   // Include directory name, relative to execRoot/blaze-out/configuration.
   public static final String RELATIVE_INCLUDE_DIR = StringCanonicalizer.intern("include");
-  @VisibleForTesting
-  static final String DEFAULT_EXEC_ROOT = "default-exec-root";
+  @VisibleForTesting static final String DEFAULT_EXEC_ROOT = "default-exec-root";
 
   private final ServerDirectories serverDirectories;
   /** Workspace root and server CWD. */
@@ -67,10 +66,7 @@
   private final Path localOutputPath;
   private final String productName;
 
-  public BlazeDirectories(
-      ServerDirectories serverDirectories,
-      Path workspace,
-      String productName) {
+  public BlazeDirectories(ServerDirectories serverDirectories, Path workspace, String productName) {
     this.serverDirectories = serverDirectories;
     this.workspace = workspace;
     this.productName = productName;
@@ -94,38 +90,34 @@
   }
 
   /**
-   * Returns the base of the output tree, which hosts all build and scratch
-   * output for a user and workspace.
+   * Returns the base of the output tree, which hosts all build and scratch output for a user and
+   * workspace.
    */
   public Path getInstallBase() {
     return serverDirectories.getInstallBase();
   }
 
-  /**
-   * Returns the workspace directory, which is also the working dir of the server.
-   */
+  /** Returns the workspace directory, which is also the working dir of the server. */
   public Path getWorkspace() {
     return workspace;
   }
 
-  /**
-   * Returns if the workspace directory is a valid workspace.
-   */
+  /** Returns if the workspace directory is a valid workspace. */
   public boolean inWorkspace() {
     return this.workspace != null;
   }
 
   /**
-   * Returns the base of the output tree, which hosts all build and scratch
-   * output for a user and workspace.
+   * Returns the base of the output tree, which hosts all build and scratch output for a user and
+   * workspace.
    */
   public Path getOutputBase() {
     return serverDirectories.getOutputBase();
   }
 
   /**
-   * Returns the execution root for the main package. This is created before the workspace file
-   * has been read, so it has an incorrect path.  Use {@link #getExecRoot(String)} instead.
+   * Returns the execution root for the main package. This is created before the workspace file has
+   * been read, so it has an incorrect path. Use {@link #getExecRoot(String)} instead.
    */
   @Deprecated
   public Path getExecRoot() {
@@ -150,16 +142,12 @@
     return outputPath;
   }
 
-  /**
-   * Returns the output path used by this Blaze instance.
-   */
+  /** Returns the output path used by this Blaze instance. */
   public Path getOutputPath(String workspaceName) {
     return getExecRoot(workspaceName).getRelative(getRelativeOutputPath());
   }
 
-  /**
-   * Returns the local output path used by this Blaze instance.
-   */
+  /** Returns the local output path used by this Blaze instance. */
   public Path getLocalOutputPath() {
     return localOutputPath;
   }
@@ -172,10 +160,7 @@
     return execRoot.getRelative(getRelativeOutputPath()).getRelative("_tmp/action_outs");
   }
 
-  /**
-   * Returns the installed embedded binaries directory, under the shared
-   * installBase location.
-   */
+  /** Returns the installed embedded binaries directory, under the shared installBase location. */
   public Path getEmbeddedBinariesRoot() {
     return serverDirectories.getEmbeddedBinariesRoot();
   }
@@ -185,14 +170,13 @@
    * {@link BlazeDirectories} of this server instance. Nothing else should be placed here.
    */
   public Root getBuildDataDirectory(String workspaceName) {
-    return Root
-        .asDerivedRoot(getExecRoot(workspaceName), getOutputPath(workspaceName), true);
+    return Root.asDerivedRoot(getExecRoot(workspaceName), getOutputPath(workspaceName), true);
   }
 
- /**
-  * Returns the MD5 content hash of the blaze binary (includes deploy JAR, embedded binaries, and
-  * anything else that ends up in the install_base).
-  */
+  /**
+   * Returns the MD5 content hash of the blaze binary (includes deploy JAR, embedded binaries, and
+   * anything else that ends up in the install_base).
+   */
   public HashCode getInstallMD5() {
     return serverDirectories.getInstallMD5();
   }
@@ -206,8 +190,8 @@
   }
 
   /**
-   * Returns the output directory name, relative to the execRoot.
-   * TODO(bazel-team): (2011) make this private?
+   * Returns the output directory name, relative to the execRoot. TODO(bazel-team): (2011) make this
+   * private?
    */
   public static String getRelativeOutputPath(String productName) {
     return StringCanonicalizer.intern(productName + "-out");
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
index 3b62084..cf9e65e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
@@ -15,8 +15,8 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.vfs.PathCodec;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
index e296fb3..788e3ab 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
@@ -19,9 +19,9 @@
 import com.google.common.hash.HashCode;
 import com.google.common.hash.Hashing;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathCodec;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -62,38 +62,33 @@
   }
 
   private static HashCode checkMD5(HashCode hash) {
-    Preconditions.checkArgument(hash.bits() == Hashing.md5().bits(),
-                                "Hash '%s' has %s bits", hash, hash.bits());
+    Preconditions.checkArgument(
+        hash.bits() == Hashing.md5().bits(), "Hash '%s' has %s bits", hash, hash.bits());
     return hash;
   }
 
-  /**
-   * Returns the installation base directory. Currently used by info command only.
-   */
+  /** Returns the installation base directory. Currently used by info command only. */
   public Path getInstallBase() {
     return installBase;
   }
 
   /**
-   * Returns the base of the output tree, which hosts all build and scratch
-   * output for a user and workspace.
+   * Returns the base of the output tree, which hosts all build and scratch output for a user and
+   * workspace.
    */
   public Path getOutputBase() {
     return outputBase;
   }
 
-  /**
-   * Returns the installed embedded binaries directory, under the shared
-   * installBase location.
-   */
+  /** Returns the installed embedded binaries directory, under the shared installBase location. */
   public Path getEmbeddedBinariesRoot() {
     return installBase.getChild("_embedded_binaries");
   }
 
- /**
-  * Returns the MD5 content hash of the blaze binary (includes deploy JAR, embedded binaries, and
-  * anything else that ends up in the install_base).
-  */
+  /**
+   * Returns the MD5 content hash of the blaze binary (includes deploy JAR, embedded binaries, and
+   * anything else that ends up in the install_base).
+   */
   public HashCode getInstallMD5() {
     return installMD5;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
index 306eba1..2883d42 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
@@ -21,9 +21,11 @@
         "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
         "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//third_party:guava",
         "//third_party:jsr305",
+        "//third_party/protobuf:protobuf_java",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java b/src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java
similarity index 89%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
rename to src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java
index 89978ba..cda83db 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.cmdline;
 
-import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodec.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java
similarity index 83%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodec.java
rename to src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java
index 73aede6..8107714 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java
@@ -12,17 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.cmdline;
 
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.lib.vfs.PathFragmentCodec;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
 
 /** Custom serialization logic for {@link PackageIdentifier}s. */
-class PackageIdentifierCodec implements ObjectCodec<PackageIdentifier> {
+public class PackageIdentifierCodec implements ObjectCodec<PackageIdentifier> {
 
   private final RepositoryNameCodec repoNameCodec = new RepositoryNameCodec();
   private final PathFragmentCodec pathFragmentCodec = new PathFragmentCodec();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodec.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java
similarity index 62%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodec.java
rename to src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java
index c9d0976..67a6c55 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java
@@ -12,16 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.cmdline;
 
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.protobuf.ByteString;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
 
 /** Custom serialization for {@link RepositoryName}. */
-class RepositoryNameCodec implements ObjectCodec<RepositoryName> {
+public class RepositoryNameCodec implements ObjectCodec<RepositoryName> {
 
   @Override
   public Class<RepositoryName> getEncodedClass() {
@@ -48,9 +49,26 @@
     }
     try {
       // We can read the string we wrote back as bytes to avoid string decoding/copying.
-      return SerializationCommonUtils.deserializeRepoName(codedIn.readBytes());
+      return deserializeRepoName(codedIn.readBytes());
     } catch (LabelSyntaxException e) {
       throw new SerializationException("Failed to deserialize RepositoryName", e);
     }
   }
+
+  private static final ByteString DEFAULT_REPOSITORY =
+      ByteString.copyFromUtf8(RepositoryName.DEFAULT.getName());
+  private static final ByteString MAIN_REPOSITORY =
+      ByteString.copyFromUtf8(RepositoryName.MAIN.getName());
+
+  public static RepositoryName deserializeRepoName(ByteString repoNameBytes)
+      throws LabelSyntaxException {
+    // We expect MAIN_REPOSITORY the vast majority of the time, so check for it first.
+    if (repoNameBytes.equals(MAIN_REPOSITORY)) {
+      return RepositoryName.MAIN;
+    } else if (repoNameBytes.equals(DEFAULT_REPOSITORY)) {
+      return RepositoryName.DEFAULT;
+    } else {
+      return RepositoryName.create(repoNameBytes.toStringUtf8());
+    }
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index 14fb440..73a54fc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -25,11 +25,11 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelConverter;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelCodec;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
 import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
-import com.google.devtools.build.lib.skyframe.serialization.LabelCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -47,9 +47,7 @@
 import java.io.IOException;
 import java.util.List;
 
-/**
- * Command-line options for building for Apple platforms.
- */
+/** Command-line options for building for Apple platforms. */
 public class AppleCommandLineOptions extends FragmentOptions {
 
   @Option(
@@ -57,7 +55,7 @@
     defaultValue = "false",
     category = "experimental",
     documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
-    effectTags =  { OptionEffectTag.LOSES_INCREMENTAL_STATE, OptionEffectTag.BUILD_FILE_SEMANTICS },
+    effectTags = {OptionEffectTag.LOSES_INCREMENTAL_STATE, OptionEffectTag.BUILD_FILE_SEMANTICS},
     help = "Whether Apple rules must have a mandatory minimum_os_version attribute."
   )
   // TODO(b/37096178): This flag should be default-on and then be removed.
@@ -68,9 +66,10 @@
     defaultValue = "true",
     category = "experimental",
     documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
-    effectTags =  { OptionEffectTag.LOSES_INCREMENTAL_STATE, OptionEffectTag.BUILD_FILE_SEMANTICS },
-    help = "Whether Apple rules which control linking should propagate objc provider at the top "
-        + "level"
+    effectTags = {OptionEffectTag.LOSES_INCREMENTAL_STATE, OptionEffectTag.BUILD_FILE_SEMANTICS},
+    help =
+        "Whether Apple rules which control linking should propagate objc provider at the top "
+            + "level"
   )
   // TODO(b/32411441): This flag should be default-off and then be removed.
   public boolean objcProviderFromLinked;
@@ -181,19 +180,13 @@
   @VisibleForTesting public static final String DEFAULT_TVOS_SDK_VERSION = "9.0";
   @VisibleForTesting static final String DEFAULT_IOS_CPU = "x86_64";
 
-  /**
-   * The default watchos CPU value.
-   */
+  /** The default watchos CPU value. */
   public static final String DEFAULT_WATCHOS_CPU = "i386";
 
-  /**
-   * The default tvOS CPU value.
-   */
+  /** The default tvOS CPU value. */
   public static final String DEFAULT_TVOS_CPU = "x86_64";
 
-  /**
-   * The default macOS CPU value.
-   */
+  /** The default macOS CPU value. */
   public static final String DEFAULT_MACOS_CPU = "x86_64";
 
   @Option(
@@ -387,24 +380,27 @@
   )
   public boolean targetUsesAppleCrosstool;
 
-  /**
-   * Returns whether the minimum OS version is explicitly set for the current platform.
-   */
+  /** Returns whether the minimum OS version is explicitly set for the current platform. */
   public DottedVersion getMinimumOsVersion() {
     switch (applePlatformType) {
-      case IOS: return iosMinimumOs;
-      case MACOS: return macosMinimumOs;
-      case TVOS: return tvosMinimumOs;
-      case WATCHOS: return watchosMinimumOs;
-      default: throw new IllegalStateException();
+      case IOS:
+        return iosMinimumOs;
+      case MACOS:
+        return macosMinimumOs;
+      case TVOS:
+        return tvosMinimumOs;
+      case WATCHOS:
+        return watchosMinimumOs;
+      default:
+        throw new IllegalStateException();
     }
   }
 
   /**
    * Returns the architecture implied by these options.
    *
-   * <p> In contexts in which a configuration instance is present, prefer
-   * {@link AppleConfiguration#getSingleArchitecture}.
+   * <p>In contexts in which a configuration instance is present, prefer {@link
+   * AppleConfiguration#getSingleArchitecture}.
    */
   public String getSingleArchitecture() {
     if (!Strings.isNullOrEmpty(appleSplitCpu)) {
@@ -440,12 +436,13 @@
   @SkylarkModule(
     name = "apple_bitcode_mode",
     category = SkylarkModuleCategory.NONE,
-    doc = "The Bitcode mode to use when compiling Objective-C and Swift code on Apple platforms. "
-        + "Possible values are:<br><ul>"
-        + "<li><code>'none'</code></li>"
-        + "<li><code>'embedded'</code></li>"
-        + "<li><code>'embedded_markers'</code></li>"
-        + "</ul>"
+    doc =
+        "The Bitcode mode to use when compiling Objective-C and Swift code on Apple platforms. "
+            + "Possible values are:<br><ul>"
+            + "<li><code>'none'</code></li>"
+            + "<li><code>'embedded'</code></li>"
+            + "<li><code>'embedded_markers'</code></li>"
+            + "</ul>"
   )
   @Immutable
   public enum AppleBitcodeMode implements SkylarkValue {
@@ -488,16 +485,14 @@
     }
 
     /**
-     * Returns the flags that should be added to compile and link actions to use this
-     * bitcode setting.
+     * Returns the flags that should be added to compile and link actions to use this bitcode
+     * setting.
      */
     public ImmutableList<String> getCompileAndLinkFlags() {
       return clangFlags;
     }
 
-    /**
-     * Converts to {@link AppleBitcodeMode}.
-     */
+    /** Converts to {@link AppleBitcodeMode}. */
     public static class Converter extends EnumConverter<AppleBitcodeMode> {
       public Converter() {
         super(AppleBitcodeMode.class, "apple bitcode mode");
@@ -597,8 +592,7 @@
   }
 
   /** Flag converter for {@link PlatformType}. */
-  public static final class PlatformTypeConverter
-      extends EnumConverter<PlatformType> {
+  public static final class PlatformTypeConverter extends EnumConverter<PlatformType> {
     public PlatformTypeConverter() {
       super(PlatformType.class, "Apple platform type");
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionKeyCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionKeyCodec.java
index c32a0f8..d466391 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionKeyCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionKeyCodec.java
@@ -15,8 +15,8 @@
 
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelCodec;
 import com.google.devtools.build.lib.skyframe.TestSuiteExpansionValue.TestSuiteExpansionKey;
-import com.google.devtools.build.lib.skyframe.serialization.LabelCodec;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.protobuf.CodedInputStream;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 10c813d..bb25cbc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -11,8 +11,6 @@
     name = "serialization",
     srcs = glob(["**/*.java"]),
     deps = [
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//third_party:guava",
         "//third_party/protobuf:protobuf_java",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
index 85abc95..b5baec0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
@@ -14,10 +14,7 @@
 
 package com.google.devtools.build.lib.skyframe.serialization;
 
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
-import com.google.protobuf.ByteString;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -26,22 +23,6 @@
 public class SerializationCommonUtils {
   public static final ImmutableListCodec<String> STRING_LIST_CODEC =
       new ImmutableListCodec<>(StringCodecs.asciiOptimized());
-  private static final ByteString DEFAULT_REPOSITORY =
-      ByteString.copyFromUtf8(RepositoryName.DEFAULT.getName());
-  private static final ByteString MAIN_REPOSITORY =
-      ByteString.copyFromUtf8(RepositoryName.MAIN.getName());
-
-  public static RepositoryName deserializeRepoName(ByteString repoNameBytes)
-      throws LabelSyntaxException {
-    // We expect MAIN_REPOSITORY the vast majority of the time, so check for it first.
-    if (repoNameBytes.equals(MAIN_REPOSITORY)) {
-      return RepositoryName.MAIN;
-    } else if (repoNameBytes.equals(DEFAULT_REPOSITORY)) {
-      return RepositoryName.DEFAULT;
-    } else {
-      return RepositoryName.create(repoNameBytes.toStringUtf8());
-    }
-  }
 
   public static <T> void serializeNullable(T obj, CodedOutputStream out, ObjectCodec<T> codec)
       throws IOException, SerializationException {
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/BUILD b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
index bd52ab8..95b9ca8 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
@@ -9,6 +9,7 @@
 PATH_FRAGMENT_SOURCES = [
     "Canonicalizer.java",
     "PathFragment.java",
+    "PathFragmentCodec.java",
     "PathFragmentSerializationProxy.java",
     "UnixPathFragment.java",
     "WindowsPathFragment.java",
@@ -22,7 +23,9 @@
         "//src/main/java/com/google/devtools/build/lib:os_util",
         "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//third_party:guava",
+        "//third_party/protobuf:protobuf_java",
     ],
 )
 
@@ -47,8 +50,10 @@
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/profiler",
         "//src/main/java/com/google/devtools/build/lib/shell",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/common/options",
         "//third_party:guava",
         "//third_party:jsr305",
+        "//third_party/protobuf:protobuf_java",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java b/src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java
similarity index 83%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
rename to src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java
index 5c44f9c..8724663 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java
@@ -12,12 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.vfs;
 
 import com.google.common.base.Preconditions;
-import com.google.devtools.build.lib.vfs.FileSystem;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
@@ -29,7 +28,7 @@
   private final PathFragmentCodec pathFragmentCodec;
 
   /** Create an instance for serializing and deserializing {@link Path}s on {@code fileSystem}. */
-  PathCodec(FileSystem fileSystem) {
+  public PathCodec(FileSystem fileSystem) {
     this.fileSystem = fileSystem;
     this.pathFragmentCodec = new PathFragmentCodec();
   }
@@ -51,8 +50,7 @@
   }
 
   @Override
-  public Path deserialize(CodedInputStream codedIn)
-      throws IOException, SerializationException {
+  public Path deserialize(CodedInputStream codedIn) throws IOException, SerializationException {
     PathFragment pathFragment = pathFragmentCodec.deserialize(codedIn);
     return fileSystem.getPath(pathFragment);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragmentCodec.java
similarity index 87%
rename from src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
rename to src/main/java/com/google/devtools/build/lib/vfs/PathFragmentCodec.java
index a2f9e25..2c0f493 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragmentCodec.java
@@ -12,16 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.skyframe.serialization;
+package com.google.devtools.build.lib.vfs;
 
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
-import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
 import java.io.IOException;
 
 /** Custom serialization for {@link PathFragment}s. */
-class PathFragmentCodec implements ObjectCodec<PathFragment> {
+public class PathFragmentCodec implements ObjectCodec<PathFragment> {
 
   private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BlazeDirectoriesCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BlazeDirectoriesCodecTest.java
index 1a83055..425d148 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BlazeDirectoriesCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BlazeDirectoriesCodecTest.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.analysis.ServerDirectories;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils;
+import com.google.devtools.build.lib.vfs.PathCodec;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodecTest.java
index 7427e92..b2a2d49 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/LabelCodecTest.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.skyframe.serialization;
 
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelCodec;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodecTest.java
index 55d3d11..a9c9ff7 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PackageIdentifierCodecTest.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.skyframe.serialization;
 
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.cmdline.PackageIdentifierCodec;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import org.junit.runner.RunWith;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathCodecTest.java
index 38c2a42..4b37a3c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathCodecTest.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils;
 import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathCodec;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodecTest.java
index 8bf5276..52490c7 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PathFragmentCodecTest.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.lib.vfs.PathFragmentCodec;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java
index f1f08cd..692f602 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.skyframe.serialization;
 
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelCodec;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValueCodec;
 import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java
index 3bbd29a..30f4e08 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RepositoryNameCodecTest.java
@@ -18,6 +18,7 @@
 
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
+import com.google.devtools.build.lib.cmdline.RepositoryNameCodec;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.AbstractObjectCodecTest;
 import java.io.IOException;
 import org.junit.Test;