diff options
author | 2016-12-09 22:19:32 +0000 | |
---|---|---|
committer | 2016-12-12 20:35:14 +0000 | |
commit | b5f480cb7c79ccbd938e5892834736dd4d3b5eef (patch) | |
tree | a7475de98fcd51498819d448a5e59539950093ef | |
parent | fd93143f93a9873218cd2eb783a0bff322847213 (diff) |
Sandbox should not mount directory for nonempty tree artifacts.
Instead they mount the individual files. Currently, non-empty tree artifacts result in ERR_DIRECTORY_NOT_EMPTY because we attempt to mount both the directory and the files inside it.
Fixes https://github.com/bazelbuild/bazel/issues/1745.
--
PiperOrigin-RevId: 141599030
MOS_MIGRATED_REVID=141599030
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java | 11 | ||||
-rwxr-xr-x | src/test/shell/bazel/android/android_integration_test.sh | 22 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java index 1bfa16b197..0abf331917 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -193,8 +194,14 @@ public final class SpawnHelpers { // inputs. for (ActionInput input : spawn.getInputFiles()) { if (input instanceof Artifact && ((Artifact) input).isTreeArtifact()) { - PathFragment mount = new PathFragment(input.getExecPathString()); - mounts.put(mount, execRoot.getRelative(mount)); + List<Artifact> containedArtifacts = new ArrayList<>(); + actionExecutionContext.getArtifactExpander().expand((Artifact) input, containedArtifacts); + // Attempting to mount a non-empty directory results in ERR_DIRECTORY_NOT_EMPTY, so we only + // mount empty TreeArtifacts as directories. + if (containedArtifacts.isEmpty()) { + PathFragment mount = new PathFragment(input.getExecPathString()); + mounts.put(mount, execRoot.getRelative(mount)); + } } } diff --git a/src/test/shell/bazel/android/android_integration_test.sh b/src/test/shell/bazel/android/android_integration_test.sh index e8f4509f3a..3cedc40276 100755 --- a/src/test/shell/bazel/android/android_integration_test.sh +++ b/src/test/shell/bazel/android/android_integration_test.sh @@ -257,6 +257,28 @@ EOF bazel build :test } +function test_nonempty_aar_resources_tree_artifact() { + create_new_workspace + setup_android_support + cat > AndroidManifest.xml <<EOF +<manifest package="com.test"/> +EOF + mkdir -p res/values + cat > res/values/values.xml <<EOF +<?xml version="1.0" encoding="utf-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android"> +</resources> +EOF + zip test.aar AndroidManifest.xml res/values/values.xml + cat > BUILD <<EOF +aar_import( + name = "test", + aar = "test.aar", +) +EOF + bazel build :test +} + # ndk r10 and earlier if [[ ! -r "${TEST_SRCDIR}/androidndk/ndk/RELEASE.TXT" ]]; then # ndk r11 and later |