Skip to content

Commit

Permalink
builtin/config: collect "value_regexp" data in a struct
Browse files Browse the repository at this point in the history
`git config` can take an optional "value_regexp". Collect the
`regex_t`-pointer and the `do_not_match` flag into a new `struct
cmd_line_value`.

Rather than signalling/judging presence of a regexp by the NULL-ness of
the pointer, introduce a `mode` enum. After this commit, we just have
two modes, "none" and "regexp", but we will gain another one in the next
commit.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Martin Ågren authored and gitster committed Nov 14, 2019
1 parent 3bcdd85 commit 3bf986d
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions builtin/config.c
Expand Up @@ -14,12 +14,15 @@ static const char *const builtin_config_usage[] = {

static char *key;
static regex_t *key_regexp;
static regex_t *regexp;
static struct {
enum { none, regexp } mode;
regex_t *regexp;
int do_not_match; /* used with `regexp` */
} cmd_line_value;
static int show_keys;
static int omit_values;
static int use_key_regexp;
static int do_all;
static int do_not_match;
static char delim = '=';
static char key_delim = ' ';
static char term = '\n';
Expand Down Expand Up @@ -270,8 +273,10 @@ static int collect_config(const char *key_, const char *value_, void *cb)
return 0;
if (use_key_regexp && regexec(key_regexp, key_, 0, NULL, 0))
return 0;
if (regexp != NULL &&
(do_not_match ^ !!regexec(regexp, (value_?value_:""), 0, NULL, 0)))
if (cmd_line_value.mode == regexp &&
(cmd_line_value.do_not_match ^
!!regexec(cmd_line_value.regexp, value_ ? value_ : "",
0, NULL, 0)))
return 0;

ALLOC_GROW(values->items, values->nr + 1, values->alloc);
Expand All @@ -283,19 +288,21 @@ static int collect_config(const char *key_, const char *value_, void *cb)
static int handle_value_regex(const char *regex_)
{
if (!regex_) {
regexp = NULL;
cmd_line_value.mode = none;
return 0;
}

cmd_line_value.mode = regexp;

if (regex_[0] == '!') {
do_not_match = 1;
cmd_line_value.do_not_match = 1;
regex_++;
}

regexp = (regex_t*)xmalloc(sizeof(regex_t));
if (regcomp(regexp, regex_, REG_EXTENDED)) {
cmd_line_value.regexp = xmalloc(sizeof(*cmd_line_value.regexp));
if (regcomp(cmd_line_value.regexp, regex_, REG_EXTENDED)) {
error(_("invalid pattern: %s"), regex_);
FREE_AND_NULL(regexp);
FREE_AND_NULL(cmd_line_value.regexp);
return CONFIG_INVALID_PATTERN;
}

Expand Down Expand Up @@ -372,9 +379,9 @@ static int get_value(const char *key_, const char *regex_)
regfree(key_regexp);
free(key_regexp);
}
if (regexp) {
regfree(regexp);
free(regexp);
if (cmd_line_value.regexp) {
regfree(cmd_line_value.regexp);
free(cmd_line_value.regexp);
}

return ret;
Expand Down

0 comments on commit 3bf986d

Please sign in to comment.