##// END OF EJS Templates
contrib: add a set of scripts to run pytype in Docker...
contrib: add a set of scripts to run pytype in Docker Having a simple way to run pytype for developers can massively shorten development cycle. Using the same Docker image and scripts that we use on our CI guarantees that the result achieved locally will be very similar to (if not the same as) the output of our CI runners. Things to note: the Dockerfile needs to do a little dance around user permissions inside /home/ci-runner/ because: - on one hand, creating new files on the host (e.g. .pyi files inside .pytype/) should use host user's uid and gid - on the other hand, when we run the image as uid:gid of host user, it needs to be able to read/execute files inside the image that are owned by ci-runner Since local user's uid might be different from ci-runner's uid, we execute this very broad chmod command inside /home/ci-runner/, but then run the image as the host user's uid:gid. There might be a better way to do this.

File last commit:

r52178:9d372155 default
r52200:87bfd170 default
Show More
scmwindows.py
117 lines | 3.5 KiB | text/x-python | PythonLexer
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()