Skip to content

Commit

Permalink
combine-diff.c: Fix output when changes are exactly 3 lines apart
Browse files Browse the repository at this point in the history
When a deletion is followed by exactly 3 (or whatever the number of
context lines) unchanged lines, followed by another change, the combined
diff output would hide the first deletion, resulting in a malformed
diff.

This happened because the 3 lines before each change are painted
interesting, but also marked as no_pre_delete to prevent showing deletes
that were previously marked as uninteresting. This behaviour was
introduced in c86fbe5 (diff -c/--cc: do not include uninteresting
deletion before leading context). However, as a side effect, this could
also mark deletes that were already interesting as no_pre_delete. This
would happen only if the delete was exactly 3 lines away from the next
change, since lines farther away would not be touched by the "paint
three lines before the change" code and lines closer would be painted
by the "merge two adjacent hunks" code instead, which does not set the
no_pre_delete flag.

This commit fixes this problem by only setting the no_pre_delete flag
for changes that were previously uninteresting.

Signed-off-by: Matthijs Kooijman <matthijs@stdin.nl>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Matthijs Kooijman authored and Junio C Hamano committed May 15, 2013
1 parent 1599999 commit aac3857
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
7 changes: 5 additions & 2 deletions combine-diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,8 +344,11 @@ static int give_context(struct sline *sline, unsigned long cnt, int num_parent)
unsigned long k;

/* Paint a few lines before the first interesting line. */
while (j < i)
sline[j++].flag |= mark | no_pre_delete;
while (j < i) {
if (!(sline[j].flag & mark))
sline[j].flag |= no_pre_delete;
sline[j++].flag |= mark;
}

again:
/* we know up to i is to be included. where does the
Expand Down
48 changes: 48 additions & 0 deletions t/t4038-diff-combined.sh
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,52 @@ test_expect_success 'diagnose truncated file' '
grep "diff --cc file" out
'

# 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
test_cmp expected actual
'

test_done

0 comments on commit aac3857

Please sign in to comment.