Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/cffi/bdiff.py @ 32545:0e8b0b9a7acc
cffi: split modules from pure
The copyright lines are updated per change history.
cffi/osutil.py isn't tested since I have no access to OS X machine right now,
sorry.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Tue, 02 May 2017 21:15:31 +0900 |
parents | mercurial/pure/bdiff.py@2dcb3d52ef41 |
children | 25b37900d6e0 |
rev | line source |
---|---|
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
1 # bdiff.py - CFFI implementation of bdiff.c |
7703
9044d3567f6d
pure Python implementation of bdiff.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
2 # |
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
3 # Copyright 2016 Maciej Fijalkowski <fijall@gmail.com> |
7703
9044d3567f6d
pure Python implementation of bdiff.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:
7944
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. |
7703
9044d3567f6d
pure Python implementation of bdiff.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
7 |
27335
c4e3ff497f89
bdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
15530
diff
changeset
|
8 from __future__ import absolute_import |
c4e3ff497f89
bdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
15530
diff
changeset
|
9 |
c4e3ff497f89
bdiff: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
15530
diff
changeset
|
10 import struct |
7944
e9b48afd0e78
pure/bdiff: fix circular import
Matt Mackall <mpm@selenic.com>
parents:
7703
diff
changeset
|
11 |
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
12 from ..pure.bdiff import * |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
13 from . import _bdiff |
7703
9044d3567f6d
pure Python implementation of bdiff.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
14 |
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
15 ffi = _bdiff.ffi |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
16 lib = _bdiff.lib |
7703
9044d3567f6d
pure Python implementation of bdiff.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
17 |
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
18 if True: |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
19 if True: |
29844
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
20 def blocks(sa, sb): |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
21 a = ffi.new("struct bdiff_line**") |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
22 b = ffi.new("struct bdiff_line**") |
30042
d24e03da24b5
lazymanifest: write a more efficient, pypy friendly version of lazymanifest
Maciej Fijalkowski <fijall@gmail.com>
parents:
29845
diff
changeset
|
23 ac = ffi.new("char[]", str(sa)) |
d24e03da24b5
lazymanifest: write a more efficient, pypy friendly version of lazymanifest
Maciej Fijalkowski <fijall@gmail.com>
parents:
29845
diff
changeset
|
24 bc = ffi.new("char[]", str(sb)) |
29845
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
25 l = ffi.new("struct bdiff_hunk*") |
29844
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
26 try: |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
27 an = lib.bdiff_splitlines(ac, len(sa), a) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
28 bn = lib.bdiff_splitlines(bc, len(sb), b) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
29 if not a[0] or not b[0]: |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
30 raise MemoryError |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
31 count = lib.bdiff_diff(a[0], an, b[0], bn, l) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
32 if count < 0: |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
33 raise MemoryError |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
34 rl = [None] * count |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
35 h = l.next |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
36 i = 0 |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
37 while h: |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
38 rl[i] = (h.a1, h.a2, h.b1, h.b2) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
39 h = h.next |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
40 i += 1 |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
41 finally: |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
42 lib.free(a[0]) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
43 lib.free(b[0]) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
44 lib.bdiff_freehunks(l.next) |
a8933d992a71
bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
28389
diff
changeset
|
45 return rl |
29845
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
46 |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
47 def bdiff(sa, sb): |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
48 a = ffi.new("struct bdiff_line**") |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
49 b = ffi.new("struct bdiff_line**") |
30042
d24e03da24b5
lazymanifest: write a more efficient, pypy friendly version of lazymanifest
Maciej Fijalkowski <fijall@gmail.com>
parents:
29845
diff
changeset
|
50 ac = ffi.new("char[]", str(sa)) |
d24e03da24b5
lazymanifest: write a more efficient, pypy friendly version of lazymanifest
Maciej Fijalkowski <fijall@gmail.com>
parents:
29845
diff
changeset
|
51 bc = ffi.new("char[]", str(sb)) |
29845
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
52 l = ffi.new("struct bdiff_hunk*") |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
53 try: |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
54 an = lib.bdiff_splitlines(ac, len(sa), a) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
55 bn = lib.bdiff_splitlines(bc, len(sb), b) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
56 if not a[0] or not b[0]: |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
57 raise MemoryError |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
58 count = lib.bdiff_diff(a[0], an, b[0], bn, l) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
59 if count < 0: |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
60 raise MemoryError |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
61 rl = [] |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
62 h = l.next |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
63 la = lb = 0 |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
64 while h: |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
65 if h.a1 != la or h.b1 != lb: |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
66 lgt = (b[0] + h.b1).l - (b[0] + lb).l |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
67 rl.append(struct.pack(">lll", (a[0] + la).l - a[0].l, |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
68 (a[0] + h.a1).l - a[0].l, lgt)) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
69 rl.append(str(ffi.buffer((b[0] + lb).l, lgt))) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
70 la = h.a2 |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
71 lb = h.b2 |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
72 h = h.next |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
73 |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
74 finally: |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
75 lib.free(a[0]) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
76 lib.free(b[0]) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
77 lib.bdiff_freehunks(l.next) |
1ea77b75d266
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com>
parents:
29844
diff
changeset
|
78 return "".join(rl) |