Browse Source

Respect core.autocrlf in combined diff

Fix git-diff to make it produce useful 3-way diffs for merge conflicts in
repositories with autocrlf enabled. Otherwise it always reports that the
whole file was changed, because it uses the contents from the working tree
without necessary conversion.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Alexander Gavrilov 17 years ago committed by Junio C Hamano
parent
commit
5e568f9e30
  1. 12
      combine-diff.c
  2. 16
      t/t4015-diff-whitespace.sh

12
combine-diff.c

@ -727,6 +727,18 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, @@ -727,6 +727,18 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
die("early EOF '%s'", elem->path);

result[len] = 0;

/* If not a fake symlink, apply filters, e.g. autocrlf */
if (is_file) {
struct strbuf buf;

strbuf_init(&buf, 0);
if (convert_to_git(elem->path, result, len, &buf, safe_crlf)) {
free(result);
result = strbuf_detach(&buf, &len);
result_size = len;
}
}
}
else {
deleted_file:

16
t/t4015-diff-whitespace.sh

@ -352,4 +352,20 @@ test_expect_success 'checkdiff allows new blank lines' ' @@ -352,4 +352,20 @@ test_expect_success 'checkdiff allows new blank lines' '
git diff --check
'

test_expect_success 'combined diff with autocrlf conversion' '

git reset --hard &&
echo >x hello &&
git commit -m "one side" x &&
git checkout HEAD^ &&
echo >x goodbye &&
git commit -m "the other side" x &&
git config core.autocrlf true &&
test_must_fail git merge master &&

git diff | sed -e "1,/^@@@/d" >actual &&
! grep "^-" actual

'

test_done

Loading…
Cancel
Save