git-config-set: add more options
[git.git] / config-set.c
index 1b1547b..90a28b3 100644 (file)
 #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);
        }