Merge branch 'tr/config-multivalue-lift-max'

* tr/config-multivalue-lift-max:
  config: arbitrary number of matches for --unset and --replace-all
This commit is contained in:
Junio C Hamano
2013-12-12 14:18:09 -08:00
2 changed files with 77 additions and 6 deletions

View File

@ -1210,15 +1210,14 @@ int git_config(config_fn_t fn, void *data)
* Find all the stuff for git_config_set() below.
*/
#define MAX_MATCHES 512
static struct {
int baselen;
char *key;
int do_not_match;
regex_t *value_regex;
int multi_replace;
size_t offset[MAX_MATCHES];
size_t *offset;
unsigned int offset_alloc;
enum { START, SECTION_SEEN, SECTION_END_SEEN, KEY_SEEN } state;
int seen;
} store;
@ -1241,11 +1240,11 @@ static int store_aux(const char *key, const char *value, void *cb)
if (matches(key, value)) {
if (store.seen == 1 && store.multi_replace == 0) {
warning("%s has multiple values", key);
} else if (store.seen >= MAX_MATCHES) {
error("too many matches for %s", key);
return 1;
}
ALLOC_GROW(store.offset, store.seen + 1,
store.offset_alloc);
store.offset[store.seen] = cf->do_ftell(cf);
store.seen++;
}
@ -1273,11 +1272,15 @@ static int store_aux(const char *key, const char *value, void *cb)
* Do not increment matches: this is no match, but we
* just made sure we are in the desired section.
*/
ALLOC_GROW(store.offset, store.seen + 1,
store.offset_alloc);
store.offset[store.seen] = cf->do_ftell(cf);
/* fallthru */
case SECTION_END_SEEN:
case START:
if (matches(key, value)) {
ALLOC_GROW(store.offset, store.seen + 1,
store.offset_alloc);
store.offset[store.seen] = cf->do_ftell(cf);
store.state = KEY_SEEN;
store.seen++;
@ -1285,6 +1288,9 @@ static int store_aux(const char *key, const char *value, void *cb)
if (strrchr(key, '.') - key == store.baselen &&
!strncmp(key, store.key, store.baselen)) {
store.state = SECTION_SEEN;
ALLOC_GROW(store.offset,
store.seen + 1,
store.offset_alloc);
store.offset[store.seen] = cf->do_ftell(cf);
}
}
@ -1583,6 +1589,7 @@ int git_config_set_multivar_in_file(const char *config_filename,
}
}
ALLOC_GROW(store.offset, 1, store.offset_alloc);
store.offset[0] = 0;
store.state = START;
store.seen = 0;