mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 23:07:18 +03:00
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>
This commit is contained in:
parent
1b73b6343d
commit
a884b59cee
@ -268,14 +268,23 @@ def _unidiff(t1, t2, l1, l2, opts=defaultopts):
|
||||
# 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
|
||||
|
@ -455,3 +455,46 @@ Do not ignore all newlines, only blank lines
|
||||
+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
|
||||
|
@ -98,7 +98,7 @@ qdiff filename:
|
||||
diff -r b0c220e1cf43 lines
|
||||
--- a/lines
|
||||
+++ b/lines
|
||||
@@ -4,4 +6,4 @@
|
||||
@@ -4,4 +4,4 @@
|
||||
4
|
||||
-hello world
|
||||
-goodbye world
|
||||
|
Loading…
Reference in New Issue
Block a user