diff options
-rw-r--r-- | src/crlf.c | 13 | ||||
-rw-r--r-- | tests-clar/checkout/crlf.c | 46 |
2 files changed, 54 insertions, 5 deletions
diff --git a/src/crlf.c b/src/crlf.c index 84347ac6c..cd6d9825f 100644 --- a/src/crlf.c +++ b/src/crlf.c @@ -223,12 +223,17 @@ static int crlf_apply_to_odb( static int convert_line_endings(git_buf *dest, const git_buf *source, const char *ending) { const char *scan = git_buf_cstr(source), - *next, - *scan_end = git_buf_cstr(source) + git_buf_len(source); + *next, + *line_end, + *scan_end = git_buf_cstr(source) + git_buf_len(source); while ((next = memchr(scan, '\n', scan_end - scan)) != NULL) { - if (next > scan) - git_buf_put(dest, scan, next-scan); + if (next > scan) { + line_end = *(next - 1) == '\r' ? next - 1 : next; + git_buf_put(dest, scan, line_end - scan); + scan = next + 1; + } + git_buf_puts(dest, ending); scan = next + 1; } diff --git a/tests-clar/checkout/crlf.c b/tests-clar/checkout/crlf.c index 39889a181..40f083c1c 100644 --- a/tests-clar/checkout/crlf.c +++ b/tests-clar/checkout/crlf.c @@ -10,7 +10,9 @@ #define MORE_CRLF_TEXT_RAW "crlf\r\ncrlf\r\nlf\ncrlf\r\ncrlf\r\n" #define MORE_LF_TEXT_RAW "lf\nlf\ncrlf\r\nlf\nlf\n" -#define ALL_LF_TEXT_AS_CRLF "lf\r\nlf\r\nlf\r\nlf\r\nlf\r\n" +#define ALL_LF_TEXT_AS_CRLF "lf\r\nlf\r\nlf\r\nlf\r\nlf\r\n" +#define MORE_CRLF_TEXT_AS_CRLF "crlf\r\ncrlf\r\nlf\r\ncrlf\r\ncrlf\r\n" +#define MORE_LF_TEXT_AS_CRLF "lf\r\nlf\r\ncrlf\r\nlf\r\nlf\r\n" static git_repository *g_repo; @@ -78,6 +80,48 @@ void test_checkout_crlf__detect_crlf_autocrlf_true(void) #endif } +void test_checkout_crlf__more_lf_autocrlf_true(void) +{ +#ifdef GIT_WIN32 + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + cl_repo_set_bool(g_repo, "core.autocrlf", true); + + git_checkout_head(g_repo, &opts); + + test_file_contents("./crlf/more-lf", MORE_LF_TEXT_AS_CRLF); +#endif +} + +void test_checkout_crlf__more_crlf_autocrlf_true(void) +{ +#ifdef GIT_WIN32 + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + cl_repo_set_bool(g_repo, "core.autocrlf", true); + + git_checkout_head(g_repo, &opts); + + test_file_contents("./crlf/more-crlf", MORE_CRLF_TEXT_AS_CRLF); +#endif +} + +void test_checkout_crlf__all_crlf_autocrlf_true(void) +{ +#ifdef GIT_WIN32 + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + cl_repo_set_bool(g_repo, "core.autocrlf", true); + + git_checkout_head(g_repo, &opts); + + test_file_contents("./crlf/all-crlf", ALL_CRLF_TEXT_RAW); +#endif +} + void test_checkout_crlf__autocrlf_true_index_size_is_filtered_size(void) { #ifdef GIT_WIN32 |