##// END OF EJS Templates
typing: make the localrepo classes known to pytype...
typing: make the localrepo classes known to pytype 9d4ad05bc91c and 1b17309cdaab both mentioned making `bundlerepository` and `unionrepository` subclass `localrepository` during the type checking phase, but that didn't apply to pytype in practice. See bcaa5d408657 and friends for how the zope interfaces confuse pytype, and end up converting the classes they decorate into `Any`. This commit is slightly more complex though, because `localrepository` has mixin classes applied to it when it is instantiated. Specifically, `RevlogFileStorage` is added, which adds `def file(f)` (which isn't defined on `localrepository`). Therefore a list of `localrepository` superclasses is provided during type checking to account for the mixins. Without this, the `bundlerepository` class gets flagged when it attempts to call its superclass implementation of `file()`. Note that pytype doesn't understand these mixin superclasses (it marks the superclass of `localrepository` as `Any`, because they are zope interfaces it doesn't understand), but that's enough to get it to not flag `bundlerepository`. PyCharm also stops flagging it as a missing function, though it seems like it is able to handle the zope interfaces.

File last commit:

r52756:f4733654 default
r52788:ee7e106b 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()