diff options
author | Edward Thomson <ethomson@github.com> | 2016-03-28 11:13:51 -0400 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-03-28 11:13:51 -0400 |
commit | e25e1ca1b24a2cb0f7c10f9ff6723283b06e4f22 (patch) | |
tree | f1dd7f3d6c3a0092aaa6aa3487bbec99551b53d0 | |
parent | 3e95bd36d91cca0f3b1c209cc4f677125c02d442 (diff) | |
download | libgit2-e25e1ca1b24a2cb0f7c10f9ff6723283b06e4f22.tar.gz |
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.
-rw-r--r-- | src/config_file.c | 13 |
1 files 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); } |