From 3e95bd36d91cca0f3b1c209cc4f677125c02d442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Fri, 4 Mar 2016 14:51:16 +0100 Subject: [PATCH 1/3] config: show we write a spurious duplicated section header We should notice that we are in the correct section to add. This is a cosmetic bug, since replacing any of these settings does work. --- tests/config/write.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/config/write.c b/tests/config/write.c index e634aa326..ac0272eac 100644 --- a/tests/config/write.c +++ b/tests/config/write.c @@ -695,3 +695,27 @@ void test_config_write__locking(void) git_config_free(cfg); } + +void test_config_write__repeated(void) +{ + const char *filename = "config-repeated"; + git_config *cfg; + git_buf result; + const char *expected = "[sample \"prefix\"]\n\ +\tsetting1 = someValue1\n\ +\tsetting2 = someValue2\n\ +\tsetting3 = someValue3\n\ +\tsetting4 = someValue4\n\ +"; + cl_git_pass(git_config_open_ondisk(&cfg, filename)); + cl_git_pass(git_config_set_string(cfg, "sample.prefix.setting1", "someValue1")); + cl_git_pass(git_config_set_string(cfg, "sample.prefix.setting2", "someValue2")); + cl_git_pass(git_config_set_string(cfg, "sample.prefix.setting3", "someValue3")); + cl_git_pass(git_config_set_string(cfg, "sample.prefix.setting4", "someValue4")); + + cl_git_pass(git_config_open_ondisk(&cfg, filename)); + + cl_git_pass(git_futils_readbuffer(&result, filename)); + cl_assert_equal_s(expected, result.ptr); + git_buf_free(&result); +} From e25e1ca1b24a2cb0f7c10f9ff6723283b06e4f22 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Mon, 28 Mar 2016 11:13:51 -0400 Subject: [PATCH 2/3] config: don't write section header if we're in it If we hit the EOF while trying to write a new value, it may be that we're already in the section that we were looking for. If so, do not write a (duplicate) section header, just write the value. --- src/config_file.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/config_file.c b/src/config_file.c index 584b9fa82..b2d21b00c 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -1500,7 +1500,7 @@ static int config_parse( int (*on_section)(struct reader **reader, const char *current_section, const char *line, size_t line_len, void *data), int (*on_variable)(struct reader **reader, const char *current_section, char *var_name, char *var_value, const char *line, size_t line_len, void *data), int (*on_comment)(struct reader **reader, const char *line, size_t line_len, void *data), - int (*on_eof)(struct reader **reader, void *data), + int (*on_eof)(struct reader **reader, const char *current_section, void *data), void *data) { char *current_section = NULL, *var_name, *var_value, *line_start; @@ -1551,7 +1551,7 @@ static int config_parse( } if (on_eof) - result = on_eof(&reader, data); + result = on_eof(&reader, current_section, data); git__free(current_section); return result; @@ -1867,7 +1867,8 @@ static int write_on_comment(struct reader **reader, const char *line, size_t lin return write_line_to(&write_data->buffered_comment, line, line_len); } -static int write_on_eof(struct reader **reader, void *data) +static int write_on_eof( + struct reader **reader, const char *current_section, void *data) { struct write_data *write_data = (struct write_data *)data; int result = 0; @@ -1886,7 +1887,11 @@ static int write_on_eof(struct reader **reader, void *data) * value. */ if ((!write_data->preg || !write_data->preg_replaced) && write_data->value) { - if ((result = write_section(write_data->buf, write_data->section)) == 0) + /* write the section header unless we're already in it */ + if (!current_section || strcmp(current_section, write_data->section)) + result = write_section(write_data->buf, write_data->section); + + if (!result) result = write_value(write_data); } From 76e1a679eab9964c2857ead896e170cacb0cef1d Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Mon, 28 Mar 2016 08:56:13 -0700 Subject: [PATCH 3/3] config::write::repeated: init our buffer --- tests/config/write.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/config/write.c b/tests/config/write.c index ac0272eac..e83cfb415 100644 --- a/tests/config/write.c +++ b/tests/config/write.c @@ -700,7 +700,7 @@ void test_config_write__repeated(void) { const char *filename = "config-repeated"; git_config *cfg; - git_buf result; + git_buf result = GIT_BUF_INIT; const char *expected = "[sample \"prefix\"]\n\ \tsetting1 = someValue1\n\ \tsetting2 = someValue2\n\