diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2005-11-20 06:52:22 +0100 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-11-19 23:15:07 -0800 |
commit | 4ddba79db76bd6425f00e99ceb1d82d179319aec (patch) | |
tree | 9cf3d1dec1dcfa54ab21573a6eacd6ea02e896ce /config-set.c | |
parent | 7b5d895da6d86eda36af84516a359192ca1da469 (diff) | |
download | git-4ddba79db76bd6425f00e99ceb1d82d179319aec.tar.gz |
git-config-set: add more options
... namely
--replace-all, to replace any amount of matching lines, not just 0 or 1,
--get, to get the value of one key,
--get-all, the multivar version of --get, and
--unset-all, which deletes all matching lines from .git/config
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'config-set.c')
-rw-r--r-- | config-set.c | 92 |
1 files changed, 87 insertions, 5 deletions
diff --git a/config-set.c b/config-set.c index 1b1547b534..90a28b381f 100644 --- a/config-set.c +++ b/config-set.c @@ -1,24 +1,106 @@ #include "cache.h" +#include <regex.h> static const char git_config_set_usage[] = -"git-config-set name [value [value_regex]] | --unset name [value_regex]"; +"git-config-set [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]]"; + +static char* key = NULL; +static char* value = NULL; +static regex_t* regex = NULL; +static int do_all = 0; +static int seen = 0; + +static int show_config(const char* key_, const char* value_) +{ + if (!strcmp(key_, key) && + (regex == NULL || + !regexec(regex, value_, 0, NULL, 0))) { + if (do_all) { + printf("%s\n", value_); + return 0; + } + if (seen > 0) { + fprintf(stderr, "More than one value: %s\n", value); + free(value); + } + value = strdup(value_); + seen++; + } + return 0; +} + +static int get_value(const char* key_, const char* regex_) +{ + int i; + + key = malloc(strlen(key_)+1); + for (i = 0; key_[i]; i++) + key[i] = tolower(key_[i]); + + if (regex_) { + regex = (regex_t*)malloc(sizeof(regex_t)); + if (regcomp(regex, regex_, REG_EXTENDED)) { + fprintf(stderr, "Invalid pattern: %s\n", regex_); + return -1; + } + } + + i = git_config(show_config); + if (value) { + printf("%s\n", value); + free(value); + } + free(key); + if (regex) { + regfree(regex); + free(regex); + } + + if (do_all) + return 0; + + return seen == 1 ? 0 : 1; +} int main(int argc, const char **argv) { setup_git_directory(); switch (argc) { case 2: - return git_config_set(argv[1], NULL); + return get_value(argv[1], NULL); case 3: if (!strcmp(argv[1], "--unset")) return git_config_set(argv[2], NULL); - else + else if (!strcmp(argv[1], "--unset-all")) + return git_config_set_multivar(argv[2], NULL, NULL, 1); + else if (!strcmp(argv[1], "--get")) + return get_value(argv[2], NULL); + else if (!strcmp(argv[1], "--get-all")) { + do_all = 1; + return get_value(argv[2], NULL); + } else + return git_config_set(argv[1], argv[2]); case 4: if (!strcmp(argv[1], "--unset")) - return git_config_set_multivar(argv[2], NULL, argv[3]); + return git_config_set_multivar(argv[2], NULL, argv[3], 0); + else if (!strcmp(argv[1], "--unset-all")) + return git_config_set_multivar(argv[2], NULL, argv[3], 1); + else if (!strcmp(argv[1], "--get")) + 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], "--replace-all")) + + return git_config_set_multivar(argv[2], argv[3], NULL, 1); else - return git_config_set_multivar(argv[1], argv[2], argv[3]); + + return git_config_set_multivar(argv[1], argv[2], argv[3], 0); + case 5: + if (!strcmp(argv[1], "--replace-all")) + return git_config_set_multivar(argv[2], argv[3], argv[4], 1); + case 1: default: usage(git_config_set_usage); } |