git-branch -D: make it work even when on a yet-to-be-born branch
[gitweb.git] / builtin-repo-config.c
index c821e22717e35795b74f1c26d16f6c7da63ebdf8..7b6e5725ae6d33350a9648e57139b646ab49696e 100644 (file)
@@ -3,16 +3,16 @@
 #include <regex.h>
 
 static const char git_config_set_usage[] =
-"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 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;
+"git-repo-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list";
+
+static char *key;
+static regex_t *key_regexp;
+static regex_t *regexp;
+static int show_keys;
+static int use_key_regexp;
+static int do_all;
+static int do_not_match;
+static int seen;
 static enum { T_RAW, T_INT, T_BOOL } type = T_RAW;
 
 static int show_all_config(const char *key_, const char *value_)
@@ -72,19 +72,19 @@ static int get_value(const char* key_, const char* regex_)
                const char *home = getenv("HOME");
                local = getenv("GIT_CONFIG_LOCAL");
                if (!local)
-                       local = repo_config = strdup(git_path("config"));
+                       local = repo_config = xstrdup(git_path("config"));
                if (home)
-                       global = strdup(mkpath("%s/.gitconfig", home));
+                       global = xstrdup(mkpath("%s/.gitconfig", home));
        }
 
-       key = strdup(key_);
+       key = xstrdup(key_);
        for (tl=key+strlen(key)-1; tl >= key && *tl != '.'; --tl)
                *tl = tolower(*tl);
        for (tl=key; *tl && *tl != '.'; ++tl)
                *tl = tolower(*tl);
 
        if (use_key_regexp) {
-               key_regexp = (regex_t*)malloc(sizeof(regex_t));
+               key_regexp = (regex_t*)xmalloc(sizeof(regex_t));
                if (regcomp(key_regexp, key, REG_EXTENDED)) {
                        fprintf(stderr, "Invalid key pattern: %s\n", key_);
                        goto free_strings;
@@ -97,7 +97,7 @@ static int get_value(const char* key_, const char* regex_)
                        regex_++;
                }
 
-               regexp = (regex_t*)malloc(sizeof(regex_t));
+               regexp = (regex_t*)xmalloc(sizeof(regex_t));
                if (regcomp(regexp, regex_, REG_EXTENDED)) {
                        fprintf(stderr, "Invalid pattern: %s\n", regex_);
                        goto free_strings;
@@ -119,13 +119,11 @@ static int get_value(const char* key_, const char* regex_)
        if (do_all)
                ret = !seen;
        else
-               ret =  (seen == 1) ? 0 : 1;
+               ret = (seen == 1) ? 0 : seen > 1 ? 2 : 1;
 
 free_strings:
-       if (repo_config)
-               free(repo_config);
-       if (global)
-               free(global);
+       free(repo_config);
+       free(global);
        return ret;
 }
 
@@ -141,7 +139,16 @@ int cmd_repo_config(int argc, const char **argv, const char *prefix)
                        type = T_BOOL;
                else if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l"))
                        return git_config(show_all_config);
-               else
+               else if (!strcmp(argv[1], "--global")) {
+                       char *home = getenv("HOME");
+                       if (home) {
+                               char *user_config = xstrdup(mkpath("%s/.gitconfig", home));
+                               setenv("GIT_CONFIG", user_config, 1);
+                               free(user_config);
+                       } else {
+                               die("$HOME not set");
+                       }
+               } else
                        break;
                argc--;
                argv++;