On Tue, May 31, 2011 at 07:34:39PM +0900, Yasushi SHOJI wrote: > just noticed that quiet does not return exit code when I set > diff-filter. at the current tip (v1.7.5.3-401-gfb674d7): > > git diff --quiet --diff-filter=A v1.7.5 v1.7.5.1 -- t #=> 0 > git diff --exit-code --diff-filter=A v1.7.5 v1.7.5.1 -- t #=> 1 > > these two line returns different exit code. > > is this a bug or a feature? It's a bug. -- >8 -- Subject: [PATCH] diff_tree: disable QUICK optimization with diff filter We stop looking for changes early with QUICK, so our diff queue contains only a subset of the changes. However, we don't apply diff filters until later; it will appear at that point as though there are no changes matching our filter, when in reality we simply didn't keep looking for changes long enough. Commit 2cfe8a6 (diff --quiet: disable optimization when --diff-filter=X is used, 2011-03-16) fixes this in some cases by disabling the optimization when a filter is present. However, it only tweaked run_diff_files, missing the similar case in diff_tree. Thus the fix worked only for diffing the working tree and index, but not between trees. Noticed by Yasushi SHOJI. Signed-off-by: Jeff King <peff@xxxxxxxx> --- Grepping around, I think this was the only other missed case. t/t4040-whitespace-status.sh | 5 +++++ tree-diff.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/t/t4040-whitespace-status.sh b/t/t4040-whitespace-status.sh index abc4934..3c728a3 100755 --- a/t/t4040-whitespace-status.sh +++ b/t/t4040-whitespace-status.sh @@ -67,4 +67,9 @@ test_expect_success 'diff-files --diff-filter --quiet' ' test_must_fail git diff-files --diff-filter=M --quiet ' +test_expect_success 'diff-tree --diff-filter --quiet' ' + git commit -a -m "worktree state" && + test_must_fail git diff-tree --diff-filter=M --quiet HEAD^ HEAD +' + test_done diff --git a/tree-diff.c b/tree-diff.c index 7a79660..3d08f78 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -143,6 +143,7 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2, for (;;) { if (DIFF_OPT_TST(opt, QUICK) && + !opt->filter && DIFF_OPT_TST(opt, HAS_CHANGES)) break; if (opt->pathspec.nr) { -- 1.7.5.3.7.g7dde6.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html