utf8: pick_one_utf8_char()
[gitweb.git] / diff.c
diff --git a/diff.c b/diff.c
index 61fd49236ad505abb6a62b8b014efd6a9ddbff6b..2c78d74a427aa04aba1403661c899083488e46f2 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -59,14 +59,6 @@ static struct ll_diff_driver {
        char *cmd;
 } *user_diff, **user_diff_tail;
 
-static void read_config_if_needed(void)
-{
-       if (!user_diff_tail) {
-               user_diff_tail = &user_diff;
-               git_config(git_diff_ui_config);
-       }
-}
-
 /*
  * Currently there is only "diff.<drivername>.command" variable;
  * because there are "diff.color.<slot>" variables, we are parsing
@@ -174,16 +166,28 @@ int git_diff_ui_config(const char *var, const char *value)
                if (ep != var + 4) {
                        if (!strcmp(ep, ".command"))
                                return parse_lldiff_command(var, ep, value);
-                       if (!strcmp(ep, ".funcname"))
-                               return parse_funcname_pattern(var, ep, value);
                }
        }
+
+       return git_diff_basic_config(var, value);
+}
+
+int git_diff_basic_config(const char *var, const char *value)
+{
        if (!prefixcmp(var, "diff.color.") || !prefixcmp(var, "color.diff.")) {
                int slot = parse_diff_color_slot(var, 11);
                color_parse(value, var, diff_colors[slot]);
                return 0;
        }
 
+       if (!prefixcmp(var, "diff.")) {
+               const char *ep = strrchr(var, '.');
+               if (ep != var + 4) {
+                       if (!strcmp(ep, ".funcname"))
+                               return parse_funcname_pattern(var, ep, value);
+               }
+       }
+
        return git_default_config(var, value);
 }
 
@@ -300,19 +304,25 @@ static void emit_rewrite_diff(const char *name_a,
        const char *old = diff_get_color(color_diff, DIFF_FILE_OLD);
        const char *new = diff_get_color(color_diff, DIFF_FILE_NEW);
        const char *reset = diff_get_color(color_diff, DIFF_RESET);
+       static struct strbuf a_name = STRBUF_INIT, b_name = STRBUF_INIT;
 
        name_a += (*name_a == '/');
        name_b += (*name_b == '/');
        name_a_tab = strchr(name_a, ' ') ? "\t" : "";
        name_b_tab = strchr(name_b, ' ') ? "\t" : "";
 
+       strbuf_reset(&a_name);
+       strbuf_reset(&b_name);
+       quote_two_c_style(&a_name, o->a_prefix, name_a, 0);
+       quote_two_c_style(&b_name, o->b_prefix, name_b, 0);
+
        diff_populate_filespec(one, 0);
        diff_populate_filespec(two, 0);
        lc_a = count_lines(one->data, one->size);
        lc_b = count_lines(two->data, two->size);
-       printf("%s--- %s%s%s%s\n%s+++ %s%s%s%s\n%s@@ -",
-              metainfo, o->a_prefix, name_a, name_a_tab, reset,
-              metainfo, o->b_prefix, name_b, name_b_tab, reset, fraginfo);
+       printf("%s--- %s%s%s\n%s+++ %s%s%s\n%s@@ -",
+              metainfo, a_name.buf, name_a_tab, reset,
+              metainfo, b_name.buf, name_b_tab, reset, fraginfo);
        print_line_count(lc_a);
        printf(" +");
        print_line_count(lc_b);
@@ -1148,7 +1158,6 @@ static const char *funcname_pattern(const char *ident)
 {
        struct funcname_pattern *pp;
 
-       read_config_if_needed();
        for (pp = funcname_pattern_list; pp; pp = pp->next)
                if (!strcmp(ident, pp->name))
                        return pp->pattern;
@@ -1805,7 +1814,6 @@ static const char *external_diff_attr(const char *name)
                    !ATTR_UNSET(value)) {
                        struct ll_diff_driver *drv;
 
-                       read_config_if_needed();
                        for (drv = user_diff; drv; drv = drv->next)
                                if (!strcmp(drv->name, value))
                                        return drv->cmd;