--- a/mercurial/mdiff.py Mon Feb 06 15:22:43 2012 -0600
+++ b/mercurial/mdiff.py Mon Feb 06 15:36:44 2012 -0600
@@ -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:43 2012 -0600
+++ b/tests/test-diff-ignore-whitespace.t Mon Feb 06 15:36:44 2012 -0600
@@ -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
--- a/tests/test-mq-qdiff.t Mon Feb 06 15:22:43 2012 -0600
+++ b/tests/test-mq-qdiff.t Mon Feb 06 15:36:44 2012 -0600
@@ -98,7 +98,7 @@
diff -r b0c220e1cf43 lines
--- a/lines
+++ b/lines
- @@ -4,4 +6,4 @@
+ @@ -4,4 +4,4 @@
4
-hello world
-goodbye world