##// END OF EJS Templates
interfaces: mark a few dirstate methods abstract...
interfaces: mark a few dirstate methods abstract I'm not sure what's going on here, but when enabling pytype checking on this package, it spits out the following errors: File "/mnt/c/Users/Matt/hg/mercurial/interfaces/dirstate.py", line 136, in changing_parents: bad return type [bad-return-type] Expected: Iterator Actually returned: None Attributes of protocol Iterator are not implemented on None: __next__ File "/mnt/c/Users/Matt/hg/mercurial/interfaces/dirstate.py", line 145, in changing_files: bad return type [bad-return-type] Expected: Iterator Actually returned: None Attributes of protocol Iterator are not implemented on None: __next__ I guess technically that's true, because these methods only have a doc comment, and don't explicitly return something or unconditionally raise an error. The strange thing is that both before and after this change, the *.pyi file that is generated is unchanged, and contains: def changing_files(self, repo) -> contextlib._GeneratorContextManager: ... def changing_parents(self, repo) -> contextlib._GeneratorContextManager: ... I'm not sure if the `@abstractmethod` should be the most inner or most outer decoration. We'll roll the dice with being the innermost, because that's how `@abstractproperty` says it should be used in conjunction with `@property`. We should probably make all of the methods without an actual body abstract, like was done for some `mercurial.wireprototypes` classes in fd200f5bcaea. But let's hold off for now and do that enmass later.

File last commit:

r52756:f4733654 default
r53328:2c8c46c3 default
Show More
scmwindows.py
119 lines | 3.5 KiB | text/x-python | PythonLexer
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 import os
Matt Harbison
windows: drop some py2 registry module importing...
r50704 import winreg # pytype: disable=import-error
Gregory Szorc
scmwindows: use absolute_import
r27481
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 from typing import (
List,
pytype: import typing directly...
r52178 TYPE_CHECKING,
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 Tuple,
)
Gregory Szorc
scmwindows: use absolute_import
r27481 from . import (
Pulkit Goyal
py3: replace os.environ with encoding.environ (part 4 of 5)
r30637 encoding,
Pulkit Goyal
py3: replace os.pathsep with pycompat.ospathsep...
r30612 pycompat,
Gregory Szorc
scmwindows: use absolute_import
r27481 util,
Yuya Nishihara
scmutil: move util.termwidth()...
r30309 win32,
Gregory Szorc
scmwindows: use absolute_import
r27481 )
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690
pytype: import typing directly...
r52178 if TYPE_CHECKING:
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 from . import ui as uimod
Yuya Nishihara
pager: use less as a fallback on Unix...
r32078 # MS-DOS 'more' is the only pager available by default on Windows.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fallbackpager = b'more'
Yuya Nishihara
pager: use less as a fallback on Unix...
r32078
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 def systemrcpath() -> List[bytes]:
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 '''return default os-specific hgrc search path'''
rcpath = []
Yuya Nishihara
rcutil: directly call win32.executablepath()...
r37113 filename = win32.executablepath()
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 # Use mercurial.ini found in directory with hg.exe
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 progrc = os.path.join(os.path.dirname(filename), b'mercurial.ini')
Mads Kiilerich
windows: read all global config files, not just the first (issue4491) (BC)...
r26625 rcpath.append(progrc)
Matt Harbison
windows: factor the hgrc directory scan into a function...
r44377
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 def _processdir(progrcd: bytes) -> None:
Matt Harbison
windows: factor the hgrc directory scan into a function...
r44377 if os.path.isdir(progrcd):
Martin von Zweigbergk
config: read system hgrc in lexicographical order...
r46428 for f, kind in sorted(util.listdir(progrcd)):
Matt Harbison
windows: factor the hgrc directory scan into a function...
r44377 if f.endswith(b'.rc'):
rcpath.append(os.path.join(progrcd, f))
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 # Use hgrc.d found in directory with hg.exe
Matt Harbison
windows: factor the hgrc directory scan into a function...
r44377 _processdir(os.path.join(os.path.dirname(filename), b'hgrc.d'))
Matt Harbison
windows: add a global equivalent to /etc/mercurial for *.rc processing...
r44403 # treat a PROGRAMDATA directory as equivalent to /etc/mercurial
programdata = encoding.environ.get(b'PROGRAMDATA')
if programdata:
programdata = os.path.join(programdata, b'Mercurial')
_processdir(os.path.join(programdata, b'hgrc.d'))
ini = os.path.join(programdata, b'mercurial.ini')
if os.path.isfile(ini):
rcpath.append(ini)
ini = os.path.join(programdata, b'hgrc')
if os.path.isfile(ini):
rcpath.append(ini)
Matt Harbison
windows: clarify a comment about the hgrc search path...
r44375 # next look for a system rcpath in the registry
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345 value = util.lookupreg(
Matt Harbison
pytype: disable a few errors about Windows specific module attributes...
r49843 # pytype: disable=module-attr
b'SOFTWARE\\Mercurial',
None,
winreg.HKEY_LOCAL_MACHINE
# pytype: enable=module-attr
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345 )
Matt Harbison
windows: don't return early from building the hgrc search path...
r44376 if value and isinstance(value, bytes):
value = util.localpath(value)
for p in value.split(pycompat.ospathsep):
if p.lower().endswith(b'mercurial.ini'):
rcpath.append(p)
Matt Harbison
windows: factor the hgrc directory scan into a function...
r44377 else:
_processdir(p)
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 return rcpath
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 def userrcpath() -> List[bytes]:
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 '''return os-specific hgrc search path to the user dir'''
Matt Harbison
windows: continue looking at `%HOME%` for user config files with py3.8+...
r46709 home = _legacy_expanduser(b'~')
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 path = [os.path.join(home, b'mercurial.ini'), os.path.join(home, b'.hgrc')]
userprofile = encoding.environ.get(b'USERPROFILE')
Mads Kiilerich
config: don't read the same config file twice...
r22583 if userprofile and userprofile != home:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 path.append(os.path.join(userprofile, b'mercurial.ini'))
path.append(os.path.join(userprofile, b'.hgrc'))
Kevin Bullock
scmutil: split platform-specific bits into their own modules...
r18690 return path
Yuya Nishihara
scmutil: move util.termwidth()...
r30309
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 def _legacy_expanduser(path: bytes) -> bytes:
Matt Harbison
windows: continue looking at `%HOME%` for user config files with py3.8+...
r46709 """Expand ~ and ~user constructs in the pre 3.8 style"""
# Python 3.8+ changed the expansion of '~' from HOME to USERPROFILE. See
# https://bugs.python.org/issue36264. It also seems to capitalize the drive
# letter, as though it was processed through os.path.realpath().
if not path.startswith(b'~'):
return path
i, n = 1, len(path)
while i < n and path[i] not in b'\\/':
i += 1
if b'HOME' in encoding.environ:
userhome = encoding.environ[b'HOME']
elif b'USERPROFILE' in encoding.environ:
userhome = encoding.environ[b'USERPROFILE']
elif b'HOMEPATH' not in encoding.environ:
return path
else:
try:
drive = encoding.environ[b'HOMEDRIVE']
except KeyError:
drive = b''
userhome = os.path.join(drive, encoding.environ[b'HOMEPATH'])
if i != 1: # ~user
userhome = os.path.join(os.path.dirname(userhome), path[1:i])
return userhome + path[i:]
Matt Harbison
typing: add type hints to the platform specific scm modules...
r50703 def termsize(ui: "uimod.ui") -> Tuple[int, int]:
Yuya Nishihara
scmutil: extend termwidth() to return terminal height, renamed to termsize()...
r30314 return win32.termsize()