Mercurial > hg
annotate mercurial/pure/mpatch.py @ 52281:854e2b9bca57 stable
Added signature for changeset b267c5764cc6
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Wed, 20 Nov 2024 15:38:57 +0100 |
parents | f4733654f144 |
children |
rev | line source |
---|---|
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
1 # mpatch.py - Python implementation of mpatch.c |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
45942
diff
changeset
|
3 # Copyright 2009 Olivia Mackall <olivia@selenic.com> and others |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
7775
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. |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
7 |
51863
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
51741
diff
changeset
|
8 from __future__ import annotations |
27337
9a17576103a4
mpatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16683
diff
changeset
|
9 |
48873
5aafc3c5bdec
py3: use io.BytesIO directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
46819
diff
changeset
|
10 import io |
7775
5280c39778b6
pure/mpatch: use StringIO instead of mmap (issue1493)
Martin Geisler <mg@daimi.au.dk>
parents:
7699
diff
changeset
|
11 import struct |
27337
9a17576103a4
mpatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16683
diff
changeset
|
12 |
49599
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
13 from typing import ( |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
14 List, |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
15 Tuple, |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
16 ) |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
17 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
18 |
48873
5aafc3c5bdec
py3: use io.BytesIO directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
46819
diff
changeset
|
19 stringio = io.BytesIO |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
20 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
21 |
28782
f736f98e16ca
mpatch: unify mpatchError (issue5182)
timeless <timeless@mozdev.org>
parents:
28589
diff
changeset
|
22 class mpatchError(Exception): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43077
diff
changeset
|
23 """error raised when a delta cannot be decoded""" |
28782
f736f98e16ca
mpatch: unify mpatchError (issue5182)
timeless <timeless@mozdev.org>
parents:
28589
diff
changeset
|
24 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
25 |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
26 # This attempts to apply a series of patches in time proportional to |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
27 # the total size of the patches, rather than patches * len(text). This |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
28 # means rather than shuffling strings around, we shuffle around |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
29 # pointers to fragments with fragment lists. |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
30 # |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
31 # When the fragment lists get too long, we collapse them. To do this |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
32 # efficiently, we do all our operations inside a buffer created by |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
33 # mmap and simply use memmove. This avoids creating a bunch of large |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
34 # temporary string buffers. |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
35 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
36 |
49599
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
37 def _pull( |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
38 dst: List[Tuple[int, int]], src: List[Tuple[int, int]], l: int |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
39 ) -> None: # pull l bytes from src |
28587
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
40 while l: |
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
41 f = src.pop() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
42 if f[0] > l: # do we need to split? |
28587
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
43 src.append((f[0] - l, f[1] + l)) |
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
44 dst.append((l, f[1])) |
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
45 return |
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
46 dst.append(f) |
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
47 l -= f[0] |
76d7cab13f04
mpatch: move pull() method to top level
Augie Fackler <augie@google.com>
parents:
27337
diff
changeset
|
48 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
49 |
49599
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
50 def _move(m: stringio, dest: int, src: int, count: int) -> None: |
28588
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
51 """move count bytes from src to dest |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
52 |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
53 The file pointer is left at the end of dest. |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
54 """ |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
55 m.seek(src) |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
56 buf = m.read(count) |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
57 m.seek(dest) |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
58 m.write(buf) |
6546afde350e
mpatch: un-nest the move() method
Augie Fackler <augie@google.com>
parents:
28587
diff
changeset
|
59 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
60 |
49599
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
61 def _collect( |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
62 m: stringio, buf: int, list: List[Tuple[int, int]] |
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
63 ) -> Tuple[int, int]: |
28589
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
64 start = buf |
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
65 for l, p in reversed(list): |
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
66 _move(m, buf, p, l) |
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
67 buf += l |
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
68 return (buf - start, start) |
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
69 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
70 |
49599
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
71 def patches(a: bytes, bins: List[bytes]) -> bytes: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
72 if not bins: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
73 return a |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
74 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
75 plens = [len(x) for x in bins] |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
76 pl = sum(plens) |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
77 bl = len(a) + pl |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
78 tl = bl + bl + pl # enough for the patches and two working texts |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
79 b1, b2 = 0, bl |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
80 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
81 if not tl: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
82 return a |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
83 |
28861
86db5cb55d46
pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents:
28782
diff
changeset
|
84 m = stringio() |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
85 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
86 # load our original text |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
87 m.write(a) |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
88 frags = [(len(a), b1)] |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
89 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
90 # copy all the patches into our segment so we can memmove from them |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
91 pos = b2 + bl |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
92 m.seek(pos) |
34435
5326e4ef1dab
style: never put multiple statements on one line
Alex Gaynor <agaynor@mozilla.com>
parents:
32512
diff
changeset
|
93 for p in bins: |
5326e4ef1dab
style: never put multiple statements on one line
Alex Gaynor <agaynor@mozilla.com>
parents:
32512
diff
changeset
|
94 m.write(p) |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
95 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
96 for plen in plens: |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
97 # if our list gets too long, execute it |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
98 if len(frags) > 128: |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
99 b2, b1 = b1, b2 |
28589
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
100 frags = [_collect(m, b1, frags)] |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
101 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
102 new = [] |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
103 end = pos + plen |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
104 last = 0 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
105 while pos < end: |
7775
5280c39778b6
pure/mpatch: use StringIO instead of mmap (issue1493)
Martin Geisler <mg@daimi.au.dk>
parents:
7699
diff
changeset
|
106 m.seek(pos) |
28782
f736f98e16ca
mpatch: unify mpatchError (issue5182)
timeless <timeless@mozdev.org>
parents:
28589
diff
changeset
|
107 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
108 p1, p2, l = struct.unpack(b">lll", m.read(12)) |
28782
f736f98e16ca
mpatch: unify mpatchError (issue5182)
timeless <timeless@mozdev.org>
parents:
28589
diff
changeset
|
109 except struct.error: |
51741
d748fd2647f8
pure: stringify builtin exception messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
49599
diff
changeset
|
110 raise mpatchError("patch cannot be decoded") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
111 _pull(new, frags, p1 - last) # what didn't change |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
112 _pull([], frags, p2 - p1) # what got deleted |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
113 new.append((l, pos + 12)) # what got added |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
114 pos += l + 12 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
115 last = p2 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
116 frags.extend(reversed(new)) # what was left at the end |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
117 |
28589
c4c7be9f0554
mpatch: move collect() to module level
Augie Fackler <augie@google.com>
parents:
28588
diff
changeset
|
118 t = _collect(m, b2, frags) |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
119 |
7775
5280c39778b6
pure/mpatch: use StringIO instead of mmap (issue1493)
Martin Geisler <mg@daimi.au.dk>
parents:
7699
diff
changeset
|
120 m.seek(t[1]) |
5280c39778b6
pure/mpatch: use StringIO instead of mmap (issue1493)
Martin Geisler <mg@daimi.au.dk>
parents:
7699
diff
changeset
|
121 return m.read(t[0]) |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
122 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
123 |
49599
94a797032fc4
typing: add type hints to mpatch implementations
Matt Harbison <matt_harbison@yahoo.com>
parents:
48875
diff
changeset
|
124 def patchedsize(orig: int, delta: bytes) -> int: |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
125 outlen, last, bin = 0, 0, 0 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
126 binend = len(delta) |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
127 data = 12 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
128 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
129 while data <= binend: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
36958
diff
changeset
|
130 decode = delta[bin : bin + 12] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
131 start, end, length = struct.unpack(b">lll", decode) |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
132 if start > end: |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
133 break |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
134 bin = data + length |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
135 data = bin + 12 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
136 outlen += start - last |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
137 last = end |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
138 outlen += length |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
139 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
140 if bin != binend: |
51741
d748fd2647f8
pure: stringify builtin exception messages
Matt Harbison <matt_harbison@yahoo.com>
parents:
49599
diff
changeset
|
141 raise mpatchError("patch cannot be decoded") |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
142 |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
143 outlen += orig - last |
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
144 return outlen |