> OK. We notice that we need to newly create foo/bar but we > incorrectly find that there is "foo/bar" already because of the > careless use of bare lstat(2) makes "bar" visible as if it were also > "foo/bar". I wonder if the current code would be confused the same > way if the side branch added "foo/bar/file", or the confusion would > be even worse---it is not dir_in_way() and a different codepath > would be affected, no? I don't think there is a different codepath to be affected - as far as I can tell, dir_in_way() is the only cause (at least of this particular error). I've tested this case [1] and the current code actually works - as you said, dir_in_way() will not report anything in the way (since foo/bar/file doesn't exist in the working tree), so the merge will happen as expected. > Nicely done. Thanks, will queue. Thanks. [1] diff --git a/t/t3030-merge-recursive.sh b/t/t3030-merge-recursive.sh index faa8892741..f284aeb173 100755 --- a/t/t3030-merge-recursive.sh +++ b/t/t3030-merge-recursive.sh @@ -468,15 +468,16 @@ test_expect_success SYMLINKS 'dir in working tree with symlink ancestor does not git checkout master && git rm foo && mkdir foo && - >foo/bar && - git add foo/bar && - git commit -m "replace foo symlink with real foo dir and foo/bar file" && + mkdir foo/bar && + >foo/bar/baz && + git add foo/bar/baz && + git commit -m "replace foo symlink with real foo dir and foo/bar/baz file" && git checkout branch1 && git cherry-pick master && test_path_is_dir foo && - test_path_is_file foo/bar + test_path_is_file foo/bar/baz ) '