Merge branch 'jt/merge-recursive-symlink-is-not-a-dir-in-way'
authorJunio C Hamano <gitster@pobox.com>
Mon, 7 Oct 2019 02:33:02 +0000 (11:33 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Oct 2019 02:33:02 +0000 (11:33 +0900)
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

merge-recursive.c
t/t3030-merge-recursive.sh

index 6b812d6..22a12cf 100644 (file)
@@ -764,7 +764,8 @@ static int dir_in_way(struct index_state *istate, const char *path,
 
        strbuf_release(&dirpath);
        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));
 }
 
 /*
index ff641b3..faa8892 100755 (executable)
@@ -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' '
 
        git reset --hard "$c2" &&