@@ -14,6 +14,7 @@ static const char *const builtin_config_usage[] = {
static char *key;
static regex_t *key_regexp;
+static const char *value_regex;
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 (literal && strcmp(value_regex, (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_, int 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_LITERAL_VALUE))
+ value_regex = regex_;
+ else if (regex_) {
if (regex_[0] == '!') {
do_not_match = 1;
regex_++;
@@ -850,19 +855,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);
@@ -2026,4 +2026,28 @@ test_expect_success '--literal-value uses exact string matching' '
test_cmp_config bogus literal.test
'
+test_expect_success '--get and --get-all with --literal-value' '
+ GLOB="a+b*c?d[e]f.g" &&
+ q_to_tab >.git/config <<-EOF &&
+ [literal]
+ Qtest = bogus
+ Qtest = $GLOB
+ EOF
+
+ git config --get literal.test bogus &&
+ test_must_fail git config --get literal.test "$GLOB" &&
+ git config --get --literal-value literal.test "$GLOB" &&
+ test_must_fail git config --get --literal-value literal.test non-existent &&
+
+ git config --get-all literal.test bogus &&
+ test_must_fail git config --get-all literal.test "$GLOB" &&
+ git config --get-all --literal-value literal.test "$GLOB" &&
+ test_must_fail git config --get-all --literal-value literal.test non-existent &&
+
+ git config --get-regexp literal+ bogus &&
+ test_must_fail git config --get-regexp literal+ "$GLOB" &&
+ git config --get-regexp --literal-value literal+ "$GLOB" &&
+ test_must_fail git config --get-regexp --literal-value literal+ non-existent
+'
+
test_done