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
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 1bfa16b..0abf331 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 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 @@ // 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 e8f4509..3cedc40 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 @@ 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