summaryrefslogtreecommitdiff
path: root/config.c
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2018-04-09 08:32:29 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-04-09 12:32:59 (GMT)
commitc71d8bb38a73abc910a63bf7a81f3869dc9c2f34 (patch)
tree7af39fce0f5084545c41c94f1bca58ff5d0c67a8 /config.c
parent22aedfccd0cfe7c8f09a990cf4777efc7f27bd2e (diff)
downloadgit-c71d8bb38a73abc910a63bf7a81f3869dc9c2f34.zip
git-c71d8bb38a73abc910a63bf7a81f3869dc9c2f34.tar.gz
git-c71d8bb38a73abc910a63bf7a81f3869dc9c2f34.tar.bz2
git_config_set: reuse empty sections
It can happen quite easily that the last setting in a config section is removed, and to avoid confusion when there are comments in the config about that section, we keep a lone section header, i.e. an empty section. Now that we use the `event_fn` callback, it is easy to add support for re-using empty sections, so let's do that. Note: t5512-ls-remote requires that this change is applied *after* the patch "git config --unset: remove empty sections (in the common case)": without that patch, there would be empty `transfer` and `uploadpack` sections ready for reuse, but in the *wrong* order (and sconsequently, t5512's "overrides work between mixed transfer/upload-pack hideRefs" would fail). Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'config.c')
-rw-r--r--config.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/config.c b/config.c
index 69c4188..d4527be 100644
--- a/config.c
+++ b/config.c
@@ -2336,6 +2336,12 @@ static int store_aux_event(enum config_event_t type,
store->parsed[store->parsed_nr].is_keys_section =
cf->var.len - 1 == store->baselen &&
!strncasecmp(cf->var.buf, store->key, store->baselen);
+ if (store->is_keys_section) {
+ store->section_seen = 1;
+ ALLOC_GROW(store->seen, store->seen_nr + 1,
+ store->seen_alloc);
+ store->seen[store->seen_nr] = store->parsed_nr;
+ }
}
store->parsed_nr++;
@@ -2770,7 +2776,13 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
new_line = 0;
if (!store.key_seen) {
- replace_end = copy_end = store.parsed[j].end;
+ copy_end = store.parsed[j].end;
+ /* include '\n' when copying section header */
+ if (copy_end > 0 && copy_end < contents_sz &&
+ contents[copy_end - 1] != '\n' &&
+ contents[copy_end] == '\n')
+ copy_end++;
+ replace_end = copy_end;
} else {
replace_end = store.parsed[j].end;
copy_end = store.parsed[j].begin;