range-diff: allow to diff files regardless of submodule config

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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Lucas De Marchi 2018-10-24 12:46:17 -07:00 коммит произвёл Junio C Hamano
Родитель 5a0cc8aca7
Коммит 0e573e8fcc
2 изменённых файлов: 30 добавлений и 1 удалений

Просмотреть файл

@ -354,7 +354,7 @@ static struct diff_filespec *get_filespec(const char *name, const char *p)
{ {
struct diff_filespec *spec = alloc_filespec(name); 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->data = (char *)p;
spec->size = strlen(p); spec->size = strlen(p);
spec->should_munmap = 0; spec->should_munmap = 0;

Просмотреть файл

@ -122,6 +122,35 @@ test_expect_success 'changed commit' '
test_cmp expected actual 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 'no commits on one side' ' test_expect_success 'no commits on one side' '
git commit --amend -m "new message" && git commit --amend -m "new message" &&
git range-diff master HEAD@{1} HEAD git range-diff master HEAD@{1} HEAD