##// END OF EJS Templates
typing: create an @overload of `phasecache` ctor to handle the copy case...
typing: create an @overload of `phasecache` ctor to handle the copy case In `phasecache.copy()`, it calls `self.__class__(None, None, _load=False)`, but the constuctor is typed to take a non-None repository. For the `_load=False` case, all args are ignored (and the copy function itself populates the attrs on the new object), so this isn't an error. For the default `_load=True` case, it needs a non-None repository. This is the simplest way to handle that duality. The reason this wasn't being detected is because pytype is confused by the interface decorators on the `localrepository` class, and is inferring the whole class as `Any`. (See 3e9a660b074a or c1d7ac70980b) Therefore, the type hint of `localrepo.localrepository` here was also effectively `Any`, which disabled the type checking entirely. This is the first foray into using `typing_extensions` to unlock future typing features. I think this is safe and reasonable because 1) it is only imported in the type checking phase (so no need to vendor our own copy), and 2) pytype has its own copy of `typing_extensions` bundled with it, so no need to alter the test environment. When run with a version of python that supports the symbol(s) natively, `typing_extensions` simply re-exports from `typing`, so there shouldn't be any future headaches with this.

File last commit:

r52685:472699b5 stable
r52704:673b07a1 default
Show More
mpatch.py
50 lines | 1.5 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.
Matt Harbison
typing: add type hints to mpatch implementations...
r50494 from typing import List
Yuya Nishihara
cffi: split modules from pure...
r32512 from ..pure.mpatch import *
from ..pure.mpatch import mpatchError # silence pyflakes
Matt Harbison
typing: disable import error warnings that are already handled...
r47543 from . import _mpatch # pytype: disable=import-error
Yuya Nishihara
cffi: split modules from pure...
r32512
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
Matt Harbison
typing: add type hints to mpatch implementations...
r50494 def patches(text: bytes, bins: List[bytes]) -> bytes:
Yuya Nishihara
cffi: remove superfluous "if True" blocks
r32513 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