##// END OF EJS Templates
compat: initialize LC_CTYPE locale on all Python versions and platforms...
compat: initialize LC_CTYPE locale on all Python versions and platforms Previously, the LC_CTYPE locale was not initialized according to user settings on all Python versions (e.g. never on Python 2) and platforms (e.g. not on some Python < 3.8 on Windows). This broke e.g. non-ASCII filenames passed to the Subversion bindings on Python 2, resulting in error messages like "file:///tmp/a%C3%A4 does not look like a Subversion repository to libsvn version 1.14.0". The following command could be used to test this functionality. Adding it to the test suite would be pointless, as the locale is always set to "C" during test runs. @command(b'check_initial_codeset', norepo=True) def check_initial_codeset(ui): codeset1 = locale.nl_langinfo(locale.CODESET) locale.setlocale(locale.LC_ALL, '') codeset2 = locale.nl_langinfo(locale.CODESET) assert codeset1 == codeset2

File last commit:

r43347:687b865b default
r45538:a25343d1 default
Show More
mpatch.py
49 lines | 1.4 KiB | text/x-python | PythonLexer
Yuya Nishihara
cffi: split modules from pure...
r32512 # 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
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 @ffi.def_extern()
def cffi_get_next_item(arg, pos):
all, bins = ffi.from_handle(arg)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 container = ffi.new(b"struct mpatch_flist*[1]")
to_pass = ffi.new(b"char[]", str(bins[pos]))
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 all.append(to_pass)
r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container)
if r < 0:
return ffi.NULL
return container[0]
Yuya Nishihara
cffi: split modules from pure...
r32512
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 def patches(text, bins):
lgt = len(bins)
all = []
if not lgt:
return text
arg = (all, bins)
Augie Fackler
formatting: blacken the codebase...
r43346 patch = lib.mpatch_fold(ffi.new_handle(arg), lib.cffi_get_next_item, 0, lgt)
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 if not patch:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise mpatchError(b"cannot decode chunk")
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 outlen = lib.mpatch_calcsize(len(text), patch)
if outlen < 0:
lib.mpatch_lfree(patch)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise mpatchError(b"inconsistency detected")
buf = ffi.new(b"char[]", outlen)
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 if lib.mpatch_apply(buf, text, len(text), patch) < 0:
lib.mpatch_lfree(patch)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise mpatchError(b"error applying patches")
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 res = ffi.buffer(buf, outlen)[:]
lib.mpatch_lfree(patch)
return res