git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 09/14] range-diff: relieve callers of low-level configuration burden

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Jul 22, 2018, 09:57 UTC
Message-ID
<20180722095717.17912-10-sunshine@sunshineco.com>
In-Reply-To
<20180722095717.17912-1-sunshine@sunshineco.com>

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>
---
 builtin/range-diff.c | 23 ++++-------------------
 range-diff.c         | 24 ++++++++++++++++++++++--
 range-diff.h         |  3 ++-
 3 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/builtin/range-diff.c b/builtin/range-diff.c
index bbe6b05ae9..91463a1df6 100644
--- a/builtin/range-diff.c
+++ b/builtin/range-diff.c
@@ -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);
@@ -55,12 +44,9 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
 	argc = j;
 	diff_setup_done(&diffopt);
 
-	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], ".."))
@@ -96,11 +82,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;
 }
diff --git a/range-diff.c b/range-diff.c
index 76e053c2b2..091fc344cd 100644
--- a/range-diff.c
+++ b/range-diff.c
@@ -414,8 +414,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;
 
@@ -428,9 +434,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);
diff --git a/range-diff.h b/range-diff.h
index 73d6e232fe..bf265594f3 100644
--- a/range-diff.h
+++ b/range-diff.h
@@ -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
-- 
2.18.0.345.g5c9ce644c3
Previous: Eric SunshineNext: Eric Sunshine
Message 17 of 38 in “format-patch: add --interdiff and --range-diff options”
  1. 00/14 format-patch: add --interdiff and --range-diff optionsEric Sunshine, Jul 22, 2018
  2. 01/14 format-patch: allow additional generated content in make_cover_letter()Eric Sunshine, Jul 22, 2018
  3. 02/14 format-patch: add --interdiff option to embed diff in cover letterEric Sunshine, Jul 22, 2018
  4. Eric SunshineJul 22, 2018
  5. Duy NguyenJul 23, 2018
  6. Eric SunshineJul 23, 2018
  7. Junio C HamanoJul 23, 2018
  8. 03/14 format-patch: teach --interdiff to respect -v/--reroll-countEric Sunshine, Jul 22, 2018
  9. Duy NguyenJul 23, 2018
  10. Eric SunshineJul 23, 2018
  11. 04/14 interdiff: teach show_interdiff() to indent interdiffEric Sunshine, Jul 22, 2018
  12. 05/14 log-tree: show_log: make commentary block delimiting reusableEric Sunshine, Jul 22, 2018
  13. 06/14 format-patch: allow --interdiff to apply to a lone-patchEric Sunshine, Jul 22, 2018
  14. Duy NguyenJul 23, 2018
  15. Eric SunshineJul 23, 2018
  16. 08/14 range-diff: publish default creation factorEric Sunshine, Jul 22, 2018
  17. 09/14 range-diff: relieve callers of low-level configuration burdenEric Sunshine, Jul 22, 2018
  18. 10/14 format-patch: add --range-diff option to embed diff in cover letterEric Sunshine, Jul 22, 2018
  19. Duy NguyenJul 23, 2018
  20. Eric SunshineJul 23, 2018
  21. Junio C HamanoJul 25, 2018
  22. Eric SunshineJul 25, 2018
  23. Junio C HamanoJul 25, 2018
  24. Duy NguyenJul 25, 2018
  25. 07/14 range-diff: respect diff_option.file rather than assuming 'stdout'Eric Sunshine, Jul 22, 2018
  26. Stefan BellerJul 23, 2018
  27. Eric SunshineJul 23, 2018
  28. Junio C HamanoJul 25, 2018
  29. 12/14 format-patch: teach --range-diff to respect -v/--reroll-countEric Sunshine, Jul 22, 2018
  30. 14/14 format-patch: allow --range-diff to apply to a lone-patchEric Sunshine, Jul 22, 2018
  31. Junio C HamanoJul 25, 2018
  32. Eric SunshineSep 7, 2018
  33. 13/14 format-patch: add --creation-factor tweak for --range-diffEric Sunshine, Jul 22, 2018
  34. 11/14 format-patch: extend --range-diff to accept revision rangeEric Sunshine, Jul 22, 2018
  35. Junio C HamanoJul 25, 2018
  36. Eric SunshineSep 7, 2018
  37. Duy NguyenJul 23, 2018
  38. Eric SunshineJul 23, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.