diff --git a/src/checkout.c b/src/checkout.c index 411bf3be7..40f5732ed 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -724,10 +724,8 @@ static int blob_content_to_file( error = buffer_to_file( st, &filtered, path, opts->dir_mode, opts->file_open_flags, file_mode); - if (!error) { - st->st_size = blob->odb_object->raw.len; + if (!error) st->st_mode = entry_filemode; - } cleanup: git_filters_free(&filters); diff --git a/tests-clar/checkout/crlf.c b/tests-clar/checkout/crlf.c new file mode 100644 index 000000000..cf7521e90 --- /dev/null +++ b/tests-clar/checkout/crlf.c @@ -0,0 +1,106 @@ +#include "clar_libgit2.h" +#include "checkout_helpers.h" + +#include "git2/checkout.h" +#include "repository.h" + +#define UTF8_BOM "\xEF\xBB\xBF" +#define ALL_CRLF_TEXT_RAW "crlf\r\ncrlf\r\ncrlf\r\ncrlf\r\n" +#define ALL_LF_TEXT_RAW "lf\nlf\nlf\nlf\nlf\n" +#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" + +static git_repository *g_repo; + +void test_checkout_crlf__initialize(void) +{ + git_tree *tree; + + g_repo = cl_git_sandbox_init("crlf"); + + cl_git_pass(git_repository_head_tree(&tree, g_repo)); +} + +void test_checkout_crlf__cleanup(void) +{ + cl_git_sandbox_cleanup(); +} + +static void set_config_entry_to(const char *entry_name, bool value) +{ + git_config *cfg; + + cl_git_pass(git_repository_config(&cfg, g_repo)); + cl_git_pass(git_config_set_bool(cfg, entry_name, value)); + + git_config_free(cfg); +} + +static void set_core_autocrlf_to(bool value) +{ + set_config_entry_to("core.autocrlf", value); +} + +void test_checkout_crlf__detect_crlf_autocrlf_false(void) +{ + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + set_core_autocrlf_to(false); + + git_checkout_head(g_repo, &opts); + + test_file_contents("./crlf/all-lf", ALL_LF_TEXT_RAW); +} + +void test_checkout_crlf__autocrlf_false_index_size_is_unfiltered_size(void) +{ + git_index *index; + const git_index_entry *entry; + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + set_core_autocrlf_to(false); + + git_checkout_head(g_repo, &opts); + + git_repository_index(&index, g_repo); + + cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL); + cl_assert(entry->file_size == strlen(ALL_LF_TEXT_RAW)); + + git_index_free(index); +} + +void test_checkout_crlf__detect_crlf_autocrlf_true(void) +{ + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + set_core_autocrlf_to(true); + + git_checkout_head(g_repo, &opts); + + test_file_contents("./crlf/all-lf", ALL_LF_TEXT_AS_CRLF); +} + +void test_checkout_crlf__autocrlf_true_index_size_is_filtered_size(void) +{ + git_index *index; + const git_index_entry *entry; + git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; + opts.checkout_strategy = GIT_CHECKOUT_SAFE_CREATE; + + set_core_autocrlf_to(true); + + git_checkout_head(g_repo, &opts); + + git_repository_index(&index, g_repo); + + cl_assert((entry = git_index_get_bypath(index, "all-lf", 0)) != NULL); + cl_assert(entry->file_size == strlen(ALL_LF_TEXT_AS_CRLF)); + + git_index_free(index); +} diff --git a/tests-clar/resources/crlf/.gitted/HEAD b/tests-clar/resources/crlf/.gitted/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/tests-clar/resources/crlf/.gitted/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests-clar/resources/crlf/.gitted/objects/04/de00b358f13389948756732158eaaaefa1448c b/tests-clar/resources/crlf/.gitted/objects/04/de00b358f13389948756732158eaaaefa1448c new file mode 100644 index 000000000..c3b7598c0 Binary files /dev/null and b/tests-clar/resources/crlf/.gitted/objects/04/de00b358f13389948756732158eaaaefa1448c differ diff --git a/tests-clar/resources/crlf/.gitted/objects/0a/a76e474d259bd7c13eb726a1396c381db55c88 b/tests-clar/resources/crlf/.gitted/objects/0a/a76e474d259bd7c13eb726a1396c381db55c88 new file mode 100644 index 000000000..e118d6656 Binary files /dev/null and b/tests-clar/resources/crlf/.gitted/objects/0a/a76e474d259bd7c13eb726a1396c381db55c88 differ diff --git a/tests-clar/resources/crlf/.gitted/objects/0d/06894e14df22e066763ae906e0ed3eb79c205f b/tests-clar/resources/crlf/.gitted/objects/0d/06894e14df22e066763ae906e0ed3eb79c205f new file mode 100644 index 000000000..b7a1f3290 Binary files /dev/null and b/tests-clar/resources/crlf/.gitted/objects/0d/06894e14df22e066763ae906e0ed3eb79c205f differ diff --git a/tests-clar/resources/crlf/.gitted/objects/0f/f5a53f19bfd2b5eea1ba550295c47515678987 b/tests-clar/resources/crlf/.gitted/objects/0f/f5a53f19bfd2b5eea1ba550295c47515678987 new file mode 100644 index 000000000..5366acd8c Binary files /dev/null and b/tests-clar/resources/crlf/.gitted/objects/0f/f5a53f19bfd2b5eea1ba550295c47515678987 differ diff --git a/tests-clar/resources/crlf/.gitted/objects/12/faf3c1ea55f572473cec9052fca468c3584ccb b/tests-clar/resources/crlf/.gitted/objects/12/faf3c1ea55f572473cec9052fca468c3584ccb new file mode 100644 index 000000000..96d5b2f91 --- /dev/null +++ b/tests-clar/resources/crlf/.gitted/objects/12/faf3c1ea55f572473cec9052fca468c3584ccb @@ -0,0 +1 @@ +x 1}Nۀ,b6K6`.ؾQoab-A0dXbtnr:0cy(*Y