repo-config: support --get-regexp
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Tue, 2 May 2006 12:22:48 +0000 (14:22 +0200)
committerJunio C Hamano <junkio@cox.net>
Wed, 3 May 2006 03:09:54 +0000 (20:09 -0700)
With --get-regexp, output all key/value pairs where the key matches a
regexp. Example:

git-repo-config --get-regexp remote.*.url

will output something like

remote.junio.url git://git.kernel.org/pub/scm/git/git.git
remote.gitk.url git://git.kernel.org/pub/scm/gitk/gitk.git

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/git-repo-config.txt
repo-config.c
t/t1300-repo-config.sh

index 566cfa183640a629ee6dcfca714169ec48f28948..ddcf52364ca0d096eef99b11621d5e7f819502bd 100644 (file)
@@ -49,7 +49,7 @@ OPTIONS
 
 --replace-all::
        Default behaviour is to replace at most one line. This replaces
-       all lines matching the key (and optionally the value_regex)
+       all lines matching the key (and optionally the value_regex).
 
 --get::
        Get the value for a given key (optionally filtered by a regex
@@ -59,6 +59,9 @@ OPTIONS
        Like get, but does not fail if the number of values for the key
        is not exactly one.
 
+--get-regexp::
+       Like --get-all, but interprets the name as a regular expression.
+
 --unset::
        Remove the line matching the key from .git/config.
 
index e35063034fc94ac14722a0bb8c544d3c5134a9ec..722153c94603d684e15dfaad7ba6b22ee855f4bf 100644 (file)
@@ -6,7 +6,10 @@ static const char git_config_set_usage[] =
 
 static char* key = NULL;
 static char* value = NULL;
+static regex_t* key_regexp = NULL;
 static regex_t* regexp = NULL;
+static int show_keys = 0;
+static int use_key_regexp = 0;
 static int do_all = 0;
 static int do_not_match = 0;
 static int seen = 0;
@@ -26,16 +29,18 @@ static int show_config(const char* key_, const char* value_)
        if (value_ == NULL)
                value_ = "";
 
-       if (!strcmp(key_, key) &&
+       if ((use_key_regexp || !strcmp(key_, key)) &&
+                       (!use_key_regexp ||
+                        !regexec(key_regexp, key_, 0, NULL, 0)) &&
                        (regexp == NULL ||
                         (do_not_match ^
                          !regexec(regexp, value_, 0, NULL, 0)))) {
-               if (do_all) {
-                       printf("%s\n", value_);
-                       return 0;
-               }
+               if (show_keys)
+                       printf("%s ", key_);
                if (seen > 0) {
-                       fprintf(stderr, "More than one value: %s\n", value);
+                       if (!do_all)
+                               fprintf(stderr, "More than one value: %s\n",
+                                               value);
                        free(value);
                }
 
@@ -50,6 +55,8 @@ static int show_config(const char* key_, const char* value_)
                        value = strdup(value_);
                }
                seen++;
+               if (do_all)
+                       printf("%s\n", value);
        }
        return 0;
 }
@@ -63,6 +70,14 @@ static int get_value(const char* key_, const char* regex_)
                key[i] = tolower(key_[i]);
        key[i] = 0;
 
+       if (use_key_regexp) {
+               key_regexp = (regex_t*)malloc(sizeof(regex_t));
+               if (regcomp(key_regexp, key, REG_EXTENDED)) {
+                       fprintf(stderr, "Invalid key pattern: %s\n", regex_);
+                       return -1;
+               }
+       }
+
        if (regex_) {
                if (regex_[0] == '!') {
                        do_not_match = 1;
@@ -78,7 +93,8 @@ static int get_value(const char* key_, const char* regex_)
 
        git_config(show_config);
        if (value) {
-               printf("%s\n", value);
+               if (!do_all)
+                       printf("%s\n", value);
                free(value);
        }
        free(key);
@@ -123,6 +139,11 @@ int main(int argc, const char **argv)
                else if (!strcmp(argv[1], "--get-all")) {
                        do_all = 1;
                        return get_value(argv[2], NULL);
+               } else if (!strcmp(argv[1], "--get-regexp")) {
+                       show_keys = 1;
+                       use_key_regexp = 1;
+                       do_all = 1;
+                       return get_value(argv[2], NULL);
                } else
 
                        return git_config_set(argv[1], argv[2]);
@@ -136,6 +157,11 @@ int main(int argc, const char **argv)
                else if (!strcmp(argv[1], "--get-all")) {
                        do_all = 1;
                        return get_value(argv[2], argv[3]);
+               } else if (!strcmp(argv[1], "--get-regexp")) {
+                       show_keys = 1;
+                       use_key_regexp = 1;
+                       do_all = 1;
+                       return get_value(argv[2], argv[3]);
                } else if (!strcmp(argv[1], "--replace-all"))
 
                        return git_config_set_multivar(argv[2], argv[3], NULL, 1);
index ab4dd5c4ce14c496e1239a0013952c4c422a6a50..1bf728fb067cfa8c7209d29207470ef09a91b4b3 100755 (executable)
@@ -247,6 +247,24 @@ EOF
 
 test_expect_success 'hierarchical section value' 'cmp .git/config expect'
 
+cat > expect << EOF
+beta.noindent=sillyValue
+nextsection.nonewline=wow2 for me
+123456.a123=987
+1.2.3.alpha=beta
+EOF
+
+test_expect_success 'working --list' \
+       'git-repo-config --list > output && cmp output expect'
+
+cat > expect << EOF
+beta.noindent sillyValue
+nextsection.nonewline wow2 for me
+EOF
+
+test_expect_success '--get-regexp' \
+       'git-repo-config --get-regexp in > output && cmp output expect'
+
 cat > .git/config << EOF
 [novalue]
        variable
@@ -255,5 +273,10 @@ EOF
 test_expect_success 'get variable with no value' \
        'git-repo-config --get novalue.variable ^$'
 
+git-repo-config > output 2>&1
+
+test_expect_success 'no arguments, but no crash' \
+       "test $? = 129 && grep usage output"
+
 test_done