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

[PATCH v3] range-diff: allow to diff files regardless of submodule config

From
LMLucas De Marchi <lucas.demarchi@intel.com>
Date
Oct 24, 2018, 19:46 UTC
Message-ID
<20181024194617.425-1-lucas.demarchi@intel.com>
In-Reply-To
<xmqqk1m7orbg.fsf@gitster-ct.c.googlers.com>

If we have `submodule.diff = log' in the configuration file or `--submodule=log' is given as argument, range-diff fails to compare both diffs and we only get the following output:

    Submodule a 0000000...0000000 (new submodule)
Even if the repository doesn't have any submodule.

That's because the mode in diff_filespec is not correct and when flushing the diff, down in builtin_diff() we will enter the condition:

	if (o->submodule_format == DIFF_SUBMODULE_LOG &&
	    (!one->mode || S_ISGITLINK(one->mode)) &&
	    (!two->mode || S_ISGITLINK(two->mode))) {
		show_submodule_summary(o, one->path ? one->path : two->path,
				&one->oid, &two->oid,
				two->dirty_submodule);
		return;

It turns out that S_ISGITLINK will return true (mode == 0160000 here). Similar thing happens if submodule.diff is "diff".

Do like it's done in grep.c when calling fill_filespec() and force it to be recognized as a file by adding S_IFREG to the mode.

Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
v2: Add test to make sure we don't regress
v3: Extend commit mesage with better explanation and base it on maint branch
    since it's a bug fix
 range-diff.c          |  2 +-
 t/t3206-range-diff.sh | 29 +++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/range-diff.c b/range-diff.c
index b6b9abac26..3d6aa2330a 100644
--- a/range-diff.c
+++ b/range-diff.c
@@ -334,7 +334,7 @@ static struct diff_filespec *get_filespec(const char *name, const char *p)
 {
 	struct diff_filespec *spec = alloc_filespec(name);
 
-	fill_filespec(spec, &null_oid, 0, 0644);
+	fill_filespec(spec, &null_oid, 0, 0100644);
 	spec->data = (char *)p;
 	spec->size = strlen(p);
 	spec->should_munmap = 0;
diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh
index 2237c7f4af..518c9a527d 100755
--- a/t/t3206-range-diff.sh
+++ b/t/t3206-range-diff.sh
@@ -122,6 +122,35 @@ test_expect_success 'changed commit' '
 	test_cmp expected actual
 '
 
+test_expect_success 'changed commit with sm config' '
+	git range-diff --no-color --submodule=log topic...changed >actual &&
+	cat >expected <<-EOF &&
+	1:  4de457d = 1:  a4b3333 s/5/A/
+	2:  fccce22 = 2:  f51d370 s/4/A/
+	3:  147e64e ! 3:  0559556 s/11/B/
+	    @@ -10,7 +10,7 @@
+	      9
+	      10
+	     -11
+	    -+B
+	    ++BB
+	      12
+	      13
+	      14
+	4:  a63e992 ! 4:  d966c5c s/12/B/
+	    @@ -8,7 +8,7 @@
+	     @@
+	      9
+	      10
+	    - B
+	    + BB
+	     -12
+	     +B
+	      13
+	EOF
+	test_cmp expected actual
+'
+
 test_expect_success 'changed message' '
 	git range-diff --no-color topic...changed-message >actual &&
 	sed s/Z/\ /g >expected <<-EOF &&
-- 
2.19.1.543.g4e5b40e2e8
Previous: Lucas De Marchi
Message 17 of 17 in “range-diff: allow to diff files regardless submodule”
  1. range-diff: allow to diff files regardless submoduleLucas De Marchi, Oct 10, 2018
  2. brian m. carlsonOct 11, 2018
  3. Lucas De MarchiOct 11, 2018
  4. Johannes SchindelinOct 12, 2018
  5. brian m. carlsonOct 12, 2018
  6. Ævar Arnfjörð BjarmasonOct 11, 2018
  7. Lucas De MarchiOct 11, 2018
  8. range-diff: allow to diff files regardless submoduleLucas De Marchi, Oct 11, 2018
  9. Johannes SchindelinOct 12, 2018
  10. Junio C HamanoOct 11, 2018
  11. Lucas De MarchiOct 23, 2018
  12. Junio C HamanoOct 24, 2018
  13. Lucas De MarchiOct 24, 2018
  14. Junio C HamanoOct 24, 2018
  15. Junio C HamanoOct 24, 2018
  16. Lucas De MarchiOct 24, 2018
  17. range-diff: allow to diff files regardless of submodule configLucas De Marchi, Oct 24, 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.