diff mercurial/mdiff.py @ 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 d976b1ef6760
children 16b75661828e
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