Remove TODO about mixed remote/local tree artifacts. This must remain a supported use case. Rename isRemote to isEntirelyRemote to be more clear with respect to this case.

PiperOrigin-RevId: 316965014
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
index 9e3932e..b17d20b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
@@ -429,7 +429,7 @@
     try {
       Set<PathFragment> currentDirectoryValue =
           TreeArtifactValue.explodeDirectory(artifact.getPath());
-      return !(currentDirectoryValue.isEmpty() && value.isRemote())
+      return !(currentDirectoryValue.isEmpty() && value.isEntirelyRemote())
           && !currentDirectoryValue.equals(value.getChildPaths());
     } catch (IOException e) {
       return true;
@@ -485,7 +485,7 @@
         actionValue.getAllTreeArtifactValues().entrySet()) {
       TreeArtifactValue tree = entry.getValue();
 
-      if (!tree.isRemote()) {
+      if (!tree.isEntirelyRemote()) {
         for (Map.Entry<TreeFileArtifact, FileArtifactValue> childEntry :
             tree.getChildValues().entrySet()) {
           if (artifactIsDirtyWithDirectSystemCalls(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java
index 01920ca..258a96c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java
@@ -49,20 +49,22 @@
   @SerializationConstant @AutoCodec.VisibleForSerialization
   static final TreeArtifactValue EMPTY =
       new TreeArtifactValue(
-          DigestUtils.fromMetadata(ImmutableMap.of()), ImmutableSortedMap.of(), /*remote=*/ false);
+          DigestUtils.fromMetadata(ImmutableMap.of()),
+          ImmutableSortedMap.of(),
+          /*entirelyRemote=*/ false);
 
   private final byte[] digest;
   private final ImmutableSortedMap<TreeFileArtifact, FileArtifactValue> childData;
-  private final boolean remote;
+  private final boolean entirelyRemote;
 
   @AutoCodec.VisibleForSerialization
   TreeArtifactValue(
       byte[] digest,
       ImmutableSortedMap<TreeFileArtifact, FileArtifactValue> childData,
-      boolean remote) {
+      boolean entirelyRemote) {
     this.digest = digest;
     this.childData = childData;
-    this.remote = remote;
+    this.entirelyRemote = entirelyRemote;
   }
 
   /**
@@ -76,7 +78,7 @@
     }
     Map<String, FileArtifactValue> digestBuilder =
         Maps.newHashMapWithExpectedSize(childFileValues.size());
-    boolean remote = true;
+    boolean entirelyRemote = true;
     for (Map.Entry<TreeFileArtifact, ? extends FileArtifactValue> e : childFileValues.entrySet()) {
       TreeFileArtifact child = e.getKey();
       FileArtifactValue value = e.getValue();
@@ -84,15 +86,14 @@
           !FileArtifactValue.OMITTED_FILE_MARKER.equals(value),
           "Cannot construct TreeArtifactValue because child %s was omitted",
           child);
-      // TODO(buchgr): Enforce that all children in a tree artifact are either remote or local
-      // once b/70354083 is fixed.
-      remote = remote && value.isRemote();
+      // Tolerate a tree artifact having a mix of local and remote children (b/152496153#comment80).
+      entirelyRemote &= value.isRemote();
       digestBuilder.put(child.getParentRelativePath().getPathString(), value);
     }
     return new TreeArtifactValue(
         DigestUtils.fromMetadata(digestBuilder),
         ImmutableSortedMap.copyOf(childFileValues),
-        remote);
+        entirelyRemote);
   }
 
   FileArtifactValue getSelfData() {
@@ -124,8 +125,8 @@
   }
 
   /** Returns true if the {@link TreeFileArtifact}s are only stored remotely. */
-  public boolean isRemote() {
-    return remote;
+  public boolean isEntirelyRemote() {
+    return entirelyRemote;
   }
 
   @Override
@@ -173,7 +174,7 @@
   static final TreeArtifactValue MISSING_TREE_ARTIFACT = createMarker("MISSING_TREE_ARTIFACT");
 
   private static TreeArtifactValue createMarker(String toStringRepresentation) {
-    return new TreeArtifactValue(null, ImmutableSortedMap.of(), /*remote=*/ false) {
+    return new TreeArtifactValue(null, ImmutableSortedMap.of(), /*entirelyRemote=*/ false) {
       @Override
       FileArtifactValue getSelfData() {
         throw new UnsupportedOperationException(toString());