Browse Source

Merge branch 'js/repoconfig'

* js/repoconfig:
  repo-config: deconvolute logics
  repo-config: readability fixups.
  repo-config: support --get-regexp
maint
Junio C Hamano 19 years ago
parent
commit
6b16250a45
  1. 5
      Documentation/git-repo-config.txt
  2. 82
      repo-config.c
  3. 23
      t/t1300-repo-config.sh

5
Documentation/git-repo-config.txt

@ -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.



82
repo-config.c

@ -2,11 +2,13 @@
#include <regex.h> #include <regex.h>


static const char git_config_set_usage[] = static const char git_config_set_usage[] =
"git-repo-config [ --bool | --int ] [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list"; "git-repo-config [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list";


static char* key = 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_all = 0;
static int do_not_match = 0; static int do_not_match = 0;
static int seen = 0; static int seen = 0;
@ -23,34 +25,40 @@ static int show_all_config(const char *key_, const char *value_)


static int show_config(const char* key_, const char* value_) static int show_config(const char* key_, const char* value_)
{ {
char value[256];
const char *vptr = value;
int dup_error = 0;

if (value_ == NULL) if (value_ == NULL)
value_ = ""; value_ = "";


if (!strcmp(key_, key) && if (!use_key_regexp && strcmp(key_, key))
(regexp == NULL || return 0;
if (use_key_regexp && regexec(key_regexp, key_, 0, NULL, 0))
return 0;
if (regexp != NULL &&
(do_not_match ^ (do_not_match ^
!regexec(regexp, value_, 0, NULL, 0)))) { regexec(regexp, value_, 0, NULL, 0)))
if (do_all) { return 0;
printf("%s\n", value_);
return 0;
}
if (seen > 0) {
fprintf(stderr, "More than one value: %s\n", value);
free(value);
}


if (type == T_INT) { if (show_keys)
value = malloc(256); printf("%s ", key_);
sprintf(value, "%d", git_config_int(key_, value_)); if (seen && !do_all)
} else if (type == T_BOOL) { dup_error = 1;
value = malloc(256); if (type == T_INT)
sprintf(value, "%s", git_config_bool(key_, value_) sprintf(value, "%d", git_config_int(key_, value_));
? "true" : "false"); else if (type == T_BOOL)
} else { vptr = git_config_bool(key_, value_) ? "true" : "false";
value = strdup(value_); else
} vptr = value_;
seen++; seen++;
if (dup_error) {
error("More than one value for the key %s: %s",
key_, vptr);
} }
else
printf("%s\n", vptr);

return 0; return 0;
} }


@ -63,6 +71,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", key_);
return -1;
}
}

if (regex_) { if (regex_) {
if (regex_[0] == '!') { if (regex_[0] == '!') {
do_not_match = 1; do_not_match = 1;
@ -77,10 +93,6 @@ static int get_value(const char* key_, const char* regex_)
} }


git_config(show_config); git_config(show_config);
if (value) {
printf("%s\n", value);
free(value);
}
free(key); free(key);
if (regexp) { if (regexp) {
regfree(regexp); regfree(regexp);
@ -88,9 +100,9 @@ static int get_value(const char* key_, const char* regex_)
} }


if (do_all) if (do_all)
return 0; return !seen;


return seen == 1 ? 0 : 1; return (seen == 1) ? 0 : 1;
} }


int main(int argc, const char **argv) int main(int argc, const char **argv)
@ -123,6 +135,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 +153,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);

23
t/t1300-repo-config.sh

@ -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



Loading…
Cancel
Save