diff: do not quit early on stat-dirty files
commitf34b205f6cc2c78cbed03a1582422cb59e36f729
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 25 Jan 2014 06:46:50 +0000 (25 13:46 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 24 Feb 2014 22:50:14 +0000 (24 14:50 -0800)
treefc164a597ad862e9541ed117e73ad1b6f04a73f0
parentfceb907225745b91aa8b9e0ef2ea068b0351ea01
diff: do not quit early on stat-dirty files

When QUICK is set (i.e. with --quiet) we try to do as little work as
possible, stopping after seeing the first change. stat-dirty is
considered a "change" but it may turn out not, if no actual content is
changed. The actual content test is performed too late in the process
and the shortcut may be taken prematurely, leading to incorrect return
code.

Assume we do "git diff --quiet". If we have a stat-dirty file "a" and
a really dirty file "b". We break the loop in run_diff_files() and
stop after "a" because we have got a "change". Later in
diffcore_skip_stat_unmatch() we find out "a" is actually not
changed. But there's nothing else in the diff queue, we incorrectly
declare "no change", ignoring the fact that "b" is changed.

This also happens to "git diff --quiet HEAD" when it hits
diff_can_quit_early() in oneway_diff().

This patch does the content test earlier in order to keep going if "a"
is unchanged. The test result is cached so that when
diffcore_skip_stat_unmatch() is done in the end, we spend no cycles on
re-testing "a".

Reported-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
diffcore.h
t/t4035-diff-quiet.sh