summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlosmn@github.com>2016-03-29 03:26:43 -0700
committerCarlos Martín Nieto <carlosmn@github.com>2016-03-29 03:26:43 -0700
commit2f0450f4d635358f6da5d174c128b9ed1059bbf8 (patch)
tree752127195c68b2d000429d743f40fff994de26c7
parentb085ecbe09019f885842c9b7244f9a9c8b639f86 (diff)
parent76e1a679eab9964c2857ead896e170cacb0cef1d (diff)
downloadlibgit2-2f0450f4d635358f6da5d174c128b9ed1059bbf8.tar.gz
Merge pull request #3712 from ethomson/config_duplicate_section
config: don't write duplicate section
-rw-r--r--src/config_file.c13
-rw-r--r--tests/config/write.c24
2 files changed, 33 insertions, 4 deletions
diff --git a/src/config_file.c b/src/config_file.c
index 02bb2f75e..e33b83738 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -1483,7 +1483,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;
@@ -1534,7 +1534,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;
@@ -1850,7 +1850,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;
@@ -1869,7 +1870,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);
}
diff --git a/tests/config/write.c b/tests/config/write.c
index e634aa326..e83cfb415 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 = GIT_BUF_INIT;
+ 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);
+}