Mercurial > hg
view mercurial/cffi/mpatch.py @ 41930:cbdd2b56d4c3
copies: add test that makes both the merging csets dirty and run w/o error
This series of patches is to cover a case in fullcopytracing algorithms
where both the merging csets are not descendant of merge base.
In this algorithm we call a merging cset "dirty" if that cset is not the
descendant of merge base. That said, added test in this patch cover case
when both the merging csets are "dirty".
Actually this case of "both dirty" was encountered by Pulkit when he was
working on content-divergence where it is possible that both the csets
are not descendant of merging base.
For reference you can look into: https://phab.mercurial-scm.org/D3896
As this test run fine without any error and correctly traced the copies, I
added this test to make sure that it doesn't break even after I will modify
some code in next patches to fix an error. Next patch adds the tests where
this algorithm throws an error for the same case of "both dirty".
Differential Revision: https://phab.mercurial-scm.org/D5961
author | Sushil khanchi <sushilkhanchi97@gmail.com> |
---|---|
date | Thu, 14 Feb 2019 17:11:35 +0530 |
parents | 857876ebaed4 |
children | 2372284d9457 |
line wrap: on
line source
# mpatch.py - CFFI implementation of mpatch.c # # Copyright 2016 Maciej Fijalkowski <fijall@gmail.com> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import absolute_import from ..pure.mpatch import * from ..pure.mpatch import mpatchError # silence pyflakes from . import _mpatch ffi = _mpatch.ffi lib = _mpatch.lib @ffi.def_extern() def cffi_get_next_item(arg, pos): all, bins = ffi.from_handle(arg) container = ffi.new("struct mpatch_flist*[1]") to_pass = ffi.new("char[]", str(bins[pos])) all.append(to_pass) r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container) if r < 0: return ffi.NULL return container[0] def patches(text, bins): lgt = len(bins) all = [] if not lgt: return text arg = (all, bins) patch = lib.mpatch_fold(ffi.new_handle(arg), lib.cffi_get_next_item, 0, lgt) if not patch: raise mpatchError("cannot decode chunk") outlen = lib.mpatch_calcsize(len(text), patch) if outlen < 0: lib.mpatch_lfree(patch) raise mpatchError("inconsistency detected") buf = ffi.new("char[]", outlen) if lib.mpatch_apply(buf, text, len(text), patch) < 0: lib.mpatch_lfree(patch) raise mpatchError("error applying patches") res = ffi.buffer(buf, outlen)[:] lib.mpatch_lfree(patch) return res