Remove support for managed directories.

Fixes #15463.

The design doc for the deprecation and the removal is available here:

https://docs.google.com/document/d/1u9V5RUc7i6Urh8gGfnSurxpWA7JMRtwCi1Pr5BHeE44/edit

RELNOTES: --noincompatible_disable_managed_directories, and with that, workspace(managed_directories=) is not supported anymore.
PiperOrigin-RevId: 456228902
Change-Id: I5fcbf96b9a508f47cbcabf9715163cd7120020bf
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 0b5d910..03399b5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -141,7 +141,6 @@
         ":incremental_artifact_conflict_finder",
         ":loading_phase_started_event",
         ":local_repository_lookup_value",
-        ":managed_directories_knowledge",
         ":map_as_package_roots",
         ":metadata_consumer_for_metrics",
         ":output_store",
@@ -323,7 +322,6 @@
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//src/main/java/com/google/devtools/build/lib/util:crash_failure_details",
         "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code",
-        "//src/main/java/com/google/devtools/build/lib/util:exit_code",
         "//src/main/java/com/google/devtools/build/lib/util:resource_usage",
         "//src/main/java/com/google/devtools/build/lib/util/io",
         "//src/main/java/com/google/devtools/build/lib/vfs",
@@ -1527,19 +1525,6 @@
 )
 
 java_library(
-    name = "managed_directories_knowledge",
-    srcs = ["ManagedDirectoriesKnowledge.java"],
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib/cmdline",
-        "//src/main/java/com/google/devtools/build/lib/packages",
-        "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
-        "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
-        "//third_party:guava",
-        "//third_party:jsr305",
-    ],
-)
-
-java_library(
     name = "map_as_package_roots",
     srcs = ["MapAsPackageRoots.java"],
     deps = [
@@ -2257,7 +2242,6 @@
     name = "skyframe_executor_repository_helpers_holder",
     srcs = ["SkyframeExecutorRepositoryHelpersHolder.java"],
     deps = [
-        ":managed_directories_knowledge",
         "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function",
         "//third_party:auto_value",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateFunction.java
index 876ab3f..e2f1216 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateFunction.java
@@ -55,8 +55,7 @@
       if (env.valuesMissing()) {
         return null;
       }
-      if (fileType == FileType.EXTERNAL_REPO
-          || fileType == FileType.EXTERNAL_IN_MANAGED_DIRECTORY) {
+      if (fileType == FileType.EXTERNAL_REPO) {
         // Do not use syscallCache as files under repositories get generated during the build,
         // while syscallCache is used independently from Skyframe and generally assumes
         // the file system is frozen at the beginning of the build command.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java
index 3d34f54..080598a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java
@@ -20,7 +20,6 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.FileStateValue;
-import com.google.devtools.build.lib.bugreport.BugReport;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.FileType;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Root;
@@ -100,12 +99,9 @@
 
   static final class MissingDiffDirtinessChecker extends BasicFilesystemDirtinessChecker {
     private final Set<Root> missingDiffPackageRoots;
-    private final ExternalFilesHelper externalFilesHelper;
 
-    MissingDiffDirtinessChecker(
-        Set<Root> missingDiffPackageRoots, ExternalFilesHelper externalFilesHelper) {
+    MissingDiffDirtinessChecker(Set<Root> missingDiffPackageRoots) {
       this.missingDiffPackageRoots = missingDiffPackageRoots;
-      this.externalFilesHelper = externalFilesHelper;
     }
 
     @Override
@@ -113,26 +109,6 @@
       return super.applies(key)
           && missingDiffPackageRoots.contains(((RootedPath) key.argument()).getRoot());
     }
-
-    @Override
-    public DirtyResult check(
-        SkyKey key,
-        @Nullable SkyValue oldValue,
-        SyscallCache syscallCache,
-        @Nullable TimestampGranularityMonitor tsgm) {
-      FileType fileType = externalFilesHelper.getAndNoteFileType((RootedPath) key.argument());
-      if (fileType != FileType.INTERNAL) {
-        if (fileType != FileType.EXTERNAL_IN_MANAGED_DIRECTORY) {
-          BugReport.sendBugReport(
-              "File %s had unexpected type %s under one of package roots %s",
-              key, fileType, missingDiffPackageRoots);
-        }
-        DirtyResult result = super.check(key, oldValue, SyscallCache.NO_CACHE, tsgm);
-        // Don't populate Skyframe with new value if it might change.
-        return result.isDirty() ? DirtyResult.dirty() : result;
-      }
-      return super.check(key, oldValue, syscallCache, tsgm);
-    }
   }
 
   /**
@@ -194,7 +170,6 @@
         case EXTERNAL:
         case BUNDLED:
           return true;
-        case EXTERNAL_IN_MANAGED_DIRECTORY:
         case EXTERNAL_REPO:
         case OUTPUT:
           return false;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java
index a4aebf2..ca8293f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ExternalFilesHelper.java
@@ -51,62 +51,40 @@
   private boolean tooManyNonOutputExternalFilesSeen = false;
   private boolean anyFilesInExternalReposSeen = false;
 
-  // This is a set of external files that are not in managed directories or
-  // external repositories.
+  // This is a set of external files that are not in external repositories.
   private Set<RootedPath> nonOutputExternalFilesSeen = Sets.newConcurrentHashSet();
-  private final ManagedDirectoriesKnowledge managedDirectoriesKnowledge;
 
   private ExternalFilesHelper(
       AtomicReference<PathPackageLocator> pkgLocator,
       ExternalFileAction externalFileAction,
       BlazeDirectories directories,
-      int maxNumExternalFilesToLog,
-      ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
+      int maxNumExternalFilesToLog) {
     this.pkgLocator = pkgLocator;
     this.externalFileAction = externalFileAction;
     this.directories = directories;
     this.maxNumExternalFilesToLog = maxNumExternalFilesToLog;
-    this.managedDirectoriesKnowledge = managedDirectoriesKnowledge;
   }
 
   public static ExternalFilesHelper create(
       AtomicReference<PathPackageLocator> pkgLocator,
       ExternalFileAction externalFileAction,
-      BlazeDirectories directories,
-      ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
+      BlazeDirectories directories) {
     return TestType.isInTest()
-        ? createForTesting(pkgLocator, externalFileAction, directories, managedDirectoriesKnowledge)
+        ? createForTesting(pkgLocator, externalFileAction, directories)
         : new ExternalFilesHelper(
-            pkgLocator,
-            externalFileAction,
-            directories,
-            /*maxNumExternalFilesToLog=*/ 100,
-            managedDirectoriesKnowledge);
+            pkgLocator, externalFileAction, directories, /*maxNumExternalFilesToLog=*/ 100);
   }
 
   public static ExternalFilesHelper createForTesting(
       AtomicReference<PathPackageLocator> pkgLocator,
       ExternalFileAction externalFileAction,
       BlazeDirectories directories) {
-    return createForTesting(
-        pkgLocator,
-        externalFileAction,
-        directories,
-        ManagedDirectoriesKnowledge.NO_MANAGED_DIRECTORIES);
-  }
-
-  private static ExternalFilesHelper createForTesting(
-      AtomicReference<PathPackageLocator> pkgLocator,
-      ExternalFileAction externalFileAction,
-      BlazeDirectories directories,
-      ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
     return new ExternalFilesHelper(
         pkgLocator,
         externalFileAction,
         directories,
         // These log lines are mostly spam during unit and integration tests.
-        /*maxNumExternalFilesToLog=*/ 0,
-        managedDirectoriesKnowledge);
+        /*maxNumExternalFilesToLog=*/ 0);
   }
 
 
@@ -144,8 +122,8 @@
     INTERNAL,
 
     /**
-     * A non {@link #EXTERNAL_REPO} or {@link #EXTERNAL_IN_MANAGED_DIRECTORY} path outside the
-     * package roots about which we may make no other assumptions.
+     * A non {@link #EXTERNAL_REPO} path outside the package roots about which we may make no other
+     * assumptions.
      */
     EXTERNAL,
 
@@ -175,17 +153,6 @@
      * RepositoryDirectoryValue is computed.
      */
     EXTERNAL_REPO,
-
-    /**
-     * A path is under one of the managed directories. Managed directories are user-owned
-     * directories, which can be incrementally updated by repository rules, so that the updated
-     * files are visible for the actions in the same build.
-     *
-     * <p>Every such path under the managed directory is generated or updated by the execution of
-     * the corresponding repository rule, so these paths should not be cached by Skyframe before the
-     * RepositoryDirectoryValue is computed. {@link ManagedDirectoriesKnowledge}
-     */
-    EXTERNAL_IN_MANAGED_DIRECTORY,
   }
 
   /**
@@ -232,11 +199,7 @@
 
   ExternalFilesHelper cloneWithFreshExternalFilesKnowledge() {
     return new ExternalFilesHelper(
-        pkgLocator,
-        externalFileAction,
-        directories,
-        maxNumExternalFilesToLog,
-        managedDirectoriesKnowledge);
+        pkgLocator, externalFileAction, directories, maxNumExternalFilesToLog);
   }
 
   public FileType getAndNoteFileType(RootedPath rootedPath) {
@@ -244,12 +207,6 @@
   }
 
   private Pair<FileType, RepositoryName> getFileTypeAndRepository(RootedPath rootedPath) {
-    RepositoryName repositoryName =
-        managedDirectoriesKnowledge.getOwnerRepository(rootedPath.getRootRelativePath());
-    if (repositoryName != null) {
-      anyFilesInExternalReposSeen = true;
-      return Pair.of(FileType.EXTERNAL_IN_MANAGED_DIRECTORY, repositoryName);
-    }
     FileType fileType = detectFileType(rootedPath);
     if (FileType.EXTERNAL == fileType) {
       if (nonOutputExternalFilesSeen.size() >= MAX_EXTERNAL_FILES_TO_TRACK) {
@@ -309,12 +266,6 @@
 
     FileType fileType = Preconditions.checkNotNull(pair.getFirst());
     switch (fileType) {
-      case EXTERNAL_IN_MANAGED_DIRECTORY:
-        Preconditions.checkState(
-            externalFileAction == ExternalFileAction.DEPEND_ON_EXTERNAL_PKG_FOR_EXTERNAL_REPO_PATHS,
-            externalFileAction);
-        RepositoryFunction.addManagedDirectoryDependencies(pair.getSecond(), env);
-        break;
       case BUNDLED:
       case INTERNAL:
         break;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java
index cba69ee..8b534e2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java
@@ -60,8 +60,7 @@
       if (env.valuesMissing()) {
         return null;
       }
-      if (fileType == FileType.EXTERNAL_REPO
-          || fileType == FileType.EXTERNAL_IN_MANAGED_DIRECTORY) {
+      if (fileType == FileType.EXTERNAL_REPO) {
         // do not use syscallCache as files under repositories get generated during the build
         return FileStateValue.create(rootedPath, SyscallCache.NO_CACHE, tsgm.get());
       }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ManagedDirectoriesKnowledge.java b/src/main/java/com/google/devtools/build/lib/skyframe/ManagedDirectoriesKnowledge.java
deleted file mode 100644
index 6ec3b0b..0000000
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ManagedDirectoriesKnowledge.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2019 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.skyframe;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
-import com.google.devtools.build.lib.packages.WorkspaceFileValue;
-import com.google.devtools.build.lib.util.AbruptExitException;
-import com.google.devtools.build.lib.vfs.PathFragment;
-import javax.annotation.Nullable;
-
-/**
- * Managed directories are user-owned directories, which can be incrementally updated by repository
- * rules, so that the updated files are visible for the actions in the same build.
- *
- * <p>File and directory nodes inside managed directories depend on the relevant {@link
- * com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue} node, so that they are
- * invalidated if the repository definition changes and recomputed based on the contents written by
- * the repository rule.
- *
- * <p>The repository rule will also be re-run if any of the directories it manages is entirely
- * missing. This allows a user to fairly cleanly regenerate managed directories. Whether this is an
- * actually used feature is unknown to the Bazel developers.
- */
-public interface ManagedDirectoriesKnowledge {
-  ManagedDirectoriesKnowledge NO_MANAGED_DIRECTORIES =
-      new ManagedDirectoriesKnowledge() {
-        @Override
-        public boolean workspaceHeaderReloaded(
-            @Nullable WorkspaceFileValue oldValue, @Nullable WorkspaceFileValue newValue) {
-          return false;
-        }
-
-        @Nullable
-        @Override
-        public RepositoryName getOwnerRepository(PathFragment relativePathFragment) {
-          return null;
-        }
-
-        @Override
-        public ImmutableSet<PathFragment> getManagedDirectories(RepositoryName repositoryName) {
-          return ImmutableSet.of();
-        }
-      };
-
-  /**
-   * Returns true if the multi-mapping of repository -> {managed directory} changes. Such changes
-   * trigger a full wipe of the Skyframe graph, similar to a --package_path flag change.
-   */
-  boolean workspaceHeaderReloaded(
-      @Nullable WorkspaceFileValue oldValue, @Nullable WorkspaceFileValue newValue)
-      throws AbruptExitException;
-
-  /**
-   * Returns the owning repository for the incrementally updated path, or null.
-   *
-   * @param relativePathFragment path to check, relative to workspace root
-   * @return RepositoryName or null if there is no owning repository
-   */
-  @Nullable
-  RepositoryName getOwnerRepository(PathFragment relativePathFragment);
-
-  /** Returns managed directories for the passed repository. */
-  ImmutableSet<PathFragment> getManagedDirectories(RepositoryName repositoryName);
-}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index 4d33299..5702185 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -31,7 +31,6 @@
 import com.google.common.flogger.GoogleLogger;
 import com.google.devtools.build.lib.actions.ActionKeyContext;
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
-import com.google.devtools.build.lib.actions.FileStateType;
 import com.google.devtools.build.lib.actions.FileStateValue;
 import com.google.devtools.build.lib.actions.FileValue;
 import com.google.devtools.build.lib.analysis.AspectValue;
@@ -44,7 +43,6 @@
 import com.google.devtools.build.lib.bazel.repository.RepositoryOptions;
 import com.google.devtools.build.lib.bugreport.BugReporter;
 import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
-import com.google.devtools.build.lib.cmdline.LabelConstants;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.concurrent.Uninterruptibles;
 import com.google.devtools.build.lib.events.Event;
@@ -58,17 +56,12 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.WorkspaceFileValue;
-import com.google.devtools.build.lib.packages.WorkspaceFileValue.WorkspaceFileKey;
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.ProfilerTask;
 import com.google.devtools.build.lib.profiler.SilentCloseable;
 import com.google.devtools.build.lib.repository.ExternalPackageHelper;
-import com.google.devtools.build.lib.server.FailureDetails;
-import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
-import com.google.devtools.build.lib.server.FailureDetails.Workspaces;
 import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey;
 import com.google.devtools.build.lib.skyframe.DiffAwarenessManager.ProcessableModifiedFileSet;
 import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.BasicFilesystemDirtinessChecker;
@@ -83,8 +76,6 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.rewinding.RewindableGraphInconsistencyReceiver;
 import com.google.devtools.build.lib.util.AbruptExitException;
-import com.google.devtools.build.lib.util.DetailedExitCode;
-import com.google.devtools.build.lib.util.ExitCode;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.ResourceUsage;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -207,9 +198,6 @@
         /*shouldUnblockCpuWorkWhenFetchingDeps=*/ false,
         new PackageProgressReceiver(),
         new ConfiguredTargetProgressReceiver(),
-        repositoryHelpersHolder == null
-            ? null
-            : repositoryHelpersHolder.managedDirectoriesKnowledge(),
         skyKeyStateReceiver,
         bugReporter);
     this.diffAwarenessManager = new DiffAwarenessManager(diffAwarenessFactories);
@@ -391,15 +379,6 @@
     modifiedFiles.set(0);
     numSourceFilesCheckedBecauseOfMissingDiffs = 0;
 
-    // Read the WORKSPACE file header, but only invalidate if tracking incremental state. Otherwise,
-    // this command started with a fresh graph already, and attempting to invalidate edgeless nodes
-    // results in a crash.
-    boolean managedDirectoriesChanged =
-        repositoryHelpersHolder != null && refreshWorkspaceHeader(eventHandler);
-    if (managedDirectoriesChanged && trackIncrementalState) {
-      invalidateCachedWorkspacePathsStates();
-    }
-
     WorkspaceInfoFromDiff workspaceInfo = null;
     Map<Root, DiffAwarenessManager.ProcessableModifiedFileSet> modifiedFilesByPathEntry =
         Maps.newHashMap();
@@ -422,8 +401,7 @@
     }
     BuildRequestOptions buildRequestOptions = options.getOptions(BuildRequestOptions.class);
     int fsvcThreads = buildRequestOptions == null ? 200 : buildRequestOptions.fsvcThreads;
-    handleDiffsWithCompleteDiffInformation(
-        tsgm, modifiedFilesByPathEntry, managedDirectoriesChanged, fsvcThreads);
+    handleDiffsWithCompleteDiffInformation(tsgm, modifiedFilesByPathEntry, fsvcThreads);
     RepositoryOptions repoOptions = options.getOptions(RepositoryOptions.class);
     handleDiffsWithMissingDiffInformation(
         eventHandler,
@@ -431,42 +409,11 @@
         pathEntriesWithoutDiffInformation,
         options.getOptions(PackageOptions.class).checkOutputFiles,
         repoOptions == null || repoOptions.checkExternalRepositoryFiles,
-        managedDirectoriesChanged,
         fsvcThreads);
     handleClientEnvironmentChanges();
     return workspaceInfo;
   }
 
-  /**
-   * Skyframe caches the states of files (FileStateValue) and directory listings
-   * (DirectoryListingStateValue). In the case when the files/directories are under a managed
-   * directory or inside an external repository, evaluation of file/directory listing states
-   * requires that RepositoryDirectoryValue of the owning external repository is evaluated
-   * beforehand. (So that the repository rule generates the files.) So there is a dependency on
-   * RepositoryDirectoryValue for files under managed directories and external repositories. This
-   * dependency is recorded by Skyframe.
-   *
-   * <p>From the other side, by default Skyframe injects the new values of changed files already at
-   * the stage of checking what files have changed. Only values without any dependencies can be
-   * injected into Skyframe.
-   *
-   * <p>When the values of managed directories change, whether a file is under a managed directory
-   * can change. This implies that corresponding file/directory listing states gain the dependency
-   * (RepositoryDirectoryValue) or they lose this dependency. In both cases, we should prevent
-   * Skyframe from injecting those new values of file/directory listing states at the stage of
-   * checking changed files, because the files have not been generated yet.
-   *
-   * <p>The selected approach is to invalidate PACKAGE_LOCATOR_DEPENDENT_VALUES, which includes
-   * invalidating all cached file/directory listing state values. Additionally, no new
-   * FileStateValues and DirectoryStateValues should be injected.
-   */
-  private void invalidateCachedWorkspacePathsStates() {
-    logger.atInfo().log(
-        "Invalidating cached packages and paths states"
-            + " because managed directories configuration has changed.");
-    invalidate(SkyFunctionName.functionIsIn(PACKAGE_LOCATOR_DEPENDENT_VALUES));
-  }
-
   /** Invalidates entries in the client environment. */
   private void handleClientEnvironmentChanges() {
     // Remove deleted client environmental variables.
@@ -496,7 +443,6 @@
   private void handleDiffsWithCompleteDiffInformation(
       TimestampGranularityMonitor tsgm,
       Map<Root, ProcessableModifiedFileSet> modifiedFilesByPathEntry,
-      boolean managedDirectoriesChanged,
       int fsvcThreads)
       throws InterruptedException, AbruptExitException {
     for (Root pathEntry : ImmutableSet.copyOf(modifiedFilesByPathEntry.keySet())) {
@@ -507,8 +453,7 @@
       handleChangedFiles(
           ImmutableList.of(pathEntry),
           getDiff(tsgm, modifiedFileSet, pathEntry, fsvcThreads),
-          /*numSourceFilesCheckedIfDiffWasMissing=*/ 0,
-          managedDirectoriesChanged);
+          /*numSourceFilesCheckedIfDiffWasMissing=*/ 0);
       processableModifiedFileSet.markProcessed();
     }
   }
@@ -523,7 +468,6 @@
       Set<Pair<Root, ProcessableModifiedFileSet>> pathEntriesWithoutDiffInformation,
       boolean checkOutputFiles,
       boolean checkExternalRepositoryFiles,
-      boolean managedDirectoriesChanged,
       int fsvcThreads)
       throws InterruptedException {
 
@@ -571,8 +515,7 @@
             Iterables.concat(
                 dirtinessCheckers,
                 ImmutableList.of(
-                    new MissingDiffDirtinessChecker(
-                        diffPackageRootsUnderWhichToCheck, tmpExternalFilesHelper)));
+                    new MissingDiffDirtinessChecker(diffPackageRootsUnderWhichToCheck)));
       }
       if (checkExternalRepositoryFiles && repositoryHelpersHolder != null) {
         dirtinessCheckers =
@@ -581,8 +524,7 @@
                 ImmutableList.of(repositoryHelpersHolder.repositoryDirectoryDirtinessChecker()));
       }
       if (checkExternalRepositoryFiles) {
-        fileTypesToCheck =
-            EnumSet.of(FileType.EXTERNAL_REPO, FileType.EXTERNAL_IN_MANAGED_DIRECTORY);
+        fileTypesToCheck = EnumSet.of(FileType.EXTERNAL_REPO);
       }
       if (externalFilesKnowledge.tooManyNonOutputExternalFilesSeen
           || !externalFilesKnowledge.nonOutputExternalFilesSeen.isEmpty()) {
@@ -614,8 +556,7 @@
       handleChangedFiles(
           diffPackageRootsUnderWhichToCheck,
           batchDirtyResult,
-          /*numSourceFilesCheckedIfDiffWasMissing=*/ batchDirtyResult.getNumKeysChecked(),
-          managedDirectoriesChanged);
+          /*numSourceFilesCheckedIfDiffWasMissing=*/ batchDirtyResult.getNumKeysChecked());
       // We use the knowledge gained during the graph scan that just completed. Otherwise, naively,
       // once an external file gets into the Skyframe graph, we'll overly-conservatively always
       // think the graph needs to be scanned.
@@ -648,10 +589,7 @@
                 new ExternalDirtinessChecker(externalFilesHelper, EnumSet.of(FileType.EXTERNAL)));
       }
       handleChangedFiles(
-          ImmutableList.of(),
-          batchDirtyResult,
-          batchDirtyResult.getNumKeysChecked(),
-          /*managedDirectoriesChanged=*/ false);
+          ImmutableList.of(), batchDirtyResult, batchDirtyResult.getNumKeysChecked());
     }
     for (Pair<Root, DiffAwarenessManager.ProcessableModifiedFileSet> pair :
         pathEntriesWithoutDiffInformation) {
@@ -662,21 +600,11 @@
   private void handleChangedFiles(
       Collection<Root> diffPackageRootsUnderWhichToCheck,
       Differencer.Diff diff,
-      int numSourceFilesCheckedIfDiffWasMissing,
-      boolean managedDirectoriesChanged) {
+      int numSourceFilesCheckedIfDiffWasMissing) {
     int numWithoutNewValues = diff.changedKeysWithoutNewValues().size();
     Iterable<SkyKey> keysToBeChangedLaterInThisBuild = diff.changedKeysWithoutNewValues();
     Map<SkyKey, SkyValue> changedKeysWithNewValues = diff.changedKeysWithNewValues();
 
-    // If managed directories settings changed, do not inject any new values, just invalidate
-    // keys of the changed values. {@link #invalidateCachedWorkspacePathsStates()}
-    if (managedDirectoriesChanged) {
-      numWithoutNewValues += changedKeysWithNewValues.size();
-      keysToBeChangedLaterInThisBuild =
-          Iterables.concat(keysToBeChangedLaterInThisBuild, changedKeysWithNewValues.keySet());
-      changedKeysWithNewValues = ImmutableMap.of();
-    }
-
     logDiffInfo(
         diffPackageRootsUnderWhichToCheck,
         keysToBeChangedLaterInThisBuild,
@@ -1030,86 +958,6 @@
     }
   }
 
-  /**
-   * Calculate the new value of the WORKSPACE file header (WorkspaceFileValue with the index = 0),
-   * and call the listener, if the value has changed. Needed for incremental update of user-owned
-   * directories by repository rules.
-   */
-  private boolean refreshWorkspaceHeader(ExtendedEventHandler eventHandler)
-      throws InterruptedException, AbruptExitException {
-    Root workspaceRoot = Root.fromPath(directories.getWorkspace());
-    RootedPath workspacePath =
-        RootedPath.toRootedPath(workspaceRoot, LabelConstants.WORKSPACE_FILE_NAME);
-    WorkspaceFileKey workspaceFileKey = WorkspaceFileValue.key(workspacePath);
-
-    WorkspaceFileValue oldValue =
-        (WorkspaceFileValue) memoizingEvaluator.getExistingValue(workspaceFileKey);
-    FileStateValue newFileStateValue = maybeInvalidateWorkspaceFileStateValue(workspacePath);
-    WorkspaceFileValue newValue =
-        (WorkspaceFileValue) evaluateSingleValue(workspaceFileKey, eventHandler);
-    if (newValue != null
-        && !newValue.getManagedDirectories().isEmpty()
-        && FileStateType.SYMLINK.equals(newFileStateValue.getType())) {
-      throw new AbruptExitException(
-          DetailedExitCode.of(
-              ExitCode.PARSING_FAILURE,
-              FailureDetail.newBuilder()
-                  .setMessage(
-                      "WORKSPACE file can not be a symlink if incrementally updated directories"
-                          + " are used.")
-                  .setWorkspaces(
-                      Workspaces.newBuilder()
-                          .setCode(
-                              FailureDetails.Workspaces.Code
-                                  .ILLEGAL_WORKSPACE_FILE_SYMLINK_WITH_MANAGED_DIRECTORIES))
-                  .build()));
-    }
-    return repositoryHelpersHolder
-        .managedDirectoriesKnowledge()
-        .workspaceHeaderReloaded(oldValue, newValue);
-  }
-
-  // We only check the FileStateValue of the WORKSPACE file; we do not support the case
-  // when the WORKSPACE file is a symlink.
-  private FileStateValue maybeInvalidateWorkspaceFileStateValue(RootedPath workspacePath)
-      throws InterruptedException, AbruptExitException {
-    SkyKey workspaceFileStateKey = FileStateValue.key(workspacePath);
-    SkyValue oldWorkspaceFileState = memoizingEvaluator.getExistingValue(workspaceFileStateKey);
-    FileStateValue newWorkspaceFileState;
-    try {
-      newWorkspaceFileState =
-          FileStateValue.create(workspacePath, perCommandSyscallCache, tsgm.get());
-    } catch (IOException e) {
-      throw new AbruptExitException(
-          DetailedExitCode.of(
-              ExitCode.PARSING_FAILURE,
-              FailureDetail.newBuilder()
-                  .setMessage("Can not read WORKSPACE file.")
-                  .setWorkspaces(
-                      Workspaces.newBuilder()
-                          .setCode(
-                              FailureDetails.Workspaces.Code
-                                  .WORKSPACE_FILE_READ_FAILURE_WITH_MANAGED_DIRECTORIES))
-                  .build()),
-          e);
-    }
-    if (oldWorkspaceFileState != null && !oldWorkspaceFileState.equals(newWorkspaceFileState)) {
-      recordingDiffer.invalidate(ImmutableSet.of(workspaceFileStateKey));
-    }
-    return newWorkspaceFileState;
-  }
-
-  private SkyValue evaluateSingleValue(SkyKey key, ExtendedEventHandler eventHandler)
-      throws InterruptedException {
-    EvaluationContext evaluationContext =
-        newEvaluationContextBuilder()
-            .setKeepGoing(false)
-            .setNumThreads(DEFAULT_THREAD_COUNT)
-            .setEventHandler(eventHandler)
-            .build();
-    return memoizingEvaluator.evaluate(ImmutableSet.of(key), evaluationContext).get(key);
-  }
-
   public static Builder builder() {
     return new Builder();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 7ce5c0a..9285981 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -418,7 +418,6 @@
       boolean shouldUnblockCpuWorkWhenFetchingDeps,
       @Nullable PackageProgressReceiver packageProgress,
       @Nullable ConfiguredTargetProgressReceiver configuredTargetProgress,
-      @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
       SkyKeyStateReceiver skyKeyStateReceiver,
       BugReporter bugReporter) {
     // Strictly speaking, these arguments are not required for initialization, but all current
@@ -462,13 +461,7 @@
     this.skyframeBuildView =
         new SkyframeBuildView(artifactFactory, this, ruleClassProvider, actionKeyContext);
     this.externalFilesHelper =
-        ExternalFilesHelper.create(
-            pkgLocator,
-            externalFileAction,
-            directories,
-            managedDirectoriesKnowledge != null
-                ? managedDirectoriesKnowledge
-                : ManagedDirectoriesKnowledge.NO_MANAGED_DIRECTORIES);
+        ExternalFilesHelper.create(pkgLocator, externalFileAction, directories);
     this.crossRepositoryLabelViolationStrategy = crossRepositoryLabelViolationStrategy;
     this.buildFilesByPriority = buildFilesByPriority;
     this.externalPackageHelper = externalPackageHelper;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorRepositoryHelpersHolder.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorRepositoryHelpersHolder.java
index a858478..f61f722 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorRepositoryHelpersHolder.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorRepositoryHelpersHolder.java
@@ -20,14 +20,11 @@
 /** Provides repository-related objects for use by {@link SequencedSkyframeExecutor}. */
 @AutoValue
 public abstract class SkyframeExecutorRepositoryHelpersHolder {
-  public abstract ManagedDirectoriesKnowledge managedDirectoriesKnowledge();
-
   public abstract RepositoryDirectoryDirtinessChecker repositoryDirectoryDirtinessChecker();
 
   public static SkyframeExecutorRepositoryHelpersHolder create(
-      ManagedDirectoriesKnowledge managedDirectoriesKnowledge,
       RepositoryDirectoryDirtinessChecker repositoryDirectoryDirtinessChecker) {
     return new AutoValue_SkyframeExecutorRepositoryHelpersHolder(
-        managedDirectoriesKnowledge, repositoryDirectoryDirtinessChecker);
+        repositoryDirectoryDirtinessChecker);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 3ea17ab..37ddb85 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -250,8 +250,7 @@
           /* bindings = */ ImmutableMap.<String, Object>of(),
           workspaceFile,
           /* idx = */ 0, // first fragment
-          /* hasNext = */ false,
-          ImmutableMap.of());
+          /* hasNext = */ false);
     }
 
     // Get the state at the end of the previous chunk.
@@ -354,8 +353,7 @@
         parser.getVariableBindings(),
         workspaceFile,
         key.getIndex(),
-        key.getIndex() < chunks.size() - 1,
-        ImmutableMap.copyOf(parser.getManagedDirectories()));
+        key.getIndex() < chunks.size() - 1);
   }
 
   private static StarlarkFile parseWorkspaceFile(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index b69533c..8f0e648 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -66,7 +66,6 @@
 import com.google.devtools.build.lib.skyframe.FileFunction;
 import com.google.devtools.build.lib.skyframe.FileStateFunction;
 import com.google.devtools.build.lib.skyframe.IgnoredPackagePrefixesFunction;
-import com.google.devtools.build.lib.skyframe.ManagedDirectoriesKnowledge;
 import com.google.devtools.build.lib.skyframe.PackageFunction;
 import com.google.devtools.build.lib.skyframe.PackageFunction.ActionOnIOExceptionReadingBuildFile;
 import com.google.devtools.build.lib.skyframe.PackageFunction.GlobbingStrategy;
@@ -246,11 +245,7 @@
     public final PackageLoader build() {
       validate();
       externalFilesHelper =
-          ExternalFilesHelper.create(
-              pkgLocatorRef,
-              externalFileAction,
-              directories,
-              ManagedDirectoriesKnowledge.NO_MANAGED_DIRECTORIES);
+          ExternalFilesHelper.create(pkgLocatorRef, externalFileAction, directories);
       return buildImpl();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
index bf0855e..f704ea2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD
@@ -48,7 +48,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:containing_package_lookup_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:file_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:ignored_package_prefixes_function",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:managed_directories_knowledge",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_lookup_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:per_build_syscall_cache",
@@ -87,7 +86,6 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:action_environment_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:directory_listing_function",
-        "//src/main/java/com/google/devtools/build/lib/skyframe:managed_directories_knowledge",
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_lookup_function",
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:sky_functions",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
index 3cff84d..2f1cf6c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
@@ -34,7 +34,6 @@
 import com.google.devtools.build.lib.skyframe.DirectoryListingStateFunction;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.LocalRepositoryLookupFunction;
-import com.google.devtools.build.lib.skyframe.ManagedDirectoriesKnowledge;
 import com.google.devtools.build.lib.skyframe.PackageFunction.ActionOnIOExceptionReadingBuildFile;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
@@ -130,7 +129,6 @@
                       isFetch,
                       ImmutableMap::of,
                       directories,
-                      ManagedDirectoriesKnowledge.NO_MANAGED_DIRECTORIES,
                       EXTERNAL_PACKAGE_HELPER))
               .build());