Mercurial > hg
view tests/test-bdiff.py @ 30520:4338f87dbf6f
dispatch: move part of callcatch to scmutil
Per discussion at 39149b6036e6 [1], we need "callcatch" in worker.py. Move
it to scmutil.py to avoid cycles.
Note that dispatch's callcatch handles some additional high-level exceptions
related to config parsing, and commands. Moving them to scmutil will make
scmutil depend on "commands" or require "_formatparse" and "_getsimilar"
(and "difflib") to be moved as well. In the worker use-case, it is forked
when config and commands are fully loaded. So it should not care about those
exceptions.
[1]: https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-August/087116.html
author | Jun Wu <quark@fb.com> |
---|---|
date | Thu, 24 Nov 2016 00:48:40 +0000 |
parents | 96f2f50d923f |
children | 1b393a93a7df |
line wrap: on
line source
from __future__ import absolute_import, print_function import struct from mercurial import ( bdiff, mpatch, ) def test1(a, b): d = bdiff.bdiff(a, b) c = a if d: c = mpatch.patches(a, [d]) if c != b: print("bad diff+patch result from\n %r to\n %r:" % (a, b)) print("bdiff: %r" % d) print("patched: %r" % c[:200]) def test(a, b): print("test", repr(a), repr(b)) test1(a, b) test1(b, a) test("a\nc\n\n\n\n", "a\nb\n\n\n") test("a\nb\nc\n", "a\nc\n") test("", "") test("a\nb\nc", "a\nb\nc") test("a\nb\nc\nd\n", "a\nd\n") test("a\nb\nc\nd\n", "a\nc\ne\n") test("a\nb\nc\n", "a\nc\n") test("a\n", "c\na\nb\n") test("a\n", "") test("a\n", "b\nc\n") test("a\n", "c\na\n") test("", "adjfkjdjksdhfksj") test("", "ab") test("", "abc") test("a", "a") test("ab", "ab") test("abc", "abc") test("a\n", "a\n") test("a\nb", "a\nb") #issue1295 def showdiff(a, b): print('showdiff(\n %r,\n %r):' % (a, b)) bin = bdiff.bdiff(a, b) pos = 0 q = 0 while pos < len(bin): p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12]) pos += 12 if p1: print('', repr(a[q:p1])) print('', p1, p2, repr(a[p1:p2]), '->', repr(bin[pos:pos + l])) pos += l q = p2 if q < len(a): print('', repr(a[q:])) showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\nx\n\nz\n") showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n") # we should pick up abbbc. rather than bc.de as the longest match showdiff("a\nb\nb\nb\nc\n.\nd\ne\n.\nf\n", "a\nb\nb\na\nb\nb\nb\nc\n.\nb\nc\n.\nd\ne\nf\n") print("done") def testfixws(a, b, allws): c = bdiff.fixws(a, allws) if c != b: print("*** fixws", repr(a), repr(b), allws) print("got:") print(repr(c)) testfixws(" \ta\r b\t\n", "ab\n", 1) testfixws(" \ta\r b\t\n", " a b\n", 0) testfixws("", "", 1) testfixws("", "", 0) print("done") print("Nice diff for a trivial change:") showdiff( ''.join('<%s\n-\n' % i for i in range(5)), ''.join('>%s\n-\n' % i for i in range(5))) print("Diff 1 to 3 lines - preference for appending:") showdiff('a\n', 'a\n' * 3) print("Diff 1 to 5 lines - preference for appending:") showdiff('a\n', 'a\n' * 5) print("Diff 3 to 1 lines - preference for removing trailing lines:") showdiff('a\n' * 3, 'a\n') print("Diff 5 to 1 lines - preference for removing trailing lines:") showdiff('a\n' * 5, 'a\n')