repo-config: support --get-regexp

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>
This commit is contained in:
Johannes Schindelin
2006-05-02 14:22:48 +02:00
committed by Junio C Hamano
parent 3d990f110c
commit 2fa9a0fb31
3 changed files with 60 additions and 8 deletions

View File

@ -49,7 +49,7 @@ OPTIONS
--replace-all:: --replace-all::
Default behaviour is to replace at most one line. This replaces 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::
Get the value for a given key (optionally filtered by a regex 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 Like get, but does not fail if the number of values for the key
is not exactly one. is not exactly one.
--get-regexp::
Like --get-all, but interprets the name as a regular expression.
--unset:: --unset::
Remove the line matching the key from .git/config. Remove the line matching the key from .git/config.

View File

@ -6,7 +6,10 @@ static const char git_config_set_usage[] =
static char* key = NULL; static char* key = NULL;
static char* value = 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_all = 0;
static int do_not_match = 0; static int do_not_match = 0;
static int seen = 0; static int seen = 0;
@ -26,16 +29,18 @@ static int show_config(const char* key_, const char* value_)
if (value_ == NULL) if (value_ == NULL)
value_ = ""; value_ = "";
if (!strcmp(key_, key) && if ((use_key_regexp || !strcmp(key_, key)) &&
(!use_key_regexp ||
!regexec(key_regexp, key_, 0, NULL, 0)) &&
(regexp == NULL || (regexp == NULL ||
(do_not_match ^ (do_not_match ^
!regexec(regexp, value_, 0, NULL, 0)))) { !regexec(regexp, value_, 0, NULL, 0)))) {
if (do_all) { if (show_keys)
printf("%s\n", value_); printf("%s ", key_);
return 0;
}
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_); value = strdup(value_);
} }
seen++; 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] = tolower(key_[i]);
key[i] = 0; 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_) {
if (regex_[0] == '!') { if (regex_[0] == '!') {
do_not_match = 1; do_not_match = 1;
@ -78,6 +93,7 @@ static int get_value(const char* key_, const char* regex_)
git_config(show_config); git_config(show_config);
if (value) { if (value) {
if (!do_all)
printf("%s\n", value); printf("%s\n", value);
free(value); free(value);
} }
@ -123,6 +139,11 @@ int main(int argc, const char **argv)
else if (!strcmp(argv[1], "--get-all")) { else if (!strcmp(argv[1], "--get-all")) {
do_all = 1; do_all = 1;
return get_value(argv[2], NULL); 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 } else
return git_config_set(argv[1], argv[2]); 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")) { else if (!strcmp(argv[1], "--get-all")) {
do_all = 1; do_all = 1;
return get_value(argv[2], argv[3]); 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")) } else if (!strcmp(argv[1], "--replace-all"))
return git_config_set_multivar(argv[2], argv[3], NULL, 1); return git_config_set_multivar(argv[2], argv[3], NULL, 1);

View File

@ -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 cat > .git/config << EOF
[novalue] [novalue]
variable variable
@ -255,5 +273,10 @@ EOF
test_expect_success 'get variable with no value' \ test_expect_success 'get variable with no value' \
'git-repo-config --get novalue.variable ^$' '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