Mercurial > public > mercurial-scm > hg
annotate mercurial/mdiff.py @ 36884:ece242db5000
hgweb: use templater on requestcontext instance
After this commit, all @webcommand function no longer use their
"tmpl" argument. Instead, they use the templater attached to the
requestcontext.
This is the same exact object. So there should be no difference in
behavior.
Differential Revision: https://phab.mercurial-scm.org/D2800
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 10 Mar 2018 20:38:28 -0800 |
parents | c6a61298ac32 |
children | b6de372b4309 |
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 | 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 | 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 ( |
36414
44c4a38bf563
diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents:
36146
diff
changeset
|
16 encoding, |
27484
0d7635dca691
mdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
17 error, |
32369
3b88a7fa97d8
bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32202
diff
changeset
|
18 policy, |
31631
a7acda2de4b8
diff: use pycompat.{byteskwargs, strkwargs} to switch opts b/w bytes and str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31273
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 ) |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36414
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 |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
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:
35850
diff
changeset
|
25 |
32369
3b88a7fa97d8
bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32202
diff
changeset
|
26 bdiff = policy.importmod(r'bdiff') |
32371
151cc3b3d799
mpatch: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32369
diff
changeset
|
27 mpatch = policy.importmod(r'mpatch') |
32369
3b88a7fa97d8
bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32202
diff
changeset
|
28 |
32202
ded48ad55146
bdiff: proxy through mdiff module
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
29 blocks = bdiff.blocks |
ded48ad55146
bdiff: proxy through mdiff module
Yuya Nishihara <yuya@tcha.org>
parents:
32201
diff
changeset
|
30 fixws = bdiff.fixws |
32200
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 |
36655
68026dd7c4f9
cext: accept arguments as Py_buffer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36625
diff
changeset
|
33 textdiff = bdiff.bdiff |
36146
29dd37a418aa
bdiff: write a native version of splitnewlines
Augie Fackler <augie@google.com>
parents:
35952
diff
changeset
|
34 splitnewlines = bdiff.splitnewlines |
2248
b914f0557832
fix diffs containing embedded "\r".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2078
diff
changeset
|
35 |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
36 class diffopts(object): |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
37 '''context is the number of context lines |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
38 text treats all files as text |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
39 showfunc enables diff -p output |
2907 | 40 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
|
41 nodates removes dates from diff headers |
23293
b89856abf4e2
mdiff.diffopts: add doc comment for nobinary
Siddharth Agarwal <sid0@fb.com>
parents:
21790
diff
changeset
|
42 nobinary ignores binary files |
23294
ec8c73b02e2e
mdiff.diffopts: add a new noprefix option
Siddharth Agarwal <sid0@fb.com>
parents:
23293
diff
changeset
|
43 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
|
44 ignorews ignores all whitespace changes in the diff |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
45 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
|
46 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
|
47 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
|
48 ''' |
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
|
49 |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
50 defaults = { |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
51 'context': 3, |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
52 'text': False, |
5863
3d1f9dcecdea
diff: don't show function name by default
Matt Mackall <mpm@selenic.com>
parents:
5482
diff
changeset
|
53 'showfunc': False, |
2907 | 54 '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
|
55 'nodates': False, |
21790
3fbef7ac26f0
diff: add nobinary config to suppress git-style binary diffs
Stephen Lee <sphen.lee@gmail.com>
parents:
20034
diff
changeset
|
56 'nobinary': False, |
23294
ec8c73b02e2e
mdiff.diffopts: add a new noprefix option
Siddharth Agarwal <sid0@fb.com>
parents:
23293
diff
changeset
|
57 'noprefix': False, |
30788
d1901c4c8ec0
patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents:
30717
diff
changeset
|
58 'index': 0, |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
59 'ignorews': False, |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
60 'ignorewsamount': False, |
34013
da07367d683b
mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents:
33102
diff
changeset
|
61 'ignorewseol': False, |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
62 'ignoreblanklines': False, |
10189
e451e599fbcf
patch: support diff data loss detection and upgrade
Patrick Mezard <pmezard@gmail.com>
parents:
10185
diff
changeset
|
63 'upgrade': False, |
30806
e2796f193f06
patch: add similarity config knob in experimental section
Sean Farley <sean@farley.io>
parents:
30788
diff
changeset
|
64 'showsimilarity': False, |
35277
6ba79cf34f5e
patch: add within-line color diff capacity
Matthieu Laneuville <matthieu.laneuville@octobus.net>
parents:
34506
diff
changeset
|
65 'worddiff': False, |
36676
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
66 'xdiff': False, |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
67 } |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
68 |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
69 def __init__(self, **opts): |
31631
a7acda2de4b8
diff: use pycompat.{byteskwargs, strkwargs} to switch opts b/w bytes and str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31273
diff
changeset
|
70 opts = pycompat.byteskwargs(opts) |
29416
30789efb1e5e
mdiff: remove use of __slots__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27711
diff
changeset
|
71 for k in self.defaults.keys(): |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
72 v = opts.get(k) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
73 if v is None: |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
74 v = self.defaults[k] |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
75 setattr(self, k, v) |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
76 |
6467
65029a3aafc2
Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents:
5863
diff
changeset
|
77 try: |
65029a3aafc2
Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents:
5863
diff
changeset
|
78 self.context = int(self.context) |
65029a3aafc2
Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents:
5863
diff
changeset
|
79 except ValueError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24119
diff
changeset
|
80 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
|
81 'an integer, not %r') % self.context) |
65029a3aafc2
Let --unified default to diff.unified (issue 1076)
Patrick Mezard <pmezard@gmail.com>
parents:
5863
diff
changeset
|
82 |
10185
7637fe4f525d
mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents:
9827
diff
changeset
|
83 def copy(self, **kwargs): |
7637fe4f525d
mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents:
9827
diff
changeset
|
84 opts = dict((k, getattr(self, k)) for k in self.defaults) |
33102
1b6946f87c50
py3: use pycompat.strkwargs() to convert kwargs keys to str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32371
diff
changeset
|
85 opts = pycompat.strkwargs(opts) |
10185
7637fe4f525d
mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents:
9827
diff
changeset
|
86 opts.update(kwargs) |
7637fe4f525d
mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents:
9827
diff
changeset
|
87 return diffopts(**opts) |
7637fe4f525d
mq: preserve --git flag when merging patches
Patrick Mezard <pmezard@gmail.com>
parents:
9827
diff
changeset
|
88 |
2874
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
89 defaultopts = diffopts() |
4ec58b157265
refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2859
diff
changeset
|
90 |
9827
4fe9ca519637
mdiff: fix diff -b/B/w on mixed whitespace hunks (issue127)
Patrick Mezard <pmezard@gmail.com>
parents:
8632
diff
changeset
|
91 def wsclean(opts, text, blank=True): |
4878
372d93f03d3a
diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents:
4679
diff
changeset
|
92 if opts.ignorews: |
15530
eeac5e179243
mdiff: replace wscleanup() regexps with C loops
Patrick Mezard <pmezard@gmail.com>
parents:
15529
diff
changeset
|
93 text = bdiff.fixws(text, 1) |
4878
372d93f03d3a
diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents:
4679
diff
changeset
|
94 elif opts.ignorewsamount: |
15530
eeac5e179243
mdiff: replace wscleanup() regexps with C loops
Patrick Mezard <pmezard@gmail.com>
parents:
15529
diff
changeset
|
95 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
|
96 if blank and opts.ignoreblanklines: |
15509
3774e1453ef4
diff: --ignore-blank-lines was too enthusiastic
Patrick Mezard <pmezard@gmail.com>
parents:
15462
diff
changeset
|
97 text = re.sub('\n+', '\n', text).strip('\n') |
34013
da07367d683b
mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents:
33102
diff
changeset
|
98 if opts.ignorewseol: |
35584
6f62a1c3e11d
py3: make regular expressions bytes by prepending b''
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35583
diff
changeset
|
99 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
|
100 return text |
372d93f03d3a
diff: correctly handle combinations of whitespace options
Matt Mackall <mpm@selenic.com>
parents:
4679
diff
changeset
|
101 |
15528
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
102 def splitblock(base1, lines1, base2, lines2, opts): |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
103 # 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
|
104 # 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
|
105 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
|
106 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
|
107 s1, e1 = 0, len(lines1) |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
108 s2, e2 = 0, len(lines2) |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
109 while s1 < e1 or s2 < e2: |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
110 i1, i2, btype = s1, s2, '=' |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
111 if (i1 >= e1 or lines1[i1] == 0 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
112 or i2 >= e2 or lines2[i2] == 0): |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
113 # Consume the block of blank lines |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
114 btype = '~' |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
115 while i1 < e1 and lines1[i1] == 0: |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
116 i1 += 1 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
117 while i2 < e2 and lines2[i2] == 0: |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
118 i2 += 1 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
119 else: |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
120 # Consume the matching lines |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
121 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
|
122 i1 += 1 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
123 i2 += 1 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
124 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
|
125 s1 = i1 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
126 s2 = i2 |
a84698badf0b
annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents:
15526
diff
changeset
|
127 |
31808
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
128 def hunkinrange(hunk, linerange): |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
129 """Return True if `hunk` defined as (start, length) is in `linerange` |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
130 defined as (lowerbound, upperbound). |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
131 |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
132 >>> hunkinrange((5, 10), (2, 7)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
133 True |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
134 >>> hunkinrange((5, 10), (6, 12)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
135 True |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
136 >>> hunkinrange((5, 10), (13, 17)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
137 True |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
138 >>> hunkinrange((5, 10), (3, 17)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
139 True |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
140 >>> hunkinrange((5, 10), (1, 3)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
141 False |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
142 >>> hunkinrange((5, 10), (18, 20)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
143 False |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
144 >>> hunkinrange((5, 10), (1, 5)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
145 False |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
146 >>> hunkinrange((5, 10), (15, 27)) |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
147 False |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
148 """ |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
149 start, length = hunk |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
150 lowerbound, upperbound = linerange |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
151 return lowerbound < start + length and start < upperbound |
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
152 |
30717
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
153 def blocksinrange(blocks, rangeb): |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
154 """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:
30023
diff
changeset
|
155 `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:
30023
diff
changeset
|
156 |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
157 Return `filteredblocks, rangea` where: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
158 |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
159 * `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:
30023
diff
changeset
|
160 `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:
30023
diff
changeset
|
161 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:
30023
diff
changeset
|
162 ``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:
30023
diff
changeset
|
163 * `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:
30023
diff
changeset
|
164 """ |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
165 lbb, ubb = rangeb |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
166 lba, uba = None, None |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
167 filteredblocks = [] |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
168 for block in blocks: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
169 (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:
30023
diff
changeset
|
170 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:
30023
diff
changeset
|
171 # 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:
30023
diff
changeset
|
172 # by offsetting rangeb |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
173 lba = lbb - b1 + a1 |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
174 uba = ubb - b1 + a1 |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
175 else: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
176 if b1 <= lbb < b2: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
177 if stype == '=': |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
178 lba = a2 - (b2 - lbb) |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
179 else: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
180 lba = a1 |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
181 if b1 < ubb <= b2: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
182 if stype == '=': |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
183 uba = a1 + (ubb - b1) |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
184 else: |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
185 uba = a2 |
31808
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31715
diff
changeset
|
186 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:
30023
diff
changeset
|
187 filteredblocks.append(block) |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
188 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:
30023
diff
changeset
|
189 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:
30023
diff
changeset
|
190 return filteredblocks, (lba, uba) |
3eeb8e138e5c
mdiff: add a "blocksinrange" function to filter diff blocks by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30023
diff
changeset
|
191 |
36676
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
192 def chooseblocksfunc(opts=None): |
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
193 if (opts is None or not opts.xdiff |
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
194 or not util.safehasattr(bdiff, 'xdiffblocks')): |
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
195 return bdiff.blocks |
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
196 else: |
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
197 return bdiff.xdiffblocks |
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
198 |
30023
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 |
30023
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 |
34013
da07367d683b
mdiff: add a --ignore-space-at-eol option
David Soria Parra <davidsp@fb.com>
parents:
33102
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) |
36676
c6a61298ac32
mdiff: add a config option to use xdiff algorithm
Jun Wu <quark@fb.com>
parents:
36655
diff
changeset
|
212 diff = chooseblocksfunc(opts)(text1, text2) |
15525
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 |
35951
8b6dd3922f70
patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents:
35943
diff
changeset
|
240 def unidiff(a, ad, b, bd, fn1, fn2, binary, opts=defaultopts): |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
241 """Return a unified diff as a (headers, hunks) tuple. |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
242 |
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
243 If the diff is not null, `headers` is a list with unified diff header |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
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:
31272
diff
changeset
|
245 (hunkrange, hunklines) coming from _unidiff(). |
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
246 Otherwise, `headers` and `hunks` are empty. |
35850
079b27b5a869
patch: avoid repeated binary checks if all files in a patch are text
Joerg Sonnenberger <joerg@bec.de>
parents:
35584
diff
changeset
|
247 |
35951
8b6dd3922f70
patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents:
35943
diff
changeset
|
248 Set binary=True if either a or b should be taken as a binary file. |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
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: |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
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: |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
254 return '\t' |
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
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 |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
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: |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
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 |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36414
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 |
35951
8b6dd3922f70
patch: unify check_binary and binary flags
Yuya Nishihara <yuya@tcha.org>
parents:
35943
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: |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
274 return sentinel |
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
275 headerlines = [] |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
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: |
35952
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
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)) |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
285 headerlines = [l1, l2] |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
286 size = len(b) |
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
287 hunkrange = (0, 0, 1, size) |
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
288 hunklines = ["@@ -0,0 +1,%d @@\n" % size] + ["+" + e for e in b] |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
289 if without_newline: |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
290 hunklines[-1] += '\n' |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
291 hunklines.append(_missing_newline_marker) |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
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: |
35952
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
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)) |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
301 headerlines = [l1, l2] |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
302 size = len(a) |
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
303 hunkrange = (1, size, 0, 0) |
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
304 hunklines = ["@@ -1,%d +0,0 @@\n" % size] + ["-" + e for e in a] |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
305 if without_newline: |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
306 hunklines[-1] += '\n' |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
307 hunklines.append(_missing_newline_marker) |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
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: |
35852
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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:
35851
diff
changeset
|
311 if not next(hunks): |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
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 |
31271
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
diff
changeset
|
314 headerlines = [ |
b3861be6aa6c
mdiff: distinguish diff headers from hunks in unidiff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31269
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:
31269
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:
31269
diff
changeset
|
317 ] |
31273
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
318 |
92714858dd3e
mdiff: let unidiff return (diffheader, hunks)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31272
diff
changeset
|
319 return headerlines, hunks |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
320 |
31267
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): |
31269
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
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:
31268
diff
changeset
|
323 |
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
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:
31268
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:
31268
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:
31268
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:
31268
diff
changeset
|
328 deletions. |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
329 |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
330 The hunks are prefixed with a bool. |
31269
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
diff
changeset
|
331 """ |
31267
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 | 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 | 336 if ret > len: |
337 ret = len | |
338 return ret | |
339 | |
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 | 342 if ret < 0: |
343 return 0 | |
344 return ret | |
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 | 348 (astart, a2, bstart, b2, delta) = hunk |
349 aend = contextend(a2, len(l1)) | |
350 alen = aend - astart | |
351 blen = b2 - bstart + aend - a2 | |
352 | |
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:
35277
diff
changeset
|
360 if l1[i][0:1].isalnum(): |
36414
44c4a38bf563
diff: do not split function name if character encoding is unknown
Yuya Nishihara <yuya@tcha.org>
parents:
36146
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:
36146
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:
36146
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:
36146
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:
36146
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 | 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 | 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 |
31269
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
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:
31268
diff
changeset
|
380 hunklines = ( |
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
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:
31268
diff
changeset
|
382 + delta |
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
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:
31268
diff
changeset
|
384 ) |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
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:
35850
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:
35850
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:
35850
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:
35850
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:
35850
diff
changeset
|
390 skip = False |
35952
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
diff
changeset
|
391 if not t1.endswith('\n') and astart + alen == len(l1) + 1: |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
392 for i in xrange(len(hunklines) - 1, -1, -1): |
35952
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
diff
changeset
|
393 if hunklines[i].startswith(('-', ' ')): |
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
diff
changeset
|
394 if hunklines[i].startswith(' '): |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
395 skip = True |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
396 hunklines[i] += '\n' |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
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:
35850
diff
changeset
|
398 break |
35952
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
diff
changeset
|
399 if not skip and not t2.endswith('\n') and bstart + blen == len(l2) + 1: |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
400 for i in xrange(len(hunklines) - 1, -1, -1): |
35952
9e641c4525a2
mdiff: use str.startswith/endswith() instead of slicing
Yuya Nishihara <yuya@tcha.org>
parents:
35951
diff
changeset
|
401 if hunklines[i].startswith('+'): |
35851
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
diff
changeset
|
402 hunklines[i] += '\n' |
a9d07bd8f758
mdiff: explicitly compute places for the newline marker
Joerg Sonnenberger <joerg@bec.de>
parents:
35850
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:
35850
diff
changeset
|
404 break |
31269
5e7fd3a0b17f
mdiff: let _unidiff yield hunks as (<range information>, <hunk lines>)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31268
diff
changeset
|
405 yield hunkrange, hunklines |
1637 | 406 |
407 # bdiff.blocks gives us the matching sequences in the files. The loop | |
408 # below finds the spaces between those matching sequences and translates | |
409 # them into diff output. | |
410 # | |
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 |
35852
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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 | 424 delta = [] |
425 old = l1[a1:a2] | |
426 new = l2[b1:b2] | |
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 | 430 astart = contextstart(a1) |
431 bstart = contextstart(b1) | |
432 prev = None | |
433 if hunk: | |
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 | 436 prev = hunk |
437 astart = hunk[1] | |
438 bstart = hunk[3] | |
439 else: | |
35852
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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:
35851
diff
changeset
|
441 has_hunks = True |
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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 | 444 yield x |
445 if prev: | |
446 # we've joined the previous hunk, record the new ending points. | |
447 hunk[1] = a2 | |
448 hunk[3] = b2 | |
449 delta = hunk[4] | |
450 else: | |
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 | 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 | 457 |
458 if hunk: | |
35852
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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:
35851
diff
changeset
|
460 has_hunks = True |
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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 | 463 yield x |
35852
6a33e81e4c5e
mdiff: remove rewindhunk by yielding a bool first to indicate data
Joerg Sonnenberger <joerg@bec.de>
parents:
35851
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:
35851
diff
changeset
|
465 yield False |
1637 | 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: |
35943
bdb6ec909878
py3: use pycompat.bytechr instead of chr
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35876
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: |
35943
bdb6ec909878
py3: use pycompat.bytechr instead of chr
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35876
diff
changeset
|
474 l = pycompat.bytechr(l - 26 + ord('a') - 1) |
32201
4462a981e8df
base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents:
32200
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:
34013
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 | 516 return mpatch.patches(a, [bin]) |
432 | 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) |