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>
This commit is contained in:
Johannes Schindelin 2018-04-09 10:32:29 +02:00 committed by Junio C Hamano
parent 22aedfccd0
commit c71d8bb38a
2 changed files with 14 additions and 2 deletions

View File

@ -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;

View File

@ -1483,7 +1483,7 @@ test_expect_success '--unset-all removes section if empty & uncommented' '
test_line_count = 0 .git/config
'
test_expect_failure 'adding a key into an empty section reuses header' '
test_expect_success 'adding a key into an empty section reuses header' '
cat >.git/config <<-\EOF &&
[section]
EOF