diff options
author | Michael Thvedt <mthvedt@google.com> | 2016-02-09 12:15:53 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-02-10 10:20:13 +0000 |
commit | e4a7b079b7ead070612fd81c37be602c984b8d1a (patch) | |
tree | 8309f6645874d906cdd167487bcf723816b5a1c3 /src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java | |
parent | 22f287fbcdee22838f50b98244761310c527c49b (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.java | 49 |
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(); + } } |