aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java
diff options
context:
space:
mode:
authorGravatar Michael Thvedt <mthvedt@google.com>2016-02-09 12:15:53 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-02-10 10:20:13 +0000
commite4a7b079b7ead070612fd81c37be602c984b8d1a (patch)
tree8309f6645874d906cdd167487bcf723816b5a1c3 /src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java
parent22f287fbcdee22838f50b98244761310c527c49b (diff)
Update FileSystemValueChecker to handle TreeArtifact values.
-- MOS_MIGRATED_REVID=114202845
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java49
1 files changed, 49 insertions, 0 deletions
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 043edc2c3b..a60ad09733 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
@@ -16,14 +16,18 @@ package com.google.devtools.build.lib.skyframe;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.devtools.build.lib.actions.ActionInputHelper;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactFile;
import com.google.devtools.build.lib.actions.cache.Digest;
import com.google.devtools.build.lib.actions.cache.Metadata;
+import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
+import java.io.IOException;
+
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
@@ -160,4 +164,49 @@ public class TreeArtifactValue extends ArtifactValue {
return "MISSING_TREE_ARTIFACT";
}
};
+
+ /**
+ * Exception used when the contents of a directory do not form a valid SetArtifact.
+ * (We cannot use IOException because ActionMetadataHandler, in some code paths,
+ * interprets IOExceptions as missing files.)
+ */
+ static class TreeArtifactException extends Exception {
+ TreeArtifactException(String message) {
+ super(message);
+ }
+ }
+
+ private static void explodeDirectory(Artifact rootArtifact,
+ PathFragment pathToExplode, ImmutableSet.Builder<PathFragment> valuesBuilder)
+ throws IOException, TreeArtifactException {
+ for (Path subpath : rootArtifact.getPath().getRelative(pathToExplode).getDirectoryEntries()) {
+ PathFragment canonicalSubpathFragment =
+ pathToExplode.getChild(subpath.getBaseName()).normalize();
+ if (subpath.isDirectory()) {
+ explodeDirectory(rootArtifact,
+ pathToExplode.getChild(subpath.getBaseName()), valuesBuilder);
+ } else if (subpath.isSymbolicLink()) {
+ throw new TreeArtifactException(
+ "A SetArtifact may not contain a symlink, found " + subpath);
+ } else if (subpath.isFile()) {
+ valuesBuilder.add(canonicalSubpathFragment);
+ } else {
+ // We shouldn't ever reach here.
+ throw new IllegalStateException("Could not determine type of file " + subpath);
+ }
+ }
+ }
+
+ /**
+ * Recursively get all child files in a directory
+ * (excluding child directories themselves, but including all files in them).
+ * @throws IOException if one was thrown reading directory contents from disk.
+ * @throws TreeArtifactException if the on-disk directory is not a valid TreeArtifact.
+ */
+ static Set<PathFragment> explodeDirectory(Artifact rootArtifact)
+ throws IOException, TreeArtifactException {
+ ImmutableSet.Builder<PathFragment> explodedDirectory = ImmutableSet.builder();
+ explodeDirectory(rootArtifact, PathFragment.EMPTY_FRAGMENT, explodedDirectory);
+ return explodedDirectory.build();
+ }
}