Show More
@@ -9,8 +9,10 b' from __future__ import absolute_import' | |||
|
9 | 9 | |
|
10 | 10 | import struct |
|
11 | 11 | |
|
12 | from . import pycompat | |
|
12 | from . import policy, pycompat | |
|
13 | 13 | stringio = pycompat.stringio |
|
14 | modulepolicy = policy.policy | |
|
15 | policynocffi = policy.policynocffi | |
|
14 | 16 | |
|
15 | 17 | class mpatchError(Exception): |
|
16 | 18 | """error raised when a delta cannot be decoded |
@@ -125,3 +127,44 b' def patchedsize(orig, delta):' | |||
|
125 | 127 | |
|
126 | 128 | outlen += orig - last |
|
127 | 129 | return outlen |
|
130 | ||
|
131 | if modulepolicy not in policynocffi: | |
|
132 | try: | |
|
133 | from _mpatch_cffi import ffi, lib | |
|
134 | except ImportError: | |
|
135 | if modulepolicy == 'cffi': # strict cffi import | |
|
136 | raise | |
|
137 | else: | |
|
138 | @ffi.def_extern() | |
|
139 | def cffi_get_next_item(arg, pos): | |
|
140 | all, bins = ffi.from_handle(arg) | |
|
141 | container = ffi.new("struct mpatch_flist*[1]") | |
|
142 | to_pass = ffi.new("char[]", str(bins[pos])) | |
|
143 | all.append(to_pass) | |
|
144 | r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container) | |
|
145 | if r < 0: | |
|
146 | return ffi.NULL | |
|
147 | return container[0] | |
|
148 | ||
|
149 | def patches(text, bins): | |
|
150 | lgt = len(bins) | |
|
151 | all = [] | |
|
152 | if not lgt: | |
|
153 | return text | |
|
154 | arg = (all, bins) | |
|
155 | patch = lib.mpatch_fold(ffi.new_handle(arg), | |
|
156 | lib.cffi_get_next_item, 0, lgt) | |
|
157 | if not patch: | |
|
158 | raise mpatchError("cannot decode chunk") | |
|
159 | outlen = lib.mpatch_calcsize(len(text), patch) | |
|
160 | if outlen < 0: | |
|
161 | lib.mpatch_lfree(patch) | |
|
162 | raise mpatchError("inconsistency detected") | |
|
163 | buf = ffi.new("char[]", outlen) | |
|
164 | if lib.mpatch_apply(buf, text, len(text), patch) < 0: | |
|
165 | lib.mpatch_lfree(patch) | |
|
166 | raise mpatchError("error applying patches") | |
|
167 | res = ffi.buffer(buf, outlen)[:] | |
|
168 | lib.mpatch_lfree(patch) | |
|
169 | return res | |
|
170 |
@@ -318,7 +318,8 b' class hgbuildpy(build_py):' | |||
|
318 | 318 | if self.distribution.pure: |
|
319 | 319 | self.distribution.ext_modules = [] |
|
320 | 320 | elif self.distribution.cffi: |
|
321 | exts = [] | |
|
321 | import setup_mpatch_cffi | |
|
322 | exts = [setup_mpatch_cffi.ffi.distutils_extension()] | |
|
322 | 323 | # cffi modules go here |
|
323 | 324 | if sys.platform == 'darwin': |
|
324 | 325 | import setup_osutil_cffi |
General Comments 0
You need to be logged in to leave comments.
Login now