config: implement --fixed-value with --get*

The config builtin does its own regex matching of values for the --get,
--get-all, and --get-regexp modes. Plumb the existing 'flags' parameter
to the get_value() method so we can initialize the value-pattern argument
as a fixed string instead of a regex pattern.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2020-11-25 22:12:55 +00:00 committed by Junio C Hamano
parent c90702a1f6
commit 3f1bae1dc3
2 changed files with 32 additions and 5 deletions

View File

@ -14,6 +14,7 @@ static const char *const builtin_config_usage[] = {
static char *key;
static regex_t *key_regexp;
static const char *value_pattern;
static regex_t *regexp;
static int show_keys;
static int omit_values;
@ -298,6 +299,8 @@ 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 (fixed_value && strcmp(value_pattern, (value_?value_:"")))
return 0;
if (regexp != NULL &&
(do_not_match ^ !!regexec(regexp, (value_?value_:""), 0, NULL, 0)))
return 0;
@ -308,7 +311,7 @@ static int collect_config(const char *key_, const char *value_, void *cb)
return format_config(&values->items[values->nr++], key_, value_);
}
static int get_value(const char *key_, const char *regex_)
static int get_value(const char *key_, const char *regex_, unsigned flags)
{
int ret = CONFIG_GENERIC_ERROR;
struct strbuf_list values = {NULL};
@ -345,7 +348,9 @@ static int get_value(const char *key_, const char *regex_)
}
}
if (regex_) {
if (regex_ && (flags & CONFIG_FLAGS_FIXED_VALUE))
value_pattern = regex_;
else if (regex_) {
if (regex_[0] == '!') {
do_not_match = 1;
regex_++;
@ -890,19 +895,19 @@ int cmd_config(int argc, const char **argv, const char *prefix)
}
else if (actions == ACTION_GET) {
check_argc(argc, 1, 2);
return get_value(argv[0], argv[1]);
return get_value(argv[0], argv[1], flags);
}
else if (actions == ACTION_GET_ALL) {
do_all = 1;
check_argc(argc, 1, 2);
return get_value(argv[0], argv[1]);
return get_value(argv[0], argv[1], flags);
}
else if (actions == ACTION_GET_REGEXP) {
show_keys = 1;
use_key_regexp = 1;
do_all = 1;
check_argc(argc, 1, 2);
return get_value(argv[0], argv[1]);
return get_value(argv[0], argv[1], flags);
}
else if (actions == ACTION_GET_URLMATCH) {
check_argc(argc, 2, 2);

View File

@ -2044,4 +2044,26 @@ test_expect_success '--fixed-value uses exact string matching' '
test_cmp expect actual
'
test_expect_success '--get and --get-all with --fixed-value' '
test_when_finished rm -f config &&
META="a+b*c?d[e]f.g" &&
git config --file=config fixed.test bogus &&
git config --file=config --add fixed.test "$META" &&
git config --file=config --get fixed.test bogus &&
test_must_fail git config --file=config --get fixed.test "$META" &&
git config --file=config --get --fixed-value fixed.test "$META" &&
test_must_fail git config --file=config --get --fixed-value fixed.test non-existent &&
git config --file=config --get-all fixed.test bogus &&
test_must_fail git config --file=config --get-all fixed.test "$META" &&
git config --file=config --get-all --fixed-value fixed.test "$META" &&
test_must_fail git config --file=config --get-all --fixed-value fixed.test non-existent &&
git config --file=config --get-regexp fixed+ bogus &&
test_must_fail git config --file=config --get-regexp fixed+ "$META" &&
git config --file=config --get-regexp --fixed-value fixed+ "$META" &&
test_must_fail git config --file=config --get-regexp --fixed-value fixed+ non-existent
'
test_done