Merge branch 'dd/diff-files-unmerged-fix'

"git diff --relative" segfaulted and/or produced incorrect result
when there are unmerged paths.

* dd/diff-files-unmerged-fix:
  diff-lib: ignore paths that are outside $cwd if --relative asked
This commit is contained in:
Junio C Hamano 2021-09-08 13:30:31 -07:00
Родитель 85246a7054 8174627b3d
Коммит c8f491668e
2 изменённых файлов: 57 добавлений и 0 удалений

Просмотреть файл

@ -117,6 +117,10 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
if (!ce_path_match(istate, ce, &revs->prune_data, NULL))
continue;
if (revs->diffopt.prefix &&
strncmp(ce->name, revs->diffopt.prefix, revs->diffopt.prefix_length))
continue;
if (ce_stage(ce)) {
struct combine_diff_path *dpath;
struct diff_filepair *pair;

Просмотреть файл

@ -162,4 +162,57 @@ check_diff_relative_option subdir file2 true --no-relative --relative
check_diff_relative_option . file2 false --no-relative --relative=subdir
check_diff_relative_option . file2 true --no-relative --relative=subdir
test_expect_success 'setup diff --relative unmerged' '
test_commit zero file0 &&
test_commit base subdir/file0 &&
git switch -c br1 &&
test_commit one file0 &&
test_commit sub1 subdir/file0 &&
git switch -c br2 base &&
test_commit two file0 &&
git switch -c br3 &&
test_commit sub3 subdir/file0
'
test_expect_success 'diff --relative without change in subdir' '
git switch br2 &&
test_when_finished "git merge --abort" &&
test_must_fail git merge one &&
git -C subdir diff --relative >out &&
test_must_be_empty out &&
git -C subdir diff --relative --name-only >out &&
test_must_be_empty out
'
test_expect_success 'diff --relative --name-only with change in subdir' '
git switch br3 &&
test_when_finished "git merge --abort" &&
test_must_fail git merge sub1 &&
test_write_lines file0 file0 >expected &&
git -C subdir diff --relative --name-only >out &&
test_cmp expected out
'
test_expect_failure 'diff --relative with change in subdir' '
git switch br3 &&
br1_blob=$(git rev-parse --short --verify br1:subdir/file0) &&
br3_blob=$(git rev-parse --short --verify br3:subdir/file0) &&
test_when_finished "git merge --abort" &&
test_must_fail git merge br1 &&
cat >expected <<-EOF &&
diff --cc file0
index $br3_blob,$br1_blob..0000000
--- a/file0
+++ b/file0
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
+sub3
++=======
+ sub1
++>>>>>>> br1
EOF
git -C subdir diff --relative >out &&
test_cmp expected out
'
test_done