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 566cfa1..ddcf523 100644 (file)
@@ -49,7 +49,7 @@ OPTIONS
 
 --replace-all::
        Default behaviour is to replace at most one line. This replaces
 
 --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
 
 --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.
 
        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.
 
 --unset::
        Remove the line matching the key from .git/config.
 
index e350630..722153c 100644 (file)
@@ -6,7 +6,10 @@ static const char git_config_set_usage[] =
 
 static char* key = NULL;
 static char* value = NULL;
 
 static char* key = NULL;
 static char* value = NULL;
+static regex_t* key_regexp = NULL;
 static regex_t* 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;
 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 (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)))) {
                        (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) {
                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);
                }
 
                        free(value);
                }
 
@@ -50,6 +55,8 @@ static int show_config(const char* key_, const char* value_)
                        value = strdup(value_);
                }
                seen++;
                        value = strdup(value_);
                }
                seen++;
+               if (do_all)
+                       printf("%s\n", value);
        }
        return 0;
 }
        }
        return 0;
 }
@@ -63,6 +70,14 @@ static int get_value(const char* key_, const char* regex_)
                key[i] = tolower(key_[i]);
        key[i] = 0;
 
                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;
        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) {
 
        git_config(show_config);
        if (value) {
-               printf("%s\n", value);
+               if (!do_all)
+                       printf("%s\n", value);
                free(value);
        }
        free(key);
                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-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]);
                } 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-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);
                } else if (!strcmp(argv[1], "--replace-all"))
 
                        return git_config_set_multivar(argv[2], argv[3], NULL, 1);
index ab4dd5c..1bf728f 100755 (executable)
@@ -247,6 +247,24 @@ EOF
 
 test_expect_success 'hierarchical section value' 'cmp .git/config expect'
 
 
 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
 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 ^$'
 
 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
 
 test_done