From eea982843e34da679689f7c53a4874894a225e9f Mon Sep 17 00:00:00 2001 From: Marius Storm-Olsen Date: Mon, 9 Jun 2008 22:22:37 +0100 Subject: [PATCH 1/2] Add testcase for merging in a CRLF repo If you work on a repo with core.autocrlf == true, you would expect every text file to have CRLF EOLs. However, if you by some operation, get a conflict, then the conflicted file has LF EOLs. Now, of course you'd go about resolving the files conflict, and then 'git add '. When you do that, you'll get the warning saying that LF will be replaced by CRLF. Then you commit. The end result is that you have a workingdir with a mix of LF and CRLF files, which after some more operations may trigger a "whole file changed" diff, due to the workingdir file now having LF EOLs. An LF only conflict file results in the resolved file being in LF, the commit is in LF and a warning saying that LF will be replaced by CRLF, and the working dir ends up with a mix of CRLF and LF files. Signed-off-by: Marius Storm-Olsen Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- t/t6033-merge-crlf.sh | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 t/t6033-merge-crlf.sh diff --git a/t/t6033-merge-crlf.sh b/t/t6033-merge-crlf.sh new file mode 100755 index 0000000000..ea22837aa7 --- /dev/null +++ b/t/t6033-merge-crlf.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +append_cr () { + sed -e 's/$/Q/' | tr Q '\015' +} + +remove_cr () { + tr '\015' Q | sed -e 's/Q$//' +} + +test_description='merge conflict in crlf repo + + b---M + / / + initial---a + +' + +. ./test-lib.sh + +test_expect_success setup ' + git config core.autocrlf true && + echo foo | append_cr >file && + git add file && + git commit -m "Initial" && + git tag initial && + git branch side && + echo line from a | append_cr >file && + git commit -m "add line from a" file && + git tag a && + git checkout side && + echo line from b | append_cr >file && + git commit -m "add line from b" file && + git tag b && + git checkout master +' + +test_expect_success 'Check "ours" is CRLF' ' + git reset --hard initial && + git merge side -s ours && + cat file | remove_cr | append_cr >file.temp && + test_cmp file file.temp +' + +test_expect_failure 'Check that conflict file is CRLF' ' + git reset --hard a && + test_must_fail git merge side && + cat file | remove_cr | append_cr >file.temp && + test_cmp file file.temp +' + +test_done From 249c61a62d82c22df98cb72ec61c120887b944e1 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 9 Jun 2008 22:23:16 +0100 Subject: [PATCH 2/2] merge-recursive: respect core.autocrlf when writing out the result The code forgot to convert the blob contents into work tree representation before writing it out. Also fixes leaks -- earlier the updated blobs were never freed. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- builtin-merge-recursive.c | 11 +++++++++++ t/t6033-merge-crlf.sh | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/builtin-merge-recursive.c b/builtin-merge-recursive.c index 910c0d20e7..175e8b1660 100644 --- a/builtin-merge-recursive.c +++ b/builtin-merge-recursive.c @@ -551,9 +551,19 @@ static void update_file_flags(const unsigned char *sha, die("cannot read object %s '%s'", sha1_to_hex(sha), path); if (type != OBJ_BLOB) die("blob expected for %s '%s'", sha1_to_hex(sha), path); + if (S_ISREG(mode)) { + struct strbuf strbuf; + strbuf_init(&strbuf, 0); + if (convert_to_working_tree(path, buf, size, &strbuf)) { + free(buf); + size = strbuf.len; + buf = strbuf_detach(&strbuf, NULL); + } + } if (make_room_for_path(path) < 0) { update_wd = 0; + free(buf); goto update_index; } if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) { @@ -576,6 +586,7 @@ static void update_file_flags(const unsigned char *sha, } else die("do not know what to do with %06o %s '%s'", mode, sha1_to_hex(sha), path); + free(buf); } update_index: if (update_cache) diff --git a/t/t6033-merge-crlf.sh b/t/t6033-merge-crlf.sh index ea22837aa7..75d9602de4 100755 --- a/t/t6033-merge-crlf.sh +++ b/t/t6033-merge-crlf.sh @@ -42,7 +42,7 @@ test_expect_success 'Check "ours" is CRLF' ' test_cmp file file.temp ' -test_expect_failure 'Check that conflict file is CRLF' ' +test_expect_success 'Check that conflict file is CRLF' ' git reset --hard a && test_must_fail git merge side && cat file | remove_cr | append_cr >file.temp &&