am: avoid directory rename detection when calling recursive merge machinery
[gitweb.git] / builtin / config.c
index 2f78a02ca1d893c7c0a57b56dfba65d291acf49e..b29d26dede79b9a5c46bdc4f951b22e7b88310b3 100644 (file)
@@ -61,6 +61,7 @@ static int show_origin;
 #define TYPE_BOOL_OR_INT       3
 #define TYPE_PATH              4
 #define TYPE_EXPIRY_DATE       5
+#define TYPE_COLOR             6
 
 #define OPT_CALLBACK_VALUE(s, l, v, h, i) \
        { OPTION_CALLBACK, (s), (l), (v), NULL, (h), PARSE_OPT_NOARG | \
@@ -94,6 +95,8 @@ static int option_parse_type(const struct option *opt, const char *arg,
                        new_type = TYPE_PATH;
                else if (!strcmp(arg, "expiry-date"))
                        new_type = TYPE_EXPIRY_DATE;
+               else if (!strcmp(arg, "color"))
+                       new_type = TYPE_COLOR;
                else
                        die(_("unrecognized --type argument, %s"), arg);
        }
@@ -230,6 +233,11 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value
                        if (git_config_expiry_date(&t, key_, value_) < 0)
                                return -1;
                        strbuf_addf(buf, "%"PRItime, t);
+               } else if (type == TYPE_COLOR) {
+                       char v[COLOR_MAXLEN];
+                       if (git_config_color(v, key_, value_) < 0)
+                               return -1;
+                       strbuf_addstr(buf, v);
                } else if (value_) {
                        strbuf_addstr(buf, value_);
                } else {
@@ -375,8 +383,22 @@ static char *normalize_value(const char *key, const char *value)
                else
                        return xstrdup(v ? "true" : "false");
        }
+       if (type == TYPE_COLOR) {
+               char v[COLOR_MAXLEN];
+               if (git_config_color(v, key, value))
+                       die("cannot parse color '%s'", value);
+
+               /*
+                * The contents of `v` now contain an ANSI escape
+                * sequence, not suitable for including within a
+                * configuration file. Treat the above as a
+                * "sanity-check", and return the given value, which we
+                * know is representable as valid color code.
+                */
+               return xstrdup(value);
+       }
 
-       die("BUG: cannot normalize type %d", type);
+       BUG("cannot normalize type %d", type);
 }
 
 static int get_color_found;
@@ -580,6 +602,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        if (use_local_config && nongit)
                die(_("--local can only be used inside a git repository"));
 
+       if (given_config_source.blob && nongit)
+               die(_("--blob can only be used inside a git repository"));
+
        if (given_config_source.file &&
                        !strcmp(given_config_source.file, "-")) {
                given_config_source.file = NULL;