]> git.ipfire.org Git - thirdparty/git.git/commitdiff
range-diff: relieve callers of low-level configuration burden
authorEric Sunshine <sunshine@sunshineco.com>
Sun, 22 Jul 2018 09:57:12 +0000 (05:57 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Aug 2018 21:27:04 +0000 (14:27 -0700)
There are a number of very low-level configuration details which need to
be managed precisely to generate a proper range-diff. In particular,
'diff_options' output format, header suppression, indentation, and
dual-color mode must all be set appropriately to ensure proper behavior.

Handle these details locally in the libified range-diff back-end rather
than forcing each caller to have specialized knowledge of these
implementation details, and to avoid duplication as new callers are
added.

While at it, localize these tweaks to be active only while generating
the range-diff, so they don't clobber the caller-provided
'diff_options', which might be used beyond range-diff generation.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/range-diff.c
range-diff.c
range-diff.h

index 006e76672631f679097d50f8db71f58cd7e677d6..cc06e86a721731787be9ae4d8537dcc0d52aa678 100644 (file)
@@ -11,11 +11,6 @@ N_("git range-diff [<options>] <base> <old-tip> <new-tip>"),
 NULL
 };
 
-static struct strbuf *output_prefix_cb(struct diff_options *opt, void *data)
-{
-       return data;
-}
-
 int cmd_range_diff(int argc, const char **argv, const char *prefix)
 {
        int creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;
@@ -29,17 +24,11 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
                OPT_END()
        };
        int i, j, res = 0;
-       struct strbuf four_spaces = STRBUF_INIT;
        struct strbuf range1 = STRBUF_INIT, range2 = STRBUF_INIT;
 
        git_config(git_diff_ui_config, NULL);
 
        diff_setup(&diffopt);
-       diffopt.output_format = DIFF_FORMAT_PATCH;
-       diffopt.flags.suppress_diff_headers = 1;
-       diffopt.output_prefix = output_prefix_cb;
-       strbuf_addstr(&four_spaces, "    ");
-       diffopt.output_prefix_data = &four_spaces;
 
        argc = parse_options(argc, argv, NULL, options,
                             builtin_range_diff_usage, PARSE_OPT_KEEP_UNKNOWN |
@@ -63,12 +52,9 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
                             options + ARRAY_SIZE(options) - 1, /* OPT_END */
                             builtin_range_diff_usage, 0);
 
-       if (simple_color < 1) {
-               if (!simple_color)
-                       /* force color when --dual-color was used */
-                       diffopt.use_color = 1;
-               diffopt.flags.dual_color_diffed_diffs = 1;
-       }
+       /* force color when --dual-color was used */
+       if (!simple_color)
+               diffopt.use_color = 1;
 
        if (argc == 2) {
                if (!strstr(argv[0], ".."))
@@ -106,11 +92,10 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
        }
 
        res = show_range_diff(range1.buf, range2.buf, creation_factor,
-                             &diffopt);
+                             simple_color < 1, &diffopt);
 
        strbuf_release(&range1);
        strbuf_release(&range2);
-       strbuf_release(&four_spaces);
 
        return res;
 }
index defe31f095e492632b11ad34f762a1e34cf7c96c..3dd2edda0176b326d5980cbe1e37f3a8eec6a2f7 100644 (file)
@@ -409,8 +409,14 @@ static void output(struct string_list *a, struct string_list *b,
        strbuf_release(&dashes);
 }
 
+static struct strbuf *output_prefix_cb(struct diff_options *opt, void *data)
+{
+       return data;
+}
+
 int show_range_diff(const char *range1, const char *range2,
-                   int creation_factor, struct diff_options *diffopt)
+                   int creation_factor, int dual_color,
+                   struct diff_options *diffopt)
 {
        int res = 0;
 
@@ -423,9 +429,23 @@ int show_range_diff(const char *range1, const char *range2,
                res = error(_("could not parse log for '%s'"), range2);
 
        if (!res) {
+               struct diff_options opts;
+               struct strbuf indent = STRBUF_INIT;
+
+               memcpy(&opts, diffopt, sizeof(opts));
+               opts.output_format = DIFF_FORMAT_PATCH;
+               opts.flags.suppress_diff_headers = 1;
+               opts.flags.dual_color_diffed_diffs = dual_color;
+               opts.output_prefix = output_prefix_cb;
+               strbuf_addstr(&indent, "    ");
+               opts.output_prefix_data = &indent;
+               diff_setup_done(&opts);
+
                find_exact_matches(&branch1, &branch2);
                get_correspondences(&branch1, &branch2, creation_factor);
-               output(&branch1, &branch2, diffopt);
+               output(&branch1, &branch2, &opts);
+
+               strbuf_release(&indent);
        }
 
        string_list_clear(&branch1, 1);
index f26de5d0b04e8feefe044da6db63183f4e4e1fd8..190593f0c78151c99cc6e87161137b99c2615c80 100644 (file)
@@ -6,6 +6,7 @@
 #define RANGE_DIFF_CREATION_FACTOR_DEFAULT 60
 
 int show_range_diff(const char *range1, const char *range2,
-                   int creation_factor, struct diff_options *diffopt);
+                   int creation_factor, int dual_color,
+                   struct diff_options *diffopt);
 
 #endif