annotate mercurial/mdiff.py @ 36654:edd3974bd500

py3: do not pass a memoryview to bdiff.bdiff() This doesn't look nice, but I don't know how to make a zero-copy slice of bytes which is compatible with the buffer protocol.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 03 Mar 2018 07:24:25 -0500
parents c6061cadb400
children 68026dd7c4f9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
239
75840796e8e2 mdiff.py: kill #! line, add copyright notice
mpm@selenic.com
parents: 184
diff changeset
1 # mdiff.py - diff and patch routines for mercurial
75840796e8e2 mdiff.py: kill #! line, add copyright notice
mpm@selenic.com
parents: 184
diff changeset
2 #
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2580
diff changeset
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
239
75840796e8e2 mdiff.py: kill #! line, add copyright notice
mpm@selenic.com
parents: 184
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7436
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10185
diff changeset
6 # GNU General Public License version 2 or any later version.
239
75840796e8e2 mdiff.py: kill #! line, add copyright notice
mpm@selenic.com
parents: 184
diff changeset
7
27484
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
8 from __future__ import absolute_import
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
9
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
10 import re
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
11 import struct
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
12 import zlib
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
13
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
14 from .i18n import _
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
15 from . import (
36444
44c4a38bf563 diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents: 36184
diff changeset
16 encoding,
27484
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
17 error,
32408
3b88a7fa97d8 bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32246
diff changeset
18 policy,
31636
a7acda2de4b8 diff: use pycompat.{byteskwargs, strkwargs} to switch opts b/w bytes and str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31283
diff changeset
19 pycompat,
27484
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
20 util,
0d7635dca691 mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
21 )
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36444
diff changeset
22 from .utils import dateutil
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
23
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
24 _missing_newline_marker = "\\ No newline at end of file\n"
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
25
32408
3b88a7fa97d8 bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32246
diff changeset
26 bdiff = policy.importmod(r'bdiff')
32410
151cc3b3d799 mpatch: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32408
diff changeset
27 mpatch = policy.importmod(r'mpatch')
32408
3b88a7fa97d8 bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32246
diff changeset
28
32246
ded48ad55146 bdiff: proxy through mdiff module
Yuya Nishihara <yuya@tcha.org>
parents: 32245
diff changeset
29 blocks = bdiff.blocks
ded48ad55146 bdiff: proxy through mdiff module
Yuya Nishihara <yuya@tcha.org>
parents: 32245
diff changeset
30 fixws = bdiff.fixws
32244
2d84947cd85d mdiff: move re-exports to top
Yuya Nishihara <yuya@tcha.org>
parents: 31808
diff changeset
31 patches = mpatch.patches
2d84947cd85d mdiff: move re-exports to top
Yuya Nishihara <yuya@tcha.org>
parents: 31808
diff changeset
32 patchedsize = mpatch.patchedsize
36654
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
33 _textdiff = bdiff.bdiff
36184
29dd37a418aa bdiff: write a native version of splitnewlines
Augie Fackler <augie@google.com>
parents: 35991
diff changeset
34 splitnewlines = bdiff.splitnewlines
2248
b914f0557832 fix diffs containing embedded "\r".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2078
diff changeset
35
36654
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
36 # On Python 3, util.buffer() creates a memoryview, which appears not
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
37 # supporting the buffer protocol
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
38 if pycompat.ispy3:
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
39 def textdiff(a, b):
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
40 return _textdiff(bytes(a), bytes(b))
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
41 else:
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
42 textdiff = _textdiff
edd3974bd500 py3: do not pass a memoryview to bdiff.bdiff()
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
43
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
44 class diffopts(object):
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
45 '''context is the number of context lines
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
46 text treats all files as text
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
47 showfunc enables diff -p output
2907
8b02af865990 Add diff --git option
Brendan Cully <brendan@kublai.com>
parents: 2874
diff changeset
48 git enables the git extended patch format
3199
096f1c73cdc3 Add -D/--nodates options to hg diff/export that removes dates from diff headers
Stephen Darnell <stephen@darnell.plus.com>
parents: 3026
diff changeset
49 nodates removes dates from diff headers
23293
b89856abf4e2 mdiff.diffopts: add doc comment for nobinary
Siddharth Agarwal <sid0@fb.com>
parents: 21790
diff changeset
50 nobinary ignores binary files
23294
ec8c73b02e2e mdiff.diffopts: add a new noprefix option
Siddharth Agarwal <sid0@fb.com>
parents: 23293
diff changeset
51 noprefix disables the 'a/' and 'b/' prefixes (ignored in plain mode)
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
52 ignorews ignores all whitespace changes in the diff
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
53 ignorewsamount ignores changes in the amount of whitespace
10189
e451e599fbcf patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
54 ignoreblanklines ignores changes whose lines are all blank
e451e599fbcf patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
55 upgrade generates git diffs to avoid data loss
e451e599fbcf patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
56 '''
396
8f8bb77d560e Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 361
diff changeset
57
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
58 defaults = {
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
59 'context': 3,
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
60 'text': False,
5863
3d1f9dcecdea diff: don't show function name by default
Matt Mackall <mpm@selenic.com>
parents: 5482
diff changeset
61 'showfunc': False,
2907
8b02af865990 Add diff --git option
Brendan Cully <brendan@kublai.com>
parents: 2874
diff changeset
62 'git': False,
3199
096f1c73cdc3 Add -D/--nodates options to hg diff/export that removes dates from diff headers
Stephen Darnell <stephen@darnell.plus.com>
parents: 3026
diff changeset
63 'nodates': False,
21790
3fbef7ac26f0 diff: add nobinary config to suppress git-style binary diffs
Stephen Lee <sphen.lee@gmail.com>
parents: 20034
diff changeset
64 'nobinary': False,
23294
ec8c73b02e2e mdiff.diffopts: add a new noprefix option
Siddharth Agarwal <sid0@fb.com>
parents: 23293
diff changeset
65 'noprefix': False,
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30717
diff changeset
66 'index': 0,
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
67 'ignorews': False,
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
68 'ignorewsamount': False,
34031
da07367d683b mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents: 33114
diff changeset
69 'ignorewseol': False,
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
70 'ignoreblanklines': False,
10189
e451e599fbcf patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents: 10185
diff changeset
71 'upgrade': False,
30806
e2796f193f06 patch: add similarity config knob in experimental section
Sean Farley <sean@farley.io>
parents: 30788
diff changeset
72 'showsimilarity': False,
35286
6ba79cf34f5e patch: add within-line color diff capacity
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents: 34506
diff changeset
73 'worddiff': False,
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
74 }
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
75
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
76 def __init__(self, **opts):
31636
a7acda2de4b8 diff: use pycompat.{byteskwargs, strkwargs} to switch opts b/w bytes and str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31283
diff changeset
77 opts = pycompat.byteskwargs(opts)
29416
30789efb1e5e mdiff: remove use of __slots__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27711
diff changeset
78 for k in self.defaults.keys():
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
79 v = opts.get(k)
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
80 if v is None:
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
81 v = self.defaults[k]
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
82 setattr(self, k, v)
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
83
6467
65029a3aafc2 Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents: 5863
diff changeset
84 try:
65029a3aafc2 Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents: 5863
diff changeset
85 self.context = int(self.context)
65029a3aafc2 Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents: 5863
diff changeset
86 except ValueError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24119
diff changeset
87 raise error.Abort(_('diff context lines count must be '
6467
65029a3aafc2 Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents: 5863
diff changeset
88 'an integer, not %r') % self.context)
65029a3aafc2 Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents: 5863
diff changeset
89
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 9827
diff changeset
90 def copy(self, **kwargs):
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 9827
diff changeset
91 opts = dict((k, getattr(self, k)) for k in self.defaults)
33114
1b6946f87c50 py3: use pycompat.strkwargs() to convert kwargs keys to str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32410
diff changeset
92 opts = pycompat.strkwargs(opts)
10185
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 9827
diff changeset
93 opts.update(kwargs)
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 9827
diff changeset
94 return diffopts(**opts)
7637fe4f525d mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents: 9827
diff changeset
95
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
96 defaultopts = diffopts()
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
97
9827
4fe9ca519637 mdiff: fix diff -b/B/w on mixed whitespace hunks (issue127)
Patrick Mezard <pmezard@gmail.com>
parents: 8632
diff changeset
98 def wsclean(opts, text, blank=True):
4878
372d93f03d3a diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents: 4679
diff changeset
99 if opts.ignorews:
15530
eeac5e179243 mdiff: replace wscleanup() regexps with C loops
Patrick Mezard <pmezard@gmail.com>
parents: 15529
diff changeset
100 text = bdiff.fixws(text, 1)
4878
372d93f03d3a diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents: 4679
diff changeset
101 elif opts.ignorewsamount:
15530
eeac5e179243 mdiff: replace wscleanup() regexps with C loops
Patrick Mezard <pmezard@gmail.com>
parents: 15529
diff changeset
102 text = bdiff.fixws(text, 0)
9827
4fe9ca519637 mdiff: fix diff -b/B/w on mixed whitespace hunks (issue127)
Patrick Mezard <pmezard@gmail.com>
parents: 8632
diff changeset
103 if blank and opts.ignoreblanklines:
15509
3774e1453ef4 diff: --ignore-blank-lines was too enthusiastic
Patrick Mezard <pmezard@gmail.com>
parents: 15462
diff changeset
104 text = re.sub('\n+', '\n', text).strip('\n')
34031
da07367d683b mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents: 33114
diff changeset
105 if opts.ignorewseol:
35584
6f62a1c3e11d py3: make regular expressions bytes by prepending b''
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35583
diff changeset
106 text = re.sub(br'[ \t\r\f]+\n', r'\n', text)
4878
372d93f03d3a diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents: 4679
diff changeset
107 return text
372d93f03d3a diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents: 4679
diff changeset
108
15528
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
109 def splitblock(base1, lines1, base2, lines2, opts):
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
110 # The input lines matches except for interwoven blank lines. We
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
111 # transform it into a sequence of matching blocks and blank blocks.
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
112 lines1 = [(wsclean(opts, l) and 1 or 0) for l in lines1]
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
113 lines2 = [(wsclean(opts, l) and 1 or 0) for l in lines2]
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
114 s1, e1 = 0, len(lines1)
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
115 s2, e2 = 0, len(lines2)
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
116 while s1 < e1 or s2 < e2:
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
117 i1, i2, btype = s1, s2, '='
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
118 if (i1 >= e1 or lines1[i1] == 0
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
119 or i2 >= e2 or lines2[i2] == 0):
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
120 # Consume the block of blank lines
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
121 btype = '~'
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
122 while i1 < e1 and lines1[i1] == 0:
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
123 i1 += 1
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
124 while i2 < e2 and lines2[i2] == 0:
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
125 i2 += 1
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
126 else:
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
127 # Consume the matching lines
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
128 while i1 < e1 and lines1[i1] == 1 and lines2[i2] == 1:
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
129 i1 += 1
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
130 i2 += 1
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
131 yield [base1 + s1, base1 + i1, base2 + s2, base2 + i2], btype
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
132 s1 = i1
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
133 s2 = i2
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15526
diff changeset
134
31808
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
135 def hunkinrange(hunk, linerange):
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
136 """Return True if `hunk` defined as (start, length) is in `linerange`
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
137 defined as (lowerbound, upperbound).
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
138
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
139 >>> hunkinrange((5, 10), (2, 7))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
140 True
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
141 >>> hunkinrange((5, 10), (6, 12))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
142 True
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
143 >>> hunkinrange((5, 10), (13, 17))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
144 True
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
145 >>> hunkinrange((5, 10), (3, 17))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
146 True
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
147 >>> hunkinrange((5, 10), (1, 3))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
148 False
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
149 >>> hunkinrange((5, 10), (18, 20))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
150 False
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
151 >>> hunkinrange((5, 10), (1, 5))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
152 False
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
153 >>> hunkinrange((5, 10), (15, 27))
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
154 False
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
155 """
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
156 start, length = hunk
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
157 lowerbound, upperbound = linerange
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
158 return lowerbound < start + length and start < upperbound
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
159
30717
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
160 def blocksinrange(blocks, rangeb):
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
161 """filter `blocks` like (a1, a2, b1, b2) from items outside line range
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
162 `rangeb` from ``(b1, b2)`` point of view.
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
163
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
164 Return `filteredblocks, rangea` where:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
165
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
166 * `filteredblocks` is list of ``block = (a1, a2, b1, b2), stype`` items of
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
167 `blocks` that are inside `rangeb` from ``(b1, b2)`` point of view; a
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
168 block ``(b1, b2)`` being inside `rangeb` if
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
169 ``rangeb[0] < b2 and b1 < rangeb[1]``;
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
170 * `rangea` is the line range w.r.t. to ``(a1, a2)`` parts of `blocks`.
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
171 """
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
172 lbb, ubb = rangeb
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
173 lba, uba = None, None
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
174 filteredblocks = []
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
175 for block in blocks:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
176 (a1, a2, b1, b2), stype = block
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
177 if lbb >= b1 and ubb <= b2 and stype == '=':
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
178 # rangeb is within a single "=" hunk, restrict back linerange1
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
179 # by offsetting rangeb
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
180 lba = lbb - b1 + a1
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
181 uba = ubb - b1 + a1
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
182 else:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
183 if b1 <= lbb < b2:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
184 if stype == '=':
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
185 lba = a2 - (b2 - lbb)
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
186 else:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
187 lba = a1
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
188 if b1 < ubb <= b2:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
189 if stype == '=':
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
190 uba = a1 + (ubb - b1)
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
191 else:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
192 uba = a2
31808
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31720
diff changeset
193 if hunkinrange((b1, (b2 - b1)), rangeb):
30717
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
194 filteredblocks.append(block)
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
195 if lba is None or uba is None or uba < lba:
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
196 raise error.Abort(_('line range exceeds file size'))
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
197 return filteredblocks, (lba, uba)
3eeb8e138e5c mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30025
diff changeset
198
30025
ff17dff99295 mdiff: remove unused parameter 'refine' from allblocks()
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 29416
diff changeset
199 def allblocks(text1, text2, opts=None, lines1=None, lines2=None):
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
200 """Return (block, type) tuples, where block is an mdiff.blocks
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
201 line entry. type is '=' for blocks matching exactly one another
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
202 (bdiff blocks), '!' for non-matching blocks and '~' for blocks
30025
ff17dff99295 mdiff: remove unused parameter 'refine' from allblocks()
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 29416
diff changeset
203 matching only after having filtered blank lines.
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
204 line1 and line2 are text1 and text2 split with splitnewlines() if
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
205 they are already available.
15525
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
206 """
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
207 if opts is None:
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
208 opts = defaultopts
34031
da07367d683b mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents: 33114
diff changeset
209 if opts.ignorews or opts.ignorewsamount or opts.ignorewseol:
15525
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
210 text1 = wsclean(opts, text1, False)
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
211 text2 = wsclean(opts, text2, False)
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
212 diff = bdiff.blocks(text1, text2)
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
213 for i, s1 in enumerate(diff):
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
214 # The first match is special.
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
215 # we've either found a match starting at line 0 or a match later
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
216 # in the file. If it starts later, old and new below will both be
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
217 # empty and we'll continue to the next match.
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
218 if i > 0:
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
219 s = diff[i - 1]
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
220 else:
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
221 s = [0, 0, 0, 0]
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
222 s = [s[1], s1[0], s[3], s1[2]]
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
223
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
224 # bdiff sometimes gives huge matches past eof, this check eats them,
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
225 # and deals with the special first match case described above
15529
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
226 if s[0] != s[1] or s[2] != s[3]:
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
227 type = '!'
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
228 if opts.ignoreblanklines:
15529
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
229 if lines1 is None:
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
230 lines1 = splitnewlines(text1)
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
231 if lines2 is None:
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
232 lines2 = splitnewlines(text2)
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
233 old = wsclean(opts, "".join(lines1[s[0]:s[1]]))
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
234 new = wsclean(opts, "".join(lines2[s[2]:s[3]]))
b35cf47286a6 mdiff: split lines in allblocks() only when necessary
Patrick Mezard <pmezard@gmail.com>
parents: 15528
diff changeset
235 if old == new:
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
236 type = '~'
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
237 yield s, type
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
238 yield s1, '='
15525
935bf2e7dbc5 mdiff: extract blocks whitespace normalization in diffblocks()
Patrick Mezard <pmezard@gmail.com>
parents: 15513
diff changeset
239
35990
8b6dd3922f70 patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents: 35983
diff changeset
240 def unidiff(a, ad, b, bd, fn1, fn2, binary, opts=defaultopts):
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
241 """Return a unified diff as a (headers, hunks) tuple.
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
242
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
243 If the diff is not null, `headers` is a list with unified diff header
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
244 lines "--- <original>" and "+++ <new>" and `hunks` is a generator yielding
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
245 (hunkrange, hunklines) coming from _unidiff().
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
246 Otherwise, `headers` and `hunks` are empty.
35890
079b27b5a869 patch: avoid repeated binary checks if all files in a patch are text
Joerg Sonnenberger <joerg@bec.de>
parents: 35584
diff changeset
247
35990
8b6dd3922f70 patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents: 35983
diff changeset
248 Set binary=True if either a or b should be taken as a binary file.
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
249 """
16362
16b75661828e mdiff: fix diff header generation for files with spaces (issue3357)
Patrick Mezard <patrick@mezard.eu>
parents: 16089
diff changeset
250 def datetag(date, fn=None):
4679
826659bd8053 git patches: correct handling of filenames with spaces
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4361
diff changeset
251 if not opts.git and not opts.nodates:
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
252 return '\t%s' % date
16362
16b75661828e mdiff: fix diff header generation for files with spaces (issue3357)
Patrick Mezard <patrick@mezard.eu>
parents: 16089
diff changeset
253 if fn and ' ' in fn:
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
254 return '\t'
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
255 return ''
3026
d838bfac668d Remove dates from git export file lines - they confuse git-apply
Brendan Cully <brendan@kublai.com>
parents: 2907
diff changeset
256
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
257 sentinel = [], ()
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
258 if not a and not b:
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
259 return sentinel
23299
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
260
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
261 if opts.noprefix:
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
262 aprefix = bprefix = ''
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
263 else:
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
264 aprefix = 'a/'
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
265 bprefix = 'b/'
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
266
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36444
diff changeset
267 epoch = dateutil.datestr((0, 0))
264
4c1d7072d5cd Attempt to make diff deal with null sources properly
mpm@selenic.com
parents: 249
diff changeset
268
15437
8f08b635cdce diff: always use / in paths in diff
Mads Kiilerich <mads@kiilerich.com>
parents: 15141
diff changeset
269 fn1 = util.pconvert(fn1)
8f08b635cdce diff: always use / in paths in diff
Mads Kiilerich <mads@kiilerich.com>
parents: 15141
diff changeset
270 fn2 = util.pconvert(fn2)
8f08b635cdce diff: always use / in paths in diff
Mads Kiilerich <mads@kiilerich.com>
parents: 15141
diff changeset
271
35990
8b6dd3922f70 patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents: 35983
diff changeset
272 if binary:
6871
13fe85fe396b mdiff: compare content of binary files directly
Martin Geisler <mg@daimi.au.dk>
parents: 6470
diff changeset
273 if a and b and len(a) == len(b) and a == b:
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
274 return sentinel
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
275 headerlines = []
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
276 hunks = (None, ['Binary file %s has changed\n' % fn1]),
1723
fde8fb2cbede Fix diff against an empty file (issue124) and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
277 elif not a:
35991
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
278 without_newline = not b.endswith('\n')
2251
35fb62a3a673 fix speed regression in mdiff caused by line split bugfix.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2248
diff changeset
279 b = splitnewlines(b)
1723
fde8fb2cbede Fix diff against an empty file (issue124) and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
280 if a is None:
16362
16b75661828e mdiff: fix diff header generation for files with spaces (issue3357)
Patrick Mezard <patrick@mezard.eu>
parents: 16089
diff changeset
281 l1 = '--- /dev/null%s' % datetag(epoch)
1723
fde8fb2cbede Fix diff against an empty file (issue124) and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
282 else:
23299
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
283 l1 = "--- %s%s%s" % (aprefix, fn1, datetag(ad, fn1))
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
284 l2 = "+++ %s%s" % (bprefix + fn2, datetag(bd, fn2))
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
285 headerlines = [l1, l2]
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
286 size = len(b)
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
287 hunkrange = (0, 0, 1, size)
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
288 hunklines = ["@@ -0,0 +1,%d @@\n" % size] + ["+" + e for e in b]
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
289 if without_newline:
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
290 hunklines[-1] += '\n'
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
291 hunklines.append(_missing_newline_marker)
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
292 hunks = (hunkrange, hunklines),
1723
fde8fb2cbede Fix diff against an empty file (issue124) and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
293 elif not b:
35991
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
294 without_newline = not a.endswith('\n')
2251
35fb62a3a673 fix speed regression in mdiff caused by line split bugfix.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2248
diff changeset
295 a = splitnewlines(a)
23299
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
296 l1 = "--- %s%s%s" % (aprefix, fn1, datetag(ad, fn1))
1723
fde8fb2cbede Fix diff against an empty file (issue124) and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
297 if b is None:
16362
16b75661828e mdiff: fix diff header generation for files with spaces (issue3357)
Patrick Mezard <patrick@mezard.eu>
parents: 16089
diff changeset
298 l2 = '+++ /dev/null%s' % datetag(epoch)
1723
fde8fb2cbede Fix diff against an empty file (issue124) and add a test for this.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1637
diff changeset
299 else:
23299
1f510efcd5f3 mdiff.unidiff: add support for noprefix
Siddharth Agarwal <sid0@fb.com>
parents: 23294
diff changeset
300 l2 = "+++ %s%s%s" % (bprefix, fn2, datetag(bd, fn2))
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
301 headerlines = [l1, l2]
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
302 size = len(a)
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
303 hunkrange = (1, size, 0, 0)
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
304 hunklines = ["@@ -1,%d +0,0 @@\n" % size] + ["-" + e for e in a]
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
305 if without_newline:
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
306 hunklines[-1] += '\n'
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
307 hunklines.append(_missing_newline_marker)
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
308 hunks = (hunkrange, hunklines),
264
4c1d7072d5cd Attempt to make diff deal with null sources properly
mpm@selenic.com
parents: 249
diff changeset
309 else:
35892
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
310 hunks = _unidiff(a, b, opts=opts)
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
311 if not next(hunks):
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
312 return sentinel
10614
d0050f36e688 remove header handling out of mdiff.bunidiff, rename it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
313
31281
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
314 headerlines = [
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
315 "--- %s%s%s" % (aprefix, fn1, datetag(ad, fn1)),
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
316 "+++ %s%s%s" % (bprefix, fn2, datetag(bd, fn2)),
b3861be6aa6c mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31279
diff changeset
317 ]
31283
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
318
92714858dd3e mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31282
diff changeset
319 return headerlines, hunks
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
320
31277
881ed6a4cf87 mdiff: compute newlines-splitted texts within _unidiff
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30806
diff changeset
321 def _unidiff(t1, t2, opts=defaultopts):
31279
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
322 """Yield hunks of a headerless unified diff from t1 and t2 texts.
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
323
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
324 Each hunk consists of a (hunkrange, hunklines) tuple where `hunkrange` is a
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
325 tuple (s1, l1, s2, l2) representing the range information of the hunk to
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
326 form the '@@ -s1,l1 +s2,l2 @@' header and `hunklines` is a list of lines
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
327 of the hunk combining said header followed by line additions and
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
328 deletions.
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
329
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
330 The hunks are prefixed with a bool.
31279
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
331 """
31277
881ed6a4cf87 mdiff: compute newlines-splitted texts within _unidiff
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30806
diff changeset
332 l1 = splitnewlines(t1)
881ed6a4cf87 mdiff: compute newlines-splitted texts within _unidiff
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30806
diff changeset
333 l2 = splitnewlines(t2)
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
334 def contextend(l, len):
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
335 ret = l + opts.context
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
336 if ret > len:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
337 ret = len
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
338 return ret
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
339
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
340 def contextstart(l):
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
341 ret = l - opts.context
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
342 if ret < 0:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
343 return 0
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
344 return ret
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
345
15141
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
346 lastfunc = [0, '']
10614
d0050f36e688 remove header handling out of mdiff.bunidiff, rename it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
347 def yieldhunk(hunk):
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
348 (astart, a2, bstart, b2, delta) = hunk
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
349 aend = contextend(a2, len(l1))
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
350 alen = aend - astart
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
351 blen = b2 - bstart + aend - a2
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
352
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
353 func = ""
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
354 if opts.showfunc:
15141
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
355 lastpos, func = lastfunc
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
356 # walk backwards from the start of the context up to the start of
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
357 # the previous hunk context until we find a line starting with an
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
358 # alphanumeric char.
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
359 for i in xrange(astart - 1, lastpos - 1, -1):
35583
2f123f309f61 py3: slice on bytes instead of indexing
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35286
diff changeset
360 if l1[i][0:1].isalnum():
36444
44c4a38bf563 diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents: 36184
diff changeset
361 func = b' ' + l1[i].rstrip()
44c4a38bf563 diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents: 36184
diff changeset
362 # split long function name if ASCII. otherwise we have no
44c4a38bf563 diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents: 36184
diff changeset
363 # idea where the multi-byte boundary is, so just leave it.
44c4a38bf563 diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents: 36184
diff changeset
364 if encoding.isasciistr(func):
44c4a38bf563 diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents: 36184
diff changeset
365 func = func[:41]
15141
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
366 lastfunc[1] = func
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
367 break
15141
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
368 # by recording this hunk's starting point as the next place to
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
369 # start looking for function lines, we avoid reading any line in
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
370 # the file more than once.
16dc9a32ca04 mdiff: speed up showfunc for large diffs
Brodie Rao <brodie@bitheap.org>
parents: 12751
diff changeset
371 lastfunc[0] = astart
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
372
15462
2b1ec74c961f mdiff/patch: fix bad hunk handling for unified diffs with zero context
Nicolas Venegas <nvenegas@atlassian.com>
parents: 15141
diff changeset
373 # zero-length hunk ranges report their start line as one less
2b1ec74c961f mdiff/patch: fix bad hunk handling for unified diffs with zero context
Nicolas Venegas <nvenegas@atlassian.com>
parents: 15141
diff changeset
374 if alen:
2b1ec74c961f mdiff/patch: fix bad hunk handling for unified diffs with zero context
Nicolas Venegas <nvenegas@atlassian.com>
parents: 15141
diff changeset
375 astart += 1
2b1ec74c961f mdiff/patch: fix bad hunk handling for unified diffs with zero context
Nicolas Venegas <nvenegas@atlassian.com>
parents: 15141
diff changeset
376 if blen:
2b1ec74c961f mdiff/patch: fix bad hunk handling for unified diffs with zero context
Nicolas Venegas <nvenegas@atlassian.com>
parents: 15141
diff changeset
377 bstart += 1
2b1ec74c961f mdiff/patch: fix bad hunk handling for unified diffs with zero context
Nicolas Venegas <nvenegas@atlassian.com>
parents: 15141
diff changeset
378
31279
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
379 hunkrange = astart, alen, bstart, blen
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
380 hunklines = (
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
381 ["@@ -%d,%d +%d,%d @@%s\n" % (hunkrange + (func,))]
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
382 + delta
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
383 + [' ' + l1[x] for x in xrange(a2, aend)]
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
384 )
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
385 # If either file ends without a newline and the last line of
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
386 # that file is part of a hunk, a marker is printed. If the
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
387 # last line of both files is identical and neither ends in
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
388 # a newline, print only one marker. That's the only case in
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
389 # which the hunk can end in a shared line without a newline.
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
390 skip = False
35991
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
391 if not t1.endswith('\n') and astart + alen == len(l1) + 1:
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
392 for i in xrange(len(hunklines) - 1, -1, -1):
35991
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
393 if hunklines[i].startswith(('-', ' ')):
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
394 if hunklines[i].startswith(' '):
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
395 skip = True
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
396 hunklines[i] += '\n'
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
397 hunklines.insert(i + 1, _missing_newline_marker)
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
398 break
35991
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
399 if not skip and not t2.endswith('\n') and bstart + blen == len(l2) + 1:
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
400 for i in xrange(len(hunklines) - 1, -1, -1):
35991
9e641c4525a2 mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents: 35990
diff changeset
401 if hunklines[i].startswith('+'):
35891
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
402 hunklines[i] += '\n'
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
403 hunklines.insert(i + 1, _missing_newline_marker)
a9d07bd8f758 mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents: 35890
diff changeset
404 break
31279
5e7fd3a0b17f mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31278
diff changeset
405 yield hunkrange, hunklines
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
406
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
407 # bdiff.blocks gives us the matching sequences in the files. The loop
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
408 # below finds the spaces between those matching sequences and translates
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
409 # them into diff output.
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
410 #
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
411 hunk = None
16089
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
412 ignoredlines = 0
35892
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
413 has_hunks = False
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
414 for s, stype in allblocks(t1, t2, opts, l1, l2):
16089
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
415 a1, a2, b1, b2 = s
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
416 if stype != '!':
16089
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
417 if stype == '~':
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
418 # The diff context lines are based on t1 content. When
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
419 # blank lines are ignored, the new lines offsets must
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
420 # be adjusted as if equivalent blocks ('~') had the
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
421 # same sizes on both sides.
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
422 ignoredlines += (b2 - b1) - (a2 - a1)
15526
e6519c628454 mdiff: make diffblocks() return all blocks, matching and changed
Patrick Mezard <pmezard@gmail.com>
parents: 15525
diff changeset
423 continue
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
424 delta = []
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
425 old = l1[a1:a2]
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
426 new = l2[b1:b2]
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
427
16089
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
428 b1 -= ignoredlines
2e8f4b82c551 mdiff: adjust hunk offsets with --ignore-blank-lines (issue3234)
Patrick Mezard <patrick@mezard.eu>
parents: 15657
diff changeset
429 b2 -= ignoredlines
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
430 astart = contextstart(a1)
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
431 bstart = contextstart(b1)
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
432 prev = None
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
433 if hunk:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
434 # join with the previous hunk if it falls inside the context
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2859
diff changeset
435 if astart < hunk[1] + opts.context + 1:
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
436 prev = hunk
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
437 astart = hunk[1]
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
438 bstart = hunk[3]
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
439 else:
35892
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
440 if not has_hunks:
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
441 has_hunks = True
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
442 yield True
10614
d0050f36e688 remove header handling out of mdiff.bunidiff, rename it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
443 for x in yieldhunk(hunk):
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
444 yield x
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
445 if prev:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
446 # we've joined the previous hunk, record the new ending points.
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
447 hunk[1] = a2
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
448 hunk[3] = b2
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
449 delta = hunk[4]
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
450 else:
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
451 # create a new hunk
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
452 hunk = [astart, a2, bstart, b2, delta]
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
453
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
454 delta[len(delta):] = [' ' + x for x in l1[astart:a1]]
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
455 delta[len(delta):] = ['-' + x for x in old]
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
456 delta[len(delta):] = ['+' + x for x in new]
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
457
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
458 if hunk:
35892
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
459 if not has_hunks:
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
460 has_hunks = True
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
461 yield True
10614
d0050f36e688 remove header handling out of mdiff.bunidiff, rename it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
462 for x in yieldhunk(hunk):
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
463 yield x
35892
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
464 elif not has_hunks:
6a33e81e4c5e mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents: 35891
diff changeset
465 yield False
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1540
diff changeset
466
17939
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
467 def b85diff(to, tn):
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
468 '''print base85-encoded binary diff'''
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
469 def fmtline(line):
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
470 l = len(line)
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
471 if l <= 26:
35983
bdb6ec909878 py3: use pycompat.bytechr instead of chr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35916
diff changeset
472 l = pycompat.bytechr(ord('A') + l - 1)
17939
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
473 else:
35983
bdb6ec909878 py3: use pycompat.bytechr instead of chr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35916
diff changeset
474 l = pycompat.bytechr(l - 26 + ord('a') - 1)
32245
4462a981e8df base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents: 32244
diff changeset
475 return '%c%s\n' % (l, util.b85encode(line, True))
17939
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
476
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
477 def chunk(text, csize=52):
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
478 l = len(text)
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
479 i = 0
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
480 while i < l:
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
481 yield text[i:i + csize]
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
482 i += csize
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
483
17946
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
484 if to is None:
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
485 to = ''
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
486 if tn is None:
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
487 tn = ''
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
488
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
489 if to == tn:
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
490 return ''
17939
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
491
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
492 # TODO: deltas
17946
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
493 ret = []
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
494 ret.append('GIT binary patch\n')
34506
1d804c22c671 py3: use '%d' for integers instead of '%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34031
diff changeset
495 ret.append('literal %d\n' % len(tn))
17939
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
496 for l in chunk(zlib.compress(tn)):
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
497 ret.append(fmtline(l))
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
498 ret.append('\n')
17946
1e13b1184292 diff: move index header generation to patch
Guillermo P?rez <bisho@fb.com>
parents: 17941
diff changeset
499
17939
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
500 return ''.join(ret)
d587925680d9 diff: move b85diff to mdiff module
Guillermo P?rez <bisho at fb.com>
parents: 16362
diff changeset
501
120
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
502 def patchtext(bin):
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
503 pos = 0
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
504 t = []
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
505 while pos < len(bin):
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
506 p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12])
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
507 pos += 12
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
508 t.append(bin[pos:pos + l])
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
509 pos += l
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
510 return "".join(t)
bae6f0328f63 Add a function to return the new text from a binary diff
mpm@selenic.com
parents: 75
diff changeset
511
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
512 def patch(a, bin):
12025
2315a95ee887 mdiff.patch(): add a special case for when the base text is empty
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10614
diff changeset
513 if len(a) == 0:
2315a95ee887 mdiff.patch(): add a special case for when the base text is empty
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10614
diff changeset
514 # skip over trivial delta header
15657
d976b1ef6760 util: don't mess with builtins to emulate buffer()
Matt Mackall <mpm@selenic.com>
parents: 15530
diff changeset
515 return util.buffer(bin, 12)
1379
8ee7ce877be2 Clean up mdiff imports
Matt Mackall <mpm@selenic.com>
parents: 1378
diff changeset
516 return mpatch.patches(a, [bin])
432
3b9e3d3d2810 Start using bdiff for generating deltas
mpm@selenic.com
parents: 396
diff changeset
517
4361
99c853a1408c add mdiff.get_matching_blocks
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4108
diff changeset
518 # similar to difflib.SequenceMatcher.get_matching_blocks
99c853a1408c add mdiff.get_matching_blocks
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4108
diff changeset
519 def get_matching_blocks(a, b):
99c853a1408c add mdiff.get_matching_blocks
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4108
diff changeset
520 return [(d[0], d[2], d[1] - d[0]) for d in bdiff.blocks(a, b)]
99c853a1408c add mdiff.get_matching_blocks
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4108
diff changeset
521
5367
7530334bf301 revlog: generate trivial deltas against null revision
Matt Mackall <mpm@selenic.com>
parents: 4878
diff changeset
522 def trivialdiffheader(length):
27711
7a678a12a5cf mdiff: don't emit a diff header for empty trivial deltas
Mike Hommey <mh@glandium.org>
parents: 27484
diff changeset
523 return struct.pack(">lll", 0, 0, length) if length else ''
5367
7530334bf301 revlog: generate trivial deltas against null revision
Matt Mackall <mpm@selenic.com>
parents: 4878
diff changeset
524
24119
a5a06c9c7407 mdiff: add helper for making deltas which replace the full text of a revision
Mike Edgar <adgar@google.com>
parents: 23299
diff changeset
525 def replacediffheader(oldlen, newlen):
a5a06c9c7407 mdiff: add helper for making deltas which replace the full text of a revision
Mike Edgar <adgar@google.com>
parents: 23299
diff changeset
526 return struct.pack(">lll", 0, oldlen, newlen)