]> git.ipfire.org Git - thirdparty/git.git/commit - merge-recursive.c
merge-recursive: symlink's descendants not in way
authorJonathan Tan <jonathantanmy@google.com>
Wed, 18 Sep 2019 20:27:38 +0000 (13:27 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Sep 2019 17:15:57 +0000 (10:15 -0700)
commit83e3ad3b126125d23eea10283d85682a1a680daa
tree633d455b9afead846c749e5f93ed20be471771ed
parent5fa0f5238b0cd46cfe7f6fa76c3f526ea98148d9
merge-recursive: symlink's descendants not in way

When the working tree has:
 - bar (directory)
 - bar/file (file)
 - foo (symlink to .)

(note that lstat() for "foo/bar" would tell us that it is a directory)

and the user merges a commit that deletes the foo symlink and instead
contains:
 - bar (directory, as above)
 - bar/file (file, as above)
 - foo (directory)
 - foo/bar (file)

the merge should happen without requiring user intervention. However,
this does not happen.

This is because dir_in_way(), when checking the working tree, thinks
that "foo/bar" is a directory. But a symlink should be treated much the
same as a file: since dir_in_way() is only checking to see if there is a
directory in the way, we don't want symlinks in leading paths to
sometimes cause dir_in_way() to return true.

Teach dir_in_way() to also check for symlinks in leading paths before
reporting whether a directory is in the way.

Helped-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-recursive.c
t/t3030-merge-recursive.sh