diff.c: move diffcore_skip_stat_unmatch core logic out for reuse later
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
2f93541d88
commit
fceb907225
49
diff.c
49
diff.c
@ -4592,6 +4592,33 @@ static int diff_filespec_is_identical(struct diff_filespec *one,
|
|||||||
return !memcmp(one->data, two->data, one->size);
|
return !memcmp(one->data, two->data, one->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int diff_filespec_check_stat_unmatch(struct diff_filepair *p)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 1. Entries that come from stat info dirtiness
|
||||||
|
* always have both sides (iow, not create/delete),
|
||||||
|
* one side of the object name is unknown, with
|
||||||
|
* the same mode and size. Keep the ones that
|
||||||
|
* do not match these criteria. They have real
|
||||||
|
* differences.
|
||||||
|
*
|
||||||
|
* 2. At this point, the file is known to be modified,
|
||||||
|
* with the same mode and size, and the object
|
||||||
|
* name of one side is unknown. Need to inspect
|
||||||
|
* the identical contents.
|
||||||
|
*/
|
||||||
|
if (!DIFF_FILE_VALID(p->one) || /* (1) */
|
||||||
|
!DIFF_FILE_VALID(p->two) ||
|
||||||
|
(p->one->sha1_valid && p->two->sha1_valid) ||
|
||||||
|
(p->one->mode != p->two->mode) ||
|
||||||
|
diff_populate_filespec(p->one, 1) ||
|
||||||
|
diff_populate_filespec(p->two, 1) ||
|
||||||
|
(p->one->size != p->two->size) ||
|
||||||
|
!diff_filespec_is_identical(p->one, p->two)) /* (2) */
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
|
static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -4602,27 +4629,7 @@ static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
|
|||||||
for (i = 0; i < q->nr; i++) {
|
for (i = 0; i < q->nr; i++) {
|
||||||
struct diff_filepair *p = q->queue[i];
|
struct diff_filepair *p = q->queue[i];
|
||||||
|
|
||||||
/*
|
if (diff_filespec_check_stat_unmatch(p))
|
||||||
* 1. Entries that come from stat info dirtiness
|
|
||||||
* always have both sides (iow, not create/delete),
|
|
||||||
* one side of the object name is unknown, with
|
|
||||||
* the same mode and size. Keep the ones that
|
|
||||||
* do not match these criteria. They have real
|
|
||||||
* differences.
|
|
||||||
*
|
|
||||||
* 2. At this point, the file is known to be modified,
|
|
||||||
* with the same mode and size, and the object
|
|
||||||
* name of one side is unknown. Need to inspect
|
|
||||||
* the identical contents.
|
|
||||||
*/
|
|
||||||
if (!DIFF_FILE_VALID(p->one) || /* (1) */
|
|
||||||
!DIFF_FILE_VALID(p->two) ||
|
|
||||||
(p->one->sha1_valid && p->two->sha1_valid) ||
|
|
||||||
(p->one->mode != p->two->mode) ||
|
|
||||||
diff_populate_filespec(p->one, 1) ||
|
|
||||||
diff_populate_filespec(p->two, 1) ||
|
|
||||||
(p->one->size != p->two->size) ||
|
|
||||||
!diff_filespec_is_identical(p->one, p->two)) /* (2) */
|
|
||||||
diff_q(&outq, p);
|
diff_q(&outq, p);
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user