crlf: update checkout logic to reflect Git 2.9+ behaviour Signed-off-by: Sven Strickroth <email@cs-ware.de>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d138d74..41958c1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,8 @@ v0.27 + 1
### Changes or improvements
+* Update CrLf checkout code to vanilla Git >= 2.9 logic
+
### API additions
### API removals
diff --git a/src/crlf.c b/src/crlf.c
index 9af6007..9a70956 100644
--- a/src/crlf.c
+++ b/src/crlf.c
@@ -71,6 +71,9 @@ static int crlf_input_action(struct crlf_attrs *ca)
if (ca->eol == GIT_EOL_LF)
return GIT_CRLF_INPUT;
+ if (ca->crlf_action == GIT_CRLF_AUTO)
+ return GIT_CRLF_AUTO;
+
if (ca->eol == GIT_EOL_CRLF)
return GIT_CRLF_CRLF;
@@ -200,6 +203,8 @@ static const char *line_ending(struct crlf_attrs *ca)
break;
case GIT_CRLF_AUTO:
+ if (ca->eol == GIT_EOL_CRLF)
+ return "\r\n";
case GIT_CRLF_TEXT:
break;
@@ -253,8 +258,7 @@ static int crlf_apply_to_workdir(
ca->crlf_action == GIT_CRLF_GUESS) {
/* If we have any existing CR or CRLF line endings, do nothing */
- if (ca->crlf_action == GIT_CRLF_GUESS &&
- stats.cr > 0 && stats.crlf > 0)
+ if (stats.cr > 0 && stats.crlf > 0)
return GIT_PASSTHROUGH;
/* If we have bare CR characters, do nothing */
@@ -314,7 +318,7 @@ static int crlf_check(
ca.auto_crlf == GIT_AUTO_CRLF_FALSE)
return GIT_PASSTHROUGH;
- if (ca.auto_crlf == GIT_AUTO_CRLF_INPUT &&
+ if (ca.auto_crlf == GIT_AUTO_CRLF_INPUT && ca.eol != GIT_EOL_CRLF &&
git_filter_source_mode(src) == GIT_FILTER_SMUDGE)
return GIT_PASSTHROUGH;
}