git-svn: support for funky branch and project names over HTTP(S)
[gitweb.git] / builtin-config.c
index b96c9aa74284a0c3435554312f65d880fce9e70f..e5e243f27cb7ecab11ac0933a361d066f5b35ea9 100644 (file)
@@ -2,7 +2,7 @@
 #include "cache.h"
 
 static const char git_config_set_usage[] =
-"git-config [ --global | --system ] [ --bool | --int ] [ -z | --null ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --remove-section name | --list";
+"git-config [ --global | --system | [ -f | --file ] config-file ] [ --bool | --int ] [ -z | --null ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --remove-section name | --list";
 
 static char *key;
 static regex_t *key_regexp;
@@ -138,30 +138,72 @@ static int get_value(const char* key_, const char* regex_)
        return ret;
 }
 
+char *normalize_value(const char *key, const char *value)
+{
+       char *normalized;
+
+       if (!value)
+               return NULL;
+
+       if (type == T_RAW)
+               normalized = xstrdup(value);
+       else {
+               normalized = xmalloc(64);
+               if (type == T_INT) {
+                       int v = git_config_int(key, value);
+                       sprintf(normalized, "%d", v);
+               }
+               else if (type == T_BOOL)
+                       sprintf(normalized, "%s",
+                               git_config_bool(key, value) ? "true" : "false");
+       }
+
+       return normalized;
+}
+
 int cmd_config(int argc, const char **argv, const char *prefix)
 {
        int nongit = 0;
-       setup_git_directory_gently(&nongit);
+       char* value;
+       const char *file = setup_git_directory_gently(&nongit);
 
        while (1 < argc) {
                if (!strcmp(argv[1], "--int"))
                        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 if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l")) {
+                       if (argc != 2)
+                               usage(git_config_set_usage);
+                       if (git_config(show_all_config) < 0 && file && errno)
+                               die("unable to read config file %s: %s", file,
+                                   strerror(errno));
+                       return 0;
+               }
                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);
+                               setenv(CONFIG_ENVIRONMENT, user_config, 1);
                                free(user_config);
                        } else {
                                die("$HOME not set");
                        }
                }
                else if (!strcmp(argv[1], "--system"))
-                       setenv("GIT_CONFIG", ETC_GITCONFIG, 1);
+                       setenv(CONFIG_ENVIRONMENT, ETC_GITCONFIG, 1);
+               else if (!strcmp(argv[1], "--file") || !strcmp(argv[1], "-f")) {
+                       if (argc < 3)
+                               usage(git_config_set_usage);
+                       if (!is_absolute_path(argv[2]) && file)
+                               file = prefix_filename(file, strlen(file),
+                                                      argv[2]);
+                       else
+                               file = argv[2];
+                       setenv(CONFIG_ENVIRONMENT, file, 1);
+                       argc--;
+                       argv++;
+               }
                else if (!strcmp(argv[1], "--null") || !strcmp(argv[1], "-z")) {
                        term = '\0';
                        delim = '\n';
@@ -217,9 +259,10 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                        use_key_regexp = 1;
                        do_all = 1;
                        return get_value(argv[2], NULL);
-               } else
-
-                       return git_config_set(argv[1], argv[2]);
+               } else {
+                       value = normalize_value(argv[1], argv[2]);
+                       return git_config_set(argv[1], value);
+               }
        case 4:
                if (!strcmp(argv[1], "--unset"))
                        return git_config_set_multivar(argv[2], NULL, argv[3], 0);
@@ -235,17 +278,21 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                        use_key_regexp = 1;
                        do_all = 1;
                        return get_value(argv[2], argv[3]);
-               } else if (!strcmp(argv[1], "--add"))
-                       return git_config_set_multivar(argv[2], argv[3], "^$", 0);
-               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], 0);
+               } else if (!strcmp(argv[1], "--add")) {
+                       value = normalize_value(argv[2], argv[3]);
+                       return git_config_set_multivar(argv[2], value, "^$", 0);
+               } else if (!strcmp(argv[1], "--replace-all")) {
+                       value = normalize_value(argv[2], argv[3]);
+                       return git_config_set_multivar(argv[2], value, NULL, 1);
+               } else {
+                       value = normalize_value(argv[1], argv[2]);
+                       return git_config_set_multivar(argv[1], value, argv[3], 0);
+               }
        case 5:
-               if (!strcmp(argv[1], "--replace-all"))
-                       return git_config_set_multivar(argv[2], argv[3], argv[4], 1);
+               if (!strcmp(argv[1], "--replace-all")) {
+                       value = normalize_value(argv[2], argv[3]);
+                       return git_config_set_multivar(argv[2], value, argv[4], 1);
+               }
        case 1:
        default:
                usage(git_config_set_usage);