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:
parent
c90702a1f6
commit
3f1bae1dc3
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user