Merge branch 'jt/merge-recursive-symlink-is-not-a-dir-in-way'

A bug in merge-recursive code that triggers when a branch with a
symbolic link is merged with a branch that replaces it with a
directory has been fixed.

* jt/merge-recursive-symlink-is-not-a-dir-in-way:
  merge-recursive: symlink's descendants not in way
maint
Junio C Hamano 2019-10-07 11:33:02 +09:00
commit 1f4485b219
2 changed files with 30 additions and 1 deletions

View File

@ -764,7 +764,8 @@ static int dir_in_way(struct index_state *istate, const char *path,


strbuf_release(&dirpath); strbuf_release(&dirpath);
return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode) && return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode) &&
!(empty_ok && is_empty_dir(path)); !(empty_ok && is_empty_dir(path)) &&
!has_symlink_leading_path(path, strlen(path));
} }


/* /*

View File

@ -452,6 +452,34 @@ test_expect_success 'merge-recursive d/f conflict result' '


' '


test_expect_success SYMLINKS 'dir in working tree with symlink ancestor does not produce d/f conflict' '
git init sym &&
(
cd sym &&
ln -s . foo &&
mkdir bar &&
>bar/file &&
git add foo bar/file &&
git commit -m "foo symlink" &&

git checkout -b branch1 &&
git commit --allow-empty -m "empty commit" &&

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" &&

git checkout branch1 &&

git cherry-pick master &&
test_path_is_dir foo &&
test_path_is_file foo/bar
)
'

test_expect_success 'reset and 3-way merge' ' test_expect_success 'reset and 3-way merge' '


git reset --hard "$c2" && git reset --hard "$c2" &&