Mercurial > hg > mercurial-source
view mercurial/cffi/mpatch.py @ 33448:98c2b44bdf9a
color: enable ANSI support on Windows 10
This will display color if "color.mode=ansi", and default to 'ansi' if the mode
is set to 'auto'. The 'debugcolor' command also reflects this policy.
Previously, "color.mode=ansi" on Windows printed jibberish around the normal
text. Using ANSI color is better, as it avoids the normal loss of color when
the default pager is enabled on Windows. See also issue5570.
When the underlying function fails (e.g. when run on older Windows), 'auto'
still falls back to 'win32'. Apparently, Microsoft originally had this feature
turned on by default, and then made it opt-in[1]. Therefore, not enabling it
unconditionally seems safer. Instead, only do it after processing the existing
check for support in a Unix-like environment.
[1] https://github.com/symfony/symfony/issues/17499#issuecomment-243481052
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Mon, 22 May 2017 22:20:38 -0400 (2017-05-23) |
parents | 25b37900d6e0 |
children | 857876ebaed4 |
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