From de791f15a1b01e63f3c870c8497c594c47452fab Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Tue, 25 Apr 2006 00:59:25 +0200 Subject: git-repo-config --list support This adds git-repo-config --list (or git-repo-config -l) support, similar to what git-var -l does now (to be phased out so that we have a single sane interface to the config file instead of fragmented and confused API). Signed-off-by: Petr Baudis --- repo-config.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'repo-config.c') diff --git a/repo-config.c b/repo-config.c index c5ebb7668..fa8aba7a1 100644 --- a/repo-config.c +++ b/repo-config.c @@ -2,7 +2,7 @@ #include static const char git_config_set_usage[] = -"git-repo-config [ --bool | --int ] [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]]"; +"git-repo-config [ --bool | --int ] [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list"; static char* key = NULL; static char* value = NULL; @@ -12,6 +12,15 @@ static int do_not_match = 0; static int seen = 0; static enum { T_RAW, T_INT, T_BOOL } type = T_RAW; +static int show_all_config(const char *key_, const char *value_) +{ + if (value_) + printf("%s=%s\n", key_, value_); + else + printf("%s\n", key_); + return 0; +} + static int show_config(const char* key_, const char* value_) { if (value_ == NULL) @@ -67,7 +76,7 @@ static int get_value(const char* key_, const char* regex_) } } - i = git_config(show_config); + git_config(show_config); if (value) { printf("%s\n", value); free(value); @@ -99,6 +108,9 @@ int main(int argc, const char **argv) argv++; } + if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l")) + return git_config(show_all_config); + switch (argc) { case 2: return get_value(argv[1], NULL); -- cgit v1.2.1 From cfa24e184a67cc36f414d913cf705d31e70a7a1a Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 2 May 2006 12:54:12 -0700 Subject: repo-config: fix segfault with no argument. An earlier addition of --list feature was carelessly done and caused an invalid access to argv[1] when it was not given. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- repo-config.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'repo-config.c') diff --git a/repo-config.c b/repo-config.c index fa8aba7a1..e35063034 100644 --- a/repo-config.c +++ b/repo-config.c @@ -102,15 +102,14 @@ int main(int argc, const char **argv) type = T_INT; else if (!strcmp(argv[1], "--bool")) type = T_BOOL; + else if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l")) + return git_config(show_all_config); else break; argc--; argv++; } - if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l")) - return git_config(show_all_config); - switch (argc) { case 2: return get_value(argv[1], NULL); -- cgit v1.2.1 From 2fa9a0fb31cbf01e8318a02c3e222d7fd3fd0a83 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 2 May 2006 14:22:48 +0200 Subject: 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 Signed-off-by: Junio C Hamano --- repo-config.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'repo-config.c') diff --git a/repo-config.c b/repo-config.c index e35063034..722153c94 100644 --- a/repo-config.c +++ b/repo-config.c @@ -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); -- cgit v1.2.1 From e098c6f82a28efe1488c7eb1bed4e92f76dd2afd Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 2 May 2006 21:06:56 -0700 Subject: repo-config: readability fixups. Signed-off-by: Junio C Hamano --- repo-config.c | 46 ++++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) (limited to 'repo-config.c') diff --git a/repo-config.c b/repo-config.c index 722153c94..7e06d1a04 100644 --- a/repo-config.c +++ b/repo-config.c @@ -2,10 +2,9 @@ #include 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* value = NULL; static regex_t* key_regexp = NULL; static regex_t* regexp = NULL; static int show_keys = 0; @@ -26,6 +25,9 @@ static int show_all_config(const char *key_, const char *value_) static int show_config(const char* key_, const char* value_) { + char value[256]; + const char *vptr = value; + if (value_ == NULL) value_ = ""; @@ -35,28 +37,25 @@ static int show_config(const char* key_, const char* value_) (regexp == NULL || (do_not_match ^ !regexec(regexp, value_, 0, NULL, 0)))) { + int dup_error = 0; if (show_keys) printf("%s ", key_); - if (seen > 0) { - if (!do_all) - fprintf(stderr, "More than one value: %s\n", - value); - free(value); - } - - if (type == T_INT) { - value = malloc(256); + if (seen && !do_all) + dup_error = 1; + if (type == T_INT) sprintf(value, "%d", git_config_int(key_, value_)); - } else if (type == T_BOOL) { - value = malloc(256); + else if (type == T_BOOL) sprintf(value, "%s", git_config_bool(key_, value_) ? "true" : "false"); - } else { - value = strdup(value_); - } + else + vptr = value_; seen++; - if (do_all) - printf("%s\n", value); + if (dup_error) { + error("More than one value for the key %s: %s", + key_, vptr); + } + else + printf("%s\n", vptr); } return 0; } @@ -73,7 +72,7 @@ static int get_value(const char* key_, const char* regex_) 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_); + fprintf(stderr, "Invalid key pattern: %s\n", key_); return -1; } } @@ -92,11 +91,6 @@ static int get_value(const char* key_, const char* regex_) } git_config(show_config); - if (value) { - if (!do_all) - printf("%s\n", value); - free(value); - } free(key); if (regexp) { regfree(regexp); @@ -104,9 +98,9 @@ static int get_value(const char* key_, const char* regex_) } if (do_all) - return 0; + return !seen; - return seen == 1 ? 0 : 1; + return (seen == 1) ? 0 : 1; } int main(int argc, const char **argv) -- cgit v1.2.1 From 8f5ff31f8e74ac2f72c3c415beb2639bc36f7cb7 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 3 May 2006 14:41:03 +0200 Subject: repo-config: deconvolute logics It was rightly noticed that the logic is quite convoluted. Fix that. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- repo-config.c | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) (limited to 'repo-config.c') diff --git a/repo-config.c b/repo-config.c index 7e06d1a04..63eda1bb7 100644 --- a/repo-config.c +++ b/repo-config.c @@ -27,36 +27,38 @@ static int show_config(const char* key_, const char* value_) { char value[256]; const char *vptr = value; + int dup_error = 0; if (value_ == NULL) value_ = ""; - if ((use_key_regexp || !strcmp(key_, key)) && - (!use_key_regexp || - !regexec(key_regexp, key_, 0, NULL, 0)) && - (regexp == NULL || + if (!use_key_regexp && strcmp(key_, key)) + return 0; + if (use_key_regexp && regexec(key_regexp, key_, 0, NULL, 0)) + return 0; + if (regexp != NULL && (do_not_match ^ - !regexec(regexp, value_, 0, NULL, 0)))) { - int dup_error = 0; - if (show_keys) - printf("%s ", key_); - if (seen && !do_all) - dup_error = 1; - if (type == T_INT) - sprintf(value, "%d", git_config_int(key_, value_)); - else if (type == T_BOOL) - sprintf(value, "%s", git_config_bool(key_, value_) - ? "true" : "false"); - else - vptr = value_; - seen++; - if (dup_error) { - error("More than one value for the key %s: %s", - key_, vptr); - } - else - printf("%s\n", vptr); + regexec(regexp, value_, 0, NULL, 0))) + return 0; + + if (show_keys) + printf("%s ", key_); + if (seen && !do_all) + dup_error = 1; + if (type == T_INT) + sprintf(value, "%d", git_config_int(key_, value_)); + else if (type == T_BOOL) + vptr = git_config_bool(key_, value_) ? "true" : "false"; + else + vptr = value_; + seen++; + if (dup_error) { + error("More than one value for the key %s: %s", + key_, vptr); } + else + printf("%s\n", vptr); + return 0; } -- cgit v1.2.1