diff --git a/bp2build/symlink_forest.go b/bp2build/symlink_forest.go index 7d4819110..818d7aece 100644 --- a/bp2build/symlink_forest.go +++ b/bp2build/symlink_forest.go @@ -95,13 +95,19 @@ func isDir(path string, fi os.FileInfo) bool { return fi.IsDir() } - fi2, err := os.Stat(path) - if err != nil { - fmt.Fprintf(os.Stderr, "Cannot stat '%s': %s\n", path, err) + fi2, statErr := os.Stat(path) + if statErr == nil { + return fi2.IsDir() + } + + // Check if this is a dangling symlink. If so, treat it like a file, not a dir. + _, lstatErr := os.Lstat(path) + if lstatErr != nil { + fmt.Fprintf(os.Stderr, "Cannot stat or lstat '%s': %s\n%s\n", path, statErr, lstatErr) os.Exit(1) } - return fi2.IsDir() + return false } // Recursively plants a symlink forest at forestDir. The symlink tree will diff --git a/tests/bp2build_bazel_test.sh b/tests/bp2build_bazel_test.sh index 74e49aabe..78ddced63 100755 --- a/tests/bp2build_bazel_test.sh +++ b/tests/bp2build_bazel_test.sh @@ -169,3 +169,29 @@ EOF } test_cc_correctness + +# Regression test for the following failure during symlink forest creation: +# +# Cannot stat '/tmp/st.rr054/foo/bar/unresolved_symlink': stat /tmp/st.rr054/foo/bar/unresolved_symlink: no such file or directory +# +function test_bp2build_null_build_with_unresolved_symlink_in_source() { + setup + + mkdir -p foo/bar + ln -s /tmp/non-existent foo/bar/unresolved_symlink + cat > foo/bar/Android.bp <<'EOF' +filegroup { + name: "fg", + srcs: ["unresolved_symlink/non-existent-file.txt"], + } +EOF + + run_soong bp2build + + dest=$(readlink -f out/soong/workspace/foo/bar/unresolved_symlink) + if [[ "$dest" != "/tmp/non-existent" ]]; then + fail "expected to plant an unresolved symlink out/soong/workspace/foo/bar/unresolved_symlink that resolves to /tmp/non-existent" + fi +} + +test_bp2build_null_build_with_unresolved_symlink_in_source diff --git a/tests/lib.sh b/tests/lib.sh index 7fd970a40..abe84d3fc 100644 --- a/tests/lib.sh +++ b/tests/lib.sh @@ -127,6 +127,10 @@ function create_mock_bazel() { } run_bazel() { + # Remove the ninja_build output marker file to communicate to buildbot that this is not a regular Ninja build, and its + # output should not be parsed as such. + rm -rf out/ninja_build + tools/bazel "$@" }