Merge branch 'mk/combine-diff-context-horizon-fix'
authorJunio C Hamano <gitster@pobox.com>
Sun, 2 Jun 2013 22:56:46 +0000 (15:56 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 2 Jun 2013 22:56:46 +0000 (15:56 -0700)
"git diff -c -p" was not showing a deleted line from a hunk when
another hunk immediately begins where the earlier one ends.

* mk/combine-diff-context-horizon-fix:
combine-diff.c: Fix output when changes are exactly 3 lines apart

1  2 
combine-diff.c
t/t4038-diff-combined.sh
diff --cc combine-diff.c
Simple merge
index 1261dbbdf5869b671e36cd7128bfde61fd67b8de,2ffc692bdeb39cd9c3b592d139dece4740cc3e71..1019d7b35fcb350761a44cf4ccd5ae156ce8d577
@@@ -90,267 -89,52 +90,315 @@@ test_expect_success 'diagnose truncate
        grep "diff --cc file" out
  '
  
 -      test_cmp expected actual
 +test_expect_success 'setup for --cc --raw' '
 +      blob=$(echo file | git hash-object --stdin -w) &&
 +      base_tree=$(echo "100644 blob $blob     file" | git mktree) &&
 +      trees= &&
 +      for i in `test_seq 1 40`
 +      do
 +              blob=$(echo file$i | git hash-object --stdin -w) &&
 +              trees="$trees$(echo "100644 blob $blob  file" | git mktree)$LF"
 +      done
 +'
 +
 +test_expect_success 'check --cc --raw with four trees' '
 +      four_trees=$(echo "$trees" | sed -e 4q) &&
 +      git diff --cc --raw $four_trees $base_tree >out &&
 +      # Check for four leading colons in the output:
 +      grep "^::::[^:]" out
 +'
 +
 +test_expect_success 'check --cc --raw with forty trees' '
 +      git diff --cc --raw $trees $base_tree >out &&
 +      # Check for forty leading colons in the output:
 +      grep "^::::::::::::::::::::::::::::::::::::::::[^:]" out
 +'
 +
 +test_expect_success 'setup combined ignore spaces' '
 +      git checkout master &&
 +      >test &&
 +      git add test &&
 +      git commit -m initial &&
 +
 +      tr -d Q <<-\EOF >test &&
 +      always coalesce
 +      eol space coalesce Q
 +      space  change coalesce
 +      all spa ces coalesce
 +      eol spaces Q
 +      space  change
 +      all spa ces
 +      EOF
 +      git commit -m "test space change" -a &&
 +
 +      git checkout -b side HEAD^ &&
 +      tr -d Q <<-\EOF >test &&
 +      always coalesce
 +      eol space coalesce
 +      space change coalesce
 +      all spaces coalesce
 +      eol spaces
 +      space change
 +      all spaces
 +      EOF
 +      git commit -m "test other space changes" -a &&
 +
 +      test_must_fail git merge master &&
 +      tr -d Q <<-\EOF >test &&
 +      eol spaces Q
 +      space  change
 +      all spa ces
 +      EOF
 +      git commit -m merged -a
 +'
 +
 +test_expect_success 'check combined output (no ignore space)' '
 +      git show >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      --always coalesce
 +      - eol space coalesce
 +      - space change coalesce
 +      - all spaces coalesce
 +      - eol spaces
 +      - space change
 +      - all spaces
 +       -eol space coalesce Q
 +       -space  change coalesce
 +       -all spa ces coalesce
 +      + eol spaces Q
 +      + space  change
 +      + all spa ces
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
 +test_expect_success 'check combined output (ignore space at eol)' '
 +      git show --ignore-space-at-eol >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      --always coalesce
 +      --eol space coalesce
 +      - space change coalesce
 +      - all spaces coalesce
 +       -space  change coalesce
 +       -all spa ces coalesce
 +        eol spaces Q
 +      - space change
 +      - all spaces
 +      + space  change
 +      + all spa ces
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
 +test_expect_success 'check combined output (ignore space change)' '
 +      git show -b >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      --always coalesce
 +      --eol space coalesce
 +      --space change coalesce
 +      - all spaces coalesce
 +       -all spa ces coalesce
 +        eol spaces Q
 +        space  change
 +      - all spaces
 +      + all spa ces
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
 +test_expect_success 'check combined output (ignore all spaces)' '
 +      git show -w >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      --always coalesce
 +      --eol space coalesce
 +      --space change coalesce
 +      --all spaces coalesce
 +        eol spaces Q
 +        space  change
 +        all spa ces
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
 +test_expect_success 'combine diff coalesce simple' '
 +      >test &&
 +      git add test &&
 +      git commit -m initial &&
 +      test_seq 4 >test &&
 +      git commit -a -m empty1 &&
 +      git branch side1 &&
 +      git checkout HEAD^ &&
 +      test_seq 5 >test &&
 +      git commit -a -m empty2 &&
 +      test_must_fail git merge side1 &&
 +      >test &&
 +      git commit -a -m merge &&
 +      git show >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      --1
 +      --2
 +      --3
 +      --4
 +      - 5
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
 +test_expect_success 'combine diff coalesce tricky' '
 +      >test &&
 +      git add test &&
 +      git commit -m initial --allow-empty &&
 +      cat <<-\EOF >test &&
 +      3
 +      1
 +      2
 +      3
 +      4
 +      EOF
 +      git commit -a -m empty1 &&
 +      git branch -f side1 &&
 +      git checkout HEAD^ &&
 +      cat <<-\EOF >test &&
 +      1
 +      3
 +      5
 +      4
 +      EOF
 +      git commit -a -m empty2 &&
 +      git branch -f side2 &&
 +      test_must_fail git merge side1 &&
 +      >test &&
 +      git commit -a -m merge &&
 +      git show >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +       -3
 +      --1
 +       -2
 +      --3
 +      - 5
 +      --4
 +      EOF
 +      compare_diff_patch expected actual &&
 +      git checkout -f side1 &&
 +      test_must_fail git merge side2 &&
 +      >test &&
 +      git commit -a -m merge &&
 +      git show >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      - 3
 +      --1
 +      - 2
 +      --3
 +       -5
 +      --4
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
 +test_expect_failure 'combine diff coalesce three parents' '
 +      >test &&
 +      git add test &&
 +      git commit -m initial --allow-empty &&
 +      cat <<-\EOF >test &&
 +      3
 +      1
 +      2
 +      3
 +      4
 +      EOF
 +      git commit -a -m empty1 &&
 +      git checkout -B side1 &&
 +      git checkout HEAD^ &&
 +      cat <<-\EOF >test &&
 +      1
 +      3
 +      7
 +      5
 +      4
 +      EOF
 +      git commit -a -m empty2 &&
 +      git branch -f side2 &&
 +      git checkout HEAD^ &&
 +      cat <<-\EOF >test &&
 +      3
 +      1
 +      6
 +      5
 +      4
 +      EOF
 +      git commit -a -m empty3 &&
 +      >test &&
 +      git add test &&
 +      TREE=$(git write-tree) &&
 +      COMMIT=$(git commit-tree -p HEAD -p side1 -p side2 -m merge $TREE) &&
 +      git show $COMMIT >actual.tmp &&
 +      sed -e "1,/^@@@/d" < actual.tmp >actual &&
 +      tr -d Q <<-\EOF >expected &&
 +      -- 3
 +      ---1
 +      -  6
 +       - 2
 +       --3
 +        -7
 +      - -5
 +      ---4
 +      EOF
 +      compare_diff_patch expected actual
 +'
 +
+ # Test for a bug reported at
+ # http://thread.gmane.org/gmane.comp.version-control.git/224410
+ # where a delete lines were missing from combined diff output when they
+ # occurred exactly before the context lines of a later change.
+ test_expect_success 'combine diff missing delete bug' '
+       git commit -m initial --allow-empty &&
+       cat <<-\EOF >test &&
+       1
+       2
+       3
+       4
+       EOF
+       git add test &&
+       git commit -a -m side1 &&
+       git checkout -B side1 &&
+       git checkout HEAD^ &&
+       cat <<-\EOF >test &&
+       0
+       1
+       2
+       3
+       4modified
+       EOF
+       git add test &&
+       git commit -m side2 &&
+       git branch -f side2 &&
+       test_must_fail git merge --no-commit side1 &&
+       cat <<-\EOF >test &&
+       1
+       2
+       3
+       4modified
+       EOF
+       git add test &&
+       git commit -a -m merge &&
+       git diff-tree -c -p HEAD >actual.tmp &&
+       sed -e "1,/^@@@/d" < actual.tmp >actual &&
+       tr -d Q <<-\EOF >expected &&
+       - 0
+         1
+         2
+         3
+        -4
+        +4modified
+       EOF
++      compare_diff_patch expected actual
+ '
  test_done