Skip to content
Snippets Groups Projects
Commit 73a834e9 authored by Eric Sunshine's avatar Eric Sunshine Committed by Junio C Hamano
Browse files

range-diff: relieve callers of low-level configuration burden


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: default avatarEric Sunshine <sunshine@sunshineco.com>
Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
parent 25668659
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -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;
Loading
Loading
@@ -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 |
Loading
Loading
@@ -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], ".."))
Loading
Loading
@@ -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;
}
Loading
Loading
@@ -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;
 
Loading
Loading
@@ -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);
Loading
Loading
Loading
Loading
@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment