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

[PATCH v3 1/3] diff: have submodule_format logic avoid additional diff headers

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Sep 2, 2022, 03:53 UTC
Message-ID
<ed28acaed973238b314d1ffc8d56ce61efbb5376.1662090810.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1342.v3.git.1662090810.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

Commit 95433eeed9 ("diff: add ability to insert additional headers for paths", 2022-02-02) introduced the possibility of additional headers, created in create_filepairs_for_header_only_notifications(). These are represented by inserting additional pairs in diff_queued_diff which always have a mode of 0 and a null_oid. When these were added, one code path was noted to assume that at least one of the diff_filespecs in the pair were valid, and that codepath was corrected.

The submodule_format handling is another codepath with the same issue; it would operate on these additional headers and attempt to display them as submodule changes. Prevent that by explicitly checking for "phoney" filepairs (i.e. filepairs with both modes being 0).

Reported-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 diff.c                  | 29 +++++++++++++++++++++++------
 t/t4069-remerge-diff.sh |  8 ++++++++
 2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/diff.c b/diff.c
index 974626a6211..7f8637f3006 100644
--- a/diff.c
+++ b/diff.c
@@ -3398,6 +3398,21 @@ static void add_formatted_headers(struct strbuf *msg,
 				     line_prefix, meta, reset);
 }
 
+static int diff_filepair_is_phoney(struct diff_filespec *one,
+				   struct diff_filespec *two)
+{
+	/*
+	 * This function specifically looks for pairs injected by
+	 * create_filepairs_for_header_only_notifications().  Such
+	 * pairs are "phoney" in that they do not represent any
+	 * content or even mode difference, but were inserted because
+	 * diff_queued_diff previously had no pair associated with
+	 * that path but we needed some pair to avoid losing the
+	 * "remerge CONFLICT" header associated with the path.
+	 */
+	return !DIFF_FILE_VALID(one) && !DIFF_FILE_VALID(two);
+}
+
 static void builtin_diff(const char *name_a,
 			 const char *name_b,
 			 struct diff_filespec *one,
@@ -3429,14 +3444,16 @@ static void builtin_diff(const char *name_a,
 
 	if (o->submodule_format == DIFF_SUBMODULE_LOG &&
 	    (!one->mode || S_ISGITLINK(one->mode)) &&
-	    (!two->mode || S_ISGITLINK(two->mode))) {
+	    (!two->mode || S_ISGITLINK(two->mode)) &&
+	    (!diff_filepair_is_phoney(one, two))) {
 		show_submodule_diff_summary(o, one->path ? one->path : two->path,
 				&one->oid, &two->oid,
 				two->dirty_submodule);
 		return;
 	} else if (o->submodule_format == DIFF_SUBMODULE_INLINE_DIFF &&
 		   (!one->mode || S_ISGITLINK(one->mode)) &&
-		   (!two->mode || S_ISGITLINK(two->mode))) {
+		   (!two->mode || S_ISGITLINK(two->mode)) &&
+		   (!diff_filepair_is_phoney(one, two))) {
 		show_submodule_inline_diff(o, one->path ? one->path : two->path,
 				&one->oid, &two->oid,
 				two->dirty_submodule);
@@ -3456,12 +3473,12 @@ static void builtin_diff(const char *name_a,
 	b_two = quote_two(b_prefix, name_b + (*name_b == '/'));
 	lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";
 	lbl[1] = DIFF_FILE_VALID(two) ? b_two : "/dev/null";
-	if (!DIFF_FILE_VALID(one) && !DIFF_FILE_VALID(two)) {
+	if (diff_filepair_is_phoney(one, two)) {
 		/*
-		 * We should only reach this point for pairs from
+		 * We should only reach this point for pairs generated from
 		 * create_filepairs_for_header_only_notifications().  For
-		 * these, we should avoid the "/dev/null" special casing
-		 * above, meaning we avoid showing such pairs as either
+		 * these, we want to avoid the "/dev/null" special casing
+		 * above, because we do not want such pairs shown as either
 		 * "new file" or "deleted file" below.
 		 */
 		lbl[0] = a_one;
diff --git a/t/t4069-remerge-diff.sh b/t/t4069-remerge-diff.sh
index 9e7cac68b1c..e3e6fbd97b2 100755
--- a/t/t4069-remerge-diff.sh
+++ b/t/t4069-remerge-diff.sh
@@ -185,6 +185,14 @@ test_expect_success 'remerge-diff w/ diff-filter=U: all conflict headers, no dif
 	test_cmp expect actual
 '
 
+test_expect_success 'submodule formatting ignores additional headers' '
+	# Reuses "expect" from last testcase
+
+	git show --oneline --remerge-diff --diff-filter=U --submodule=log >tmp &&
+	sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'remerge-diff w/ diff-filter=R: relevant file + conflict header' '
 	git log -1 --oneline resolution >tmp &&
 	cat <<-EOF >>tmp &&
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren via GitGitGadget
Message 21 of 23 in “Output fixes for --remerge-diff”
  1. 0/3 Output fixes for --remerge-diffElijah Newren via GitGitGadget, Aug 31, 2022
  2. 1/3 diff: have submodule_format logic avoid additional diff headersElijah Newren via GitGitGadget, Aug 31, 2022
  3. Junio C HamanoAug 31, 2022
  4. Elijah NewrenSep 1, 2022
  5. 2/3 diff: fix filtering of additional headers under --remerge-diffElijah Newren via GitGitGadget, Aug 31, 2022
  6. Junio C HamanoAug 31, 2022
  7. Elijah NewrenSep 1, 2022
  8. 3/3 diff: fix filtering of merge commits under --remerge-diffElijah Newren via GitGitGadget, Aug 31, 2022
  9. Junio C HamanoSep 1, 2022
  10. Elijah NewrenSep 1, 2022
  11. Elijah NewrenSep 1, 2022
  12. Junio C HamanoSep 1, 2022
  13. Ævar Arnfjörð BjarmasonSep 1, 2022
  14. Junio C HamanoSep 1, 2022
  15. 0/3 Output fixes for --remerge-diffElijah Newren via GitGitGadget, Sep 1, 2022
  16. 1/3 diff: have submodule_format logic avoid additional diff headersElijah Newren via GitGitGadget, Sep 1, 2022
  17. Junio C HamanoSep 1, 2022
  18. 2/3 diff: fix filtering of additional headers under --remerge-diffElijah Newren via GitGitGadget, Sep 1, 2022
  19. 3/3 diff: fix filtering of merge commits under --remerge-diffElijah Newren via GitGitGadget, Sep 1, 2022
  20. 0/3 Output fixes for --remerge-diffElijah Newren via GitGitGadget, Sep 2, 2022
  21. 1/3 diff: have submodule_format logic avoid additional diff headersElijah Newren via GitGitGadget, Sep 2, 2022
  22. 3/3 diff: fix filtering of merge commits under --remerge-diffElijah Newren via GitGitGadget, Sep 2, 2022
  23. 2/3 diff: fix filtering of additional headers under --remerge-diffElijah Newren via GitGitGadget, Sep 2, 2022

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.