mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 15:00:04 +00:00
Merge pull request #3712 from ethomson/config_duplicate_section
config: don't write duplicate section
This commit is contained in:
commit
2f0450f4d6
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user