]> git.ipfire.org Git - thirdparty/git.git/commitdiff
range-diff: move the diffopt initialization down one layer
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 5 Feb 2021 14:46:12 +0000 (14:46 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 7 Feb 2021 05:14:31 +0000 (21:14 -0800)
It is actually only the `output()` function that uses those diffopts. By
moving the diffopt initialization down into that function, it is
encapsulated better.

Incidentally, it will also make it easier to implement the `--left-only`
and `--right-only` options in `git range-diff` because the `output()`
function is now receiving all range-diff options as a parameter, not
just the diffopts.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
range-diff.c

index bc32ef6c342670d91734f106094c40460ffe5e51..514125b90cce4ae12bd05371ae591586f0c8dcd2 100644 (file)
@@ -464,12 +464,35 @@ static void patch_diff(const char *a, const char *b,
        diff_flush(diffopt);
 }
 
+static struct strbuf *output_prefix_cb(struct diff_options *opt, void *data)
+{
+       return data;
+}
+
 static void output(struct string_list *a, struct string_list *b,
-                  struct diff_options *diffopt)
+                  struct range_diff_options *range_diff_opts)
 {
        struct strbuf buf = STRBUF_INIT, dashes = STRBUF_INIT;
        int patch_no_width = decimal_width(1 + (a->nr > b->nr ? a->nr : b->nr));
        int i = 0, j = 0;
+       struct diff_options opts;
+       struct strbuf indent = STRBUF_INIT;
+
+       if (range_diff_opts->diffopt)
+               memcpy(&opts, range_diff_opts->diffopt, sizeof(opts));
+       else
+               diff_setup(&opts);
+
+       if (!opts.output_format)
+               opts.output_format = DIFF_FORMAT_PATCH;
+       opts.flags.suppress_diff_headers = 1;
+       opts.flags.dual_color_diffed_diffs =
+               range_diff_opts->dual_color;
+       opts.flags.suppress_hunk_header_line_count = 1;
+       opts.output_prefix = output_prefix_cb;
+       strbuf_addstr(&indent, "    ");
+       opts.output_prefix_data = &indent;
+       diff_setup_done(&opts);
 
        /*
         * We assume the user is really more interested in the second argument
@@ -490,7 +513,7 @@ static void output(struct string_list *a, struct string_list *b,
 
                /* Show unmatched LHS commit whose predecessors were shown. */
                if (i < a->nr && a_util->matching < 0) {
-                       output_pair_header(diffopt, patch_no_width,
+                       output_pair_header(&opts, patch_no_width,
                                           &buf, &dashes, a_util, NULL);
                        i++;
                        continue;
@@ -498,7 +521,7 @@ static void output(struct string_list *a, struct string_list *b,
 
                /* Show unmatched RHS commits. */
                while (j < b->nr && b_util->matching < 0) {
-                       output_pair_header(diffopt, patch_no_width,
+                       output_pair_header(&opts, patch_no_width,
                                           &buf, &dashes, NULL, b_util);
                        b_util = ++j < b->nr ? b->items[j].util : NULL;
                }
@@ -506,22 +529,18 @@ static void output(struct string_list *a, struct string_list *b,
                /* Show matching LHS/RHS pair. */
                if (j < b->nr) {
                        a_util = a->items[b_util->matching].util;
-                       output_pair_header(diffopt, patch_no_width,
+                       output_pair_header(&opts, patch_no_width,
                                           &buf, &dashes, a_util, b_util);
-                       if (!(diffopt->output_format & DIFF_FORMAT_NO_OUTPUT))
+                       if (!(opts.output_format & DIFF_FORMAT_NO_OUTPUT))
                                patch_diff(a->items[b_util->matching].string,
-                                          b->items[j].string, diffopt);
+                                          b->items[j].string, &opts);
                        a_util->shown = 1;
                        j++;
                }
        }
        strbuf_release(&buf);
        strbuf_release(&dashes);
-}
-
-static struct strbuf *output_prefix_cb(struct diff_options *opt, void *data)
-{
-       return data;
+       strbuf_release(&indent);
 }
 
 int show_range_diff(const char *range1, const char *range2,
@@ -538,31 +557,10 @@ 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;
-
-               if (range_diff_opts->diffopt)
-                       memcpy(&opts, range_diff_opts->diffopt, sizeof(opts));
-               else
-                       diff_setup(&opts);
-
-               if (!opts.output_format)
-                       opts.output_format = DIFF_FORMAT_PATCH;
-               opts.flags.suppress_diff_headers = 1;
-               opts.flags.dual_color_diffed_diffs =
-                       range_diff_opts->dual_color;
-               opts.flags.suppress_hunk_header_line_count = 1;
-               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,
                                    range_diff_opts->creation_factor);
-               output(&branch1, &branch2, &opts);
-
-               strbuf_release(&indent);
+               output(&branch1, &branch2, range_diff_opts);
        }
 
        string_list_clear(&branch1, 1);