Code

Fix "git log --diff-filter" bug
authorArjen Laarhoven <arjen@yaph.org>
Tue, 25 Dec 2007 11:06:47 +0000 (12:06 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 26 Dec 2007 19:57:36 +0000 (11:57 -0800)
In commit b7bb760d5ed4881422673d32f869d140221d3564 (Fix revision
log diff setup, avoid unnecessary diff generation) an optimization was
made to avoid unnecessary diff generation.  This was partly fixed in
99516e35d096f41e7133cacde8fbed8ee9a3ecd0 (Fix embarrassing "git log
--follow" bug).  The '--diff-filter' option also needs the diff machinery
in action.

Signed-off-by: Arjen Laarhoven <arjen@yaph.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
revision.c
t/t4202-log.sh [new file with mode: 0755]

index 7e2f4f1eb5090588fc6515b78d39b7c7a4eda00d..6e85aaa3fb30e98f3b02f094af7f1763577cdb8d 100644 (file)
@@ -1290,8 +1290,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
        if (revs->diffopt.output_format & ~DIFF_FORMAT_NO_OUTPUT)
                revs->diff = 1;
 
-       /* Pickaxe and rename following needs diffs */
-       if (revs->diffopt.pickaxe || DIFF_OPT_TST(&revs->diffopt, FOLLOW_RENAMES))
+       /* Pickaxe, diff-filter and rename following need diffs */
+       if (revs->diffopt.pickaxe ||
+           revs->diffopt.filter ||
+           DIFF_OPT_TST(&revs->diffopt, FOLLOW_RENAMES))
                revs->diff = 1;
 
        if (revs->topo_order)
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
new file mode 100755 (executable)
index 0000000..b536454
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+test_description='git log'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+       echo one >one &&
+       git add one &&
+       test_tick &&
+       git commit -m initial &&
+
+       echo ichi >one &&
+       git add one &&
+       test_tick &&
+       git commit -m second &&
+
+       mkdir a &&
+       echo ni >a/two &&
+       git add a/two &&
+       test_tick &&
+       git commit -m third &&
+
+       echo san >a/three &&
+       git add a/three &&
+       test_tick &&
+       git commit -m fourth &&
+
+       git rm a/three &&
+       test_tick &&
+       git commit -m fifth
+
+'
+
+test_expect_success 'diff-filter=A' '
+
+       actual=$(git log --pretty="format:%s" --diff-filter=A HEAD) &&
+       expect=$(echo fourth ; echo third ; echo initial) &&
+       test "$actual" = "$expect" || {
+               echo Oops
+               echo "Actual: $actual"
+               false
+       }
+
+'
+
+test_expect_success 'diff-filter=M' '
+
+       actual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&
+       expect=$(echo second) &&
+       test "$actual" = "$expect" || {
+               echo Oops
+               echo "Actual: $actual"
+               false
+       }
+
+'
+
+test_expect_success 'diff-filter=D' '
+
+       actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
+       expect=$(echo fifth) &&
+       test "$actual" = "$expect" || {
+               echo Oops
+               echo "Actual: $actual"
+               false
+       }
+
+'
+
+
+
+test_done
\ No newline at end of file