author | Yuya Nishihara <yuya@tcha.org> |
Tue, 02 May 2017 21:15:31 +0900 | |
changeset 32512 | 0e8b0b9a7acc |
parent 32506 | mercurial/pure/mpatch.py@2dcb3d52ef41 |
child 32513 | 25b37900d6e0 |
permissions | -rw-r--r-- |
32512
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
1 |
# mpatch.py - CFFI implementation of mpatch.c |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
2 |
# |
32512
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
3 |
# Copyright 2016 Maciej Fijalkowski <fijall@gmail.com> |
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 |
|
27337
9a17576103a4
mpatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16683
diff
changeset
|
8 |
from __future__ import absolute_import |
9a17576103a4
mpatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16683
diff
changeset
|
9 |
|
32512
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
10 |
from ..pure.mpatch import * |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
11 |
from ..pure.mpatch import mpatchError # silence pyflakes |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
12 |
from . import _mpatch |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
13 |
|
32512
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
14 |
ffi = _mpatch.ffi |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
15 |
lib = _mpatch.lib |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
16 |
|
32512
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
17 |
if True: |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32506
diff
changeset
|
18 |
if True: |
29695
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
19 |
@ffi.def_extern() |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
20 |
def cffi_get_next_item(arg, pos): |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
21 |
all, bins = ffi.from_handle(arg) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
22 |
container = ffi.new("struct mpatch_flist*[1]") |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
23 |
to_pass = ffi.new("char[]", str(bins[pos])) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
24 |
all.append(to_pass) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
25 |
r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
26 |
if r < 0: |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
27 |
return ffi.NULL |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
28 |
return container[0] |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
29 |
|
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
30 |
def patches(text, bins): |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
31 |
lgt = len(bins) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
32 |
all = [] |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
33 |
if not lgt: |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
34 |
return text |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
35 |
arg = (all, bins) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
36 |
patch = lib.mpatch_fold(ffi.new_handle(arg), |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
37 |
lib.cffi_get_next_item, 0, lgt) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
38 |
if not patch: |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
39 |
raise mpatchError("cannot decode chunk") |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
40 |
outlen = lib.mpatch_calcsize(len(text), patch) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
41 |
if outlen < 0: |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
42 |
lib.mpatch_lfree(patch) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
43 |
raise mpatchError("inconsistency detected") |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
44 |
buf = ffi.new("char[]", outlen) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
45 |
if lib.mpatch_apply(buf, text, len(text), patch) < 0: |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
46 |
lib.mpatch_lfree(patch) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
47 |
raise mpatchError("error applying patches") |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
48 |
res = ffi.buffer(buf, outlen)[:] |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
49 |
lib.mpatch_lfree(patch) |
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
50 |
return res |