Mercurial > hg
changeset 16089:2e8f4b82c551 stable
mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
When diffing the following documents with --ignore-blank-lines (-B):
$ cat > a <<EOF
>
>
>
> b
> x
> d
> EOF
and:
$ cat > b <<EOF
> b
> y
> d
> EOF
the context lines are taken from the first document, even if the lines differ
(with -w or -b) or if the number of lines differ (with -B). In the second case,
we have to adjust the hunk new lines offsets or we end with inconsistent diffs
like (see the @@ offsets):
diff -r 0e66aa54f318 a
--- a/a
+++ b/a
@@ -1,4 +1,3 @@
b
-x
+y
d
Note that having different context lines in a and b means the diff can be
applied but is not invertible.
Reported by Nicholas Riley <com-selenic@sabi.net>
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Mon, 06 Feb 2012 21:17:50 +0100 |
parents | d1538789a1b3 |
children | e1d8218d733b f6e9c731dd3f |
files | mercurial/mdiff.py tests/test-diff-ignore-whitespace.t tests/test-mq-qdiff.t |
diffstat | 3 files changed, 54 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/mdiff.py Mon Feb 06 15:22:27 2012 -0600 +++ b/mercurial/mdiff.py Mon Feb 06 21:17:50 2012 +0100 @@ -268,14 +268,23 @@ # them into diff output. # hunk = None + ignoredlines = 0 for s, stype in allblocks(t1, t2, opts, l1, l2): + a1, a2, b1, b2 = s if stype != '!': + if stype == '~': + # The diff context lines are based on t1 content. When + # blank lines are ignored, the new lines offsets must + # be adjusted as if equivalent blocks ('~') had the + # same sizes on both sides. + ignoredlines += (b2 - b1) - (a2 - a1) continue delta = [] - a1, a2, b1, b2 = s old = l1[a1:a2] new = l2[b1:b2] + b1 -= ignoredlines + b2 -= ignoredlines astart = contextstart(a1) bstart = contextstart(b1) prev = None
--- a/tests/test-diff-ignore-whitespace.t Mon Feb 06 15:22:27 2012 -0600 +++ b/tests/test-diff-ignore-whitespace.t Mon Feb 06 21:17:50 2012 +0100 @@ -455,3 +455,46 @@ +hello +world goodbye world + +Test hunk offsets adjustments with --ignore-blank-lines + + $ hg revert -aC + reverting foo + $ printf '\nb\nx\nd\n' > a + $ printf 'b\ny\nd\n' > b + $ hg add a b + $ hg ci -m add + $ hg cat -r . a > b + $ hg cat -r . b > a + $ hg diff -B --nodates a > ../diffa + $ cat ../diffa + diff -r 0e66aa54f318 a + --- a/a + +++ b/a + @@ -1,4 +1,4 @@ + + b + -x + +y + d + $ hg diff -B --nodates b > ../diffb + $ cat ../diffb + diff -r 0e66aa54f318 b + --- a/b + +++ b/b + @@ -1,3 +1,3 @@ + b + -y + +x + d + $ hg revert -aC + reverting a + reverting b + $ hg import --no-commit ../diffa + applying ../diffa + $ hg revert -aC + reverting a + $ hg import --no-commit ../diffb + applying ../diffb + $ hg revert -aC + reverting b