gitweb: Incremental blame (using JavaScript)
[gitweb.git] / builtin-config.c
index d037e4745c139b1491e5cd344ebf1f24cd8111c0..a2d656edb383da47fb3622f1f7c2d1524285ac00 100644 (file)
@@ -19,11 +19,10 @@ static int seen;
 static char delim = '=';
 static char key_delim = ' ';
 static char term = '\n';
-static enum { T_RAW, T_INT, T_BOOL, T_BOOL_OR_INT } type = T_RAW;
 
 static int use_global_config, use_system_config;
 static const char *given_config_file;
-static int actions;
+static int actions, types;
 static const char *get_color_slot, *get_colorbool_slot;
 static int end_null;
 
@@ -43,6 +42,10 @@ static int end_null;
 #define ACTION_GET_COLOR (1<<13)
 #define ACTION_GET_COLORBOOL (1<<14)
 
+#define TYPE_BOOL (1<<0)
+#define TYPE_INT (1<<1)
+#define TYPE_BOOL_OR_INT (1<<2)
+
 static struct option builtin_config_options[] = {
        OPT_GROUP("Config file location"),
        OPT_BOOLEAN(0, "global", &use_global_config, "use global config file"),
@@ -52,7 +55,7 @@ static struct option builtin_config_options[] = {
        OPT_BIT(0, "get", &actions, "get value: name [value-regex]", ACTION_GET),
        OPT_BIT(0, "get-all", &actions, "get all values: key [value-regex]", ACTION_GET_ALL),
        OPT_BIT(0, "get-regexp", &actions, "get values for regexp: name-regex [value-regex]", ACTION_GET_REGEXP),
-       OPT_BIT(0, "replace-all", &actions, "replace all matching variables: name [value [value_regex]", ACTION_REPLACE_ALL),
+       OPT_BIT(0, "replace-all", &actions, "replace all matching variables: name value [value_regex]", ACTION_REPLACE_ALL),
        OPT_BIT(0, "add", &actions, "adds a new variable: name value", ACTION_ADD),
        OPT_BIT(0, "unset", &actions, "removes a variable: name [value-regex]", ACTION_UNSET),
        OPT_BIT(0, "unset-all", &actions, "removes all matches: name [value-regex]", ACTION_UNSET_ALL),
@@ -63,9 +66,9 @@ static struct option builtin_config_options[] = {
        OPT_STRING(0, "get-color", &get_color_slot, "slot", "find the color configured: [default]"),
        OPT_STRING(0, "get-colorbool", &get_colorbool_slot, "slot", "find the color setting: [stdout-is-tty]"),
        OPT_GROUP("Type"),
-       OPT_SET_INT(0, "bool", &type, "value is \"true\" or \"false\"", T_BOOL),
-       OPT_SET_INT(0, "int", &type, "value is decimal number", T_INT),
-       OPT_SET_INT(0, "bool-or-int", &type, NULL, T_BOOL_OR_INT),
+       OPT_BIT(0, "bool", &types, "value is \"true\" or \"false\"", TYPE_BOOL),
+       OPT_BIT(0, "int", &types, "value is decimal number", TYPE_INT),
+       OPT_BIT(0, "bool-or-int", &types, "value is --bool or --int", TYPE_BOOL_OR_INT),
        OPT_GROUP("Other"),
        OPT_BOOLEAN('z', "null", &end_null, "terminate values with NUL byte"),
        OPT_END(),
@@ -109,11 +112,11 @@ static int show_config(const char *key_, const char *value_, void *cb)
        }
        if (seen && !do_all)
                dup_error = 1;
-       if (type == T_INT)
+       if (types == TYPE_INT)
                sprintf(value, "%d", git_config_int(key_, value_?value_:""));
-       else if (type == T_BOOL)
+       else if (types == TYPE_BOOL)
                vptr = git_config_bool(key_, value_) ? "true" : "false";
-       else if (type == T_BOOL_OR_INT) {
+       else if (types == TYPE_BOOL_OR_INT) {
                int is_bool, v;
                v = git_config_bool_or_int(key_, value_, &is_bool);
                if (is_bool)
@@ -212,18 +215,18 @@ static char *normalize_value(const char *key, const char *value)
        if (!value)
                return NULL;
 
-       if (type == T_RAW)
+       if (types == 0)
                normalized = xstrdup(value);
        else {
                normalized = xmalloc(64);
-               if (type == T_INT) {
+               if (types == TYPE_INT) {
                        int v = git_config_int(key, value);
                        sprintf(normalized, "%d", v);
                }
-               else if (type == T_BOOL)
+               else if (types == TYPE_BOOL)
                        sprintf(normalized, "%s",
                                git_config_bool(key, value) ? "true" : "false");
-               else if (type == T_BOOL_OR_INT) {
+               else if (types == TYPE_BOOL_OR_INT) {
                        int is_bool, v;
                        v = git_config_bool_or_int(key, value, &is_bool);
                        if (!is_bool)
@@ -313,7 +316,8 @@ int cmd_config(int argc, const char **argv, const char *unused_prefix)
 
        config_exclusive_filename = getenv(CONFIG_ENVIRONMENT);
 
-       argc = parse_options(argc, argv, builtin_config_options, builtin_config_usage,
+       argc = parse_options(argc, argv, prefix, builtin_config_options,
+                            builtin_config_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
 
        if (use_global_config + use_system_config + !!given_config_file > 1) {
@@ -347,11 +351,21 @@ int cmd_config(int argc, const char **argv, const char *unused_prefix)
                key_delim = '\n';
        }
 
+       if (HAS_MULTI_BITS(types)) {
+               error("only one type at a time.");
+               usage_with_options(builtin_config_usage, builtin_config_options);
+       }
+
        if (get_color_slot)
            actions |= ACTION_GET_COLOR;
        if (get_colorbool_slot)
            actions |= ACTION_GET_COLORBOOL;
 
+       if ((get_color_slot || get_colorbool_slot) && types) {
+               error("--get-color and variable type are incoherent");
+               usage_with_options(builtin_config_usage, builtin_config_options);
+       }
+
        if (HAS_MULTI_BITS(actions)) {
                error("only one action at a time.");
                usage_with_options(builtin_config_usage, builtin_config_options);
@@ -366,15 +380,19 @@ int cmd_config(int argc, const char **argv, const char *unused_prefix)
                }
 
        if (actions == ACTION_LIST) {
+               check_argc(argc, 0, 0);
                if (git_config(show_all_config, NULL) < 0) {
                        if (config_exclusive_filename)
-                               die("unable to read config file %s: %s",
-                                   config_exclusive_filename, strerror(errno));
+                               die_errno("unable to read config file '%s'",
+                                         config_exclusive_filename);
                        else
                                die("error processing config file(s)");
                }
        }
        else if (actions == ACTION_EDIT) {
+               check_argc(argc, 0, 0);
+               if (!config_exclusive_filename && nongit)
+                       die("not in a git directory");
                git_config(git_default_config, NULL);
                launch_editor(config_exclusive_filename ?
                              config_exclusive_filename : git_path("config"),