diff --git a/src/config_file.c b/src/config_file.c index 4ba83d1d9..12ae4a214 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -1182,6 +1182,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p goto rewrite_fail; } + /* If we are here, there is at least a section line */ + if (*(cfg->reader.buffer.ptr + cfg->reader.buffer.size - 1) != '\n') + git_filebuf_write(&file, "\n", 1); + git_filebuf_printf(&file, "\t%s = %s\n", name, value); } } diff --git a/tests-clar/config/write.c b/tests-clar/config/write.c index 13b669cb2..eeda4d66a 100644 --- a/tests-clar/config/write.c +++ b/tests-clar/config/write.c @@ -3,11 +3,13 @@ void test_config_write__initialize(void) { cl_fixture_sandbox("config/config9"); + cl_fixture_sandbox("config/config17"); } void test_config_write__cleanup(void) { cl_fixture_cleanup("config9"); + cl_fixture_cleanup("config17"); } void test_config_write__replace_value(void) @@ -136,3 +138,19 @@ void test_config_write__escape_value(void) cl_assert_equal_s(str, "this \"has\" quotes and \t"); git_config_free(cfg); } + +void test_config_write__add_value_in_file_with_no_clrf_at_the_end(void) +{ + git_config *cfg; + int i; + + cl_git_pass(git_config_open_ondisk(&cfg, "config17")); + cl_git_pass(git_config_set_int32(cfg, "core.newline", 7)); + git_config_free(cfg); + + cl_git_pass(git_config_open_ondisk(&cfg, "config17")); + cl_git_pass(git_config_get_int32(&i, cfg, "core.newline")); + cl_assert_equal_i(7, i); + + git_config_free(cfg); +} diff --git a/tests-clar/resources/config/config17 b/tests-clar/resources/config/config17 new file mode 100644 index 000000000..ca25a86af --- /dev/null +++ b/tests-clar/resources/config/config17 @@ -0,0 +1,3 @@ +[core] + dummy2 = 7 + global = 17 \ No newline at end of file