[PATCH 2/2] conversion of lonely cr chars in autocrlf
From: Heiko Voigt <hidden>
Date: 2016-06-15 22:46:42
Subsystem:
the rest · Maintainer:
Linus Torvalds
This is was marked as crazy stuff but certainly done by our developers in an 10 year old rcs like repository Signed-off-by: Heiko Voigt <redacted> --- This belongs to an conversion effort of quite matured repositories. I do not know how many programs still write CR's as their line endings but there certainly are/were some. Anybody interested in that crazy stuff? convert.c | 27 +++++++++++++-------------- 1 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/convert.c b/convert.c
index 0ced471..7164f09 100644
--- a/convert.c
+++ b/convert.c@@ -133,14 +133,6 @@ static int crlf_to_git(const char *path, const char *src, size_t len, if (action == CRLF_GUESS) { /* - * We're currently not going to even try to convert stuff - * that has bare CR characters. Does anybody do that crazy - * stuff? - */ - if (stats.cr != stats.crlf) - return 0; - - /* * And add some heuristics for binary vs text, of course... */ if (is_binary(len, &stats))
@@ -158,15 +150,22 @@ static int crlf_to_git(const char *path, const char *src, size_t len, strbuf_grow(buf, len - buf->len); dst = buf->buf; if (action == CRLF_GUESS) { - /* - * If we guessed, we already know we rejected a file with - * lone CR, and we can strip a CR without looking at what - * follow it. - */ do { unsigned char c = *src++; - if (c != '\r') + if (c != '\r') { + /* if its not cr copy this char */ *dst++ = c; + continue; + } + if (c == '\r' && (1 < len && *src == '\n')) { + /* if its \r\n skip this char */ + continue; + } + if (c == '\r' && !(1 < len && *src == '\n')) { + /* if its a lonely cr substitute it */ + *dst++ = '\n'; + } + } while (--len); } else { do {
--
1.6.2.1.423.g442d