]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: implement --fixed-value with --get*
authorDerrick Stolee <dstolee@microsoft.com>
Wed, 25 Nov 2020 22:12:55 +0000 (22:12 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Nov 2020 22:43:48 +0000 (14:43 -0800)
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>
builtin/config.c
t/t1300-config.sh

index 21892a784c2810f66081289c00608a461cff7bdb..f71fa39b38eecd558f8d246b0a20cfa84fea00cc 100644 (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);
index 4293ba22afbcbb709d0cc73beb28472824bd8235..97a04c6cc26fda58417c9242d690e68148a3d9cc 100755 (executable)
@@ -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