From: Torsten Bögershausen <tboegi@xxxxxx> If .gitattributes are used to enable CRLF->LF rewriting, then commiting a file that would have its line endings rewritten, the "CRLF will be replaced by LF" warning is printed 2 times. A user expects it to be printed only once. The automatic rename detection by Git runs the conversion twice, suppress the warning in the second run. Reported-By: Adam Dinwoodie <adam@xxxxxxxxxxxxx> Signed-off-by: Torsten Bögershausen <tboegi@xxxxxx> --- diff.c | 2 ++ diffcore-break.c | 6 ++++-- diffcore.h | 1 + t/t0020-crlf.sh | 14 ++++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/diff.c b/diff.c index d3734d3..c965afc 100644 --- a/diff.c +++ b/diff.c @@ -2749,6 +2749,8 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags) enum safe_crlf crlf_warn = (safe_crlf == SAFE_CRLF_FAIL ? SAFE_CRLF_WARN : safe_crlf); + if (flags & CHECK_IGNORE_CRLF_WARNING) + crlf_warn = SAFE_CRLF_FALSE; if (!DIFF_FILE_VALID(s)) die("internal error: asking to populate invalid file."); diff --git a/diffcore-break.c b/diffcore-break.c index 5473493..4a75681 100644 --- a/diffcore-break.c +++ b/diffcore-break.c @@ -47,6 +47,7 @@ static int should_break(struct diff_filespec *src, */ unsigned long delta_size, max_size; unsigned long src_copied, literal_added, src_removed; + unsigned flags2 = 0; *merge_score_p = 0; /* assume no deletion --- "do not break" * is the default. @@ -61,9 +62,10 @@ static int should_break(struct diff_filespec *src, !hashcmp(src->sha1, dst->sha1)) return 0; /* they are the same */ - if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0)) + if (!strcmp(src->path, dst->path)) + flags2 = CHECK_IGNORE_CRLF_WARNING; + if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, flags2)) return 0; /* error but caught downstream */ - max_size = ((src->size > dst->size) ? src->size : dst->size); if (max_size < MINIMUM_BREAK_SIZE) return 0; /* we do not break too small filepair */ diff --git a/diffcore.h b/diffcore.h index 33ea2de..91464aa 100644 --- a/diffcore.h +++ b/diffcore.h @@ -57,6 +57,7 @@ extern void fill_filespec(struct diff_filespec *, const unsigned char *, #define CHECK_SIZE_ONLY 1 #define CHECK_BINARY 2 +#define CHECK_IGNORE_CRLF_WARNING 4 extern int diff_populate_filespec(struct diff_filespec *, unsigned int); extern void diff_free_filespec_data(struct diff_filespec *); extern void diff_free_filespec_blob(struct diff_filespec *); diff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh index f94120a..f7d2f74 100755 --- a/t/t0020-crlf.sh +++ b/t/t0020-crlf.sh @@ -86,6 +86,20 @@ test_expect_success 'safecrlf: print warning only once' ' test $(git add doublewarn 2>&1 | grep "CRLF will be replaced by LF" | wc -l) = 1 ' +test_expect_success 'safecrlf: print warning only once on commit' ' + + git config core.autocrlf input && + git config core.safecrlf warn && + + for w in I am all LF; do echo $w; done >doublewarn2 && + git add doublewarn2 && + git commit -m "nowarn" && + for w in Oh here is CRLFQ in text; do echo $w; done | q_to_cr >doublewarn2 && + git add doublewarn2 2>&1 && + git commit -m Message 2>&1 | grep "CRLF will be replaced by LF" >actual && + echo "warning: CRLF will be replaced by LF in doublewarn2." >expected && + test_cmp expected actual +' test_expect_success 'safecrlf: git diff demotes safecrlf=true to warn' ' git config core.autocrlf input && -- 2.0.0.rc1.6318.g0c2c796 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html