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.
Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> ---
I noticed that combined diffs, which are shown by git-diff for files with conflicts, are unusable on repositories with autocrlf=true.
Steps to reproduce:
git init echo foo > file git add file git commit -m init git checkout -b a git checkout -b b echo bbb >> file git add file git commit -m bbb git checkout a echo aaa >> file git add file git commit -m aaa git config core.autocrlf true git merge b
Then look at the output of git diff.
-- Alexander
combine-diff.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-)
Show changes to combine-diff.c +12 −0
diff --git a/combine-diff.c b/combine-diff.c index 9f80a1c..da1ca99 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -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:
-- 1.6.0.rc2