aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Adam Michael <ajmichael@google.com>2016-12-09 22:19:32 +0000
committerGravatar John Cater <jcater@google.com>2016-12-12 20:35:14 +0000
commitb5f480cb7c79ccbd938e5892834736dd4d3b5eef (patch)
treea7475de98fcd51498819d448a5e59539950093ef
parentfd93143f93a9873218cd2eb783a0bff322847213 (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.java11
-rwxr-xr-xsrc/test/shell/bazel/android/android_integration_test.sh22
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