scmwindows.py
116 lines
| 3.5 KiB
| text/x-python
|
PythonLexer
/ mercurial / scmwindows.py
Kevin Bullock
|
r18690 | import os | ||
Matt Harbison
|
r50704 | import winreg # pytype: disable=import-error | ||
Gregory Szorc
|
r27481 | |||
Matt Harbison
|
r50703 | from typing import ( | ||
List, | ||||
Tuple, | ||||
) | ||||
Gregory Szorc
|
r27481 | from . import ( | ||
Pulkit Goyal
|
r30637 | encoding, | ||
Pulkit Goyal
|
r30612 | pycompat, | ||
Gregory Szorc
|
r27481 | util, | ||
Yuya Nishihara
|
r30309 | win32, | ||
Gregory Szorc
|
r27481 | ) | ||
Kevin Bullock
|
r18690 | |||
Matt Harbison
|
r50703 | if pycompat.TYPE_CHECKING: | ||
from . import ui as uimod | ||||
Yuya Nishihara
|
r32078 | # MS-DOS 'more' is the only pager available by default on Windows. | ||
Augie Fackler
|
r43347 | fallbackpager = b'more' | ||
Yuya Nishihara
|
r32078 | |||
Augie Fackler
|
r43345 | |||
Matt Harbison
|
r50703 | def systemrcpath() -> List[bytes]: | ||
Kevin Bullock
|
r18690 | '''return default os-specific hgrc search path''' | ||
rcpath = [] | ||||
Yuya Nishihara
|
r37113 | filename = win32.executablepath() | ||
Kevin Bullock
|
r18690 | # Use mercurial.ini found in directory with hg.exe | ||
Augie Fackler
|
r43347 | progrc = os.path.join(os.path.dirname(filename), b'mercurial.ini') | ||
Mads Kiilerich
|
r26625 | rcpath.append(progrc) | ||
Matt Harbison
|
r44377 | |||
Matt Harbison
|
r50703 | def _processdir(progrcd: bytes) -> None: | ||
Matt Harbison
|
r44377 | if os.path.isdir(progrcd): | ||
Martin von Zweigbergk
|
r46428 | for f, kind in sorted(util.listdir(progrcd)): | ||
Matt Harbison
|
r44377 | if f.endswith(b'.rc'): | ||
rcpath.append(os.path.join(progrcd, f)) | ||||
Kevin Bullock
|
r18690 | # Use hgrc.d found in directory with hg.exe | ||
Matt Harbison
|
r44377 | _processdir(os.path.join(os.path.dirname(filename), b'hgrc.d')) | ||
Matt Harbison
|
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
|
r44375 | # next look for a system rcpath in the registry | ||
Augie Fackler
|
r43345 | value = util.lookupreg( | ||
Matt Harbison
|
r49843 | # pytype: disable=module-attr | ||
b'SOFTWARE\\Mercurial', | ||||
None, | ||||
winreg.HKEY_LOCAL_MACHINE | ||||
# pytype: enable=module-attr | ||||
Augie Fackler
|
r43345 | ) | ||
Matt Harbison
|
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
|
r44377 | else: | ||
_processdir(p) | ||||
Kevin Bullock
|
r18690 | return rcpath | ||
Augie Fackler
|
r43345 | |||
Matt Harbison
|
r50703 | def userrcpath() -> List[bytes]: | ||
Kevin Bullock
|
r18690 | '''return os-specific hgrc search path to the user dir''' | ||
Matt Harbison
|
r46709 | home = _legacy_expanduser(b'~') | ||
Augie Fackler
|
r43347 | path = [os.path.join(home, b'mercurial.ini'), os.path.join(home, b'.hgrc')] | ||
userprofile = encoding.environ.get(b'USERPROFILE') | ||||
Mads Kiilerich
|
r22583 | if userprofile and userprofile != home: | ||
Augie Fackler
|
r43347 | path.append(os.path.join(userprofile, b'mercurial.ini')) | ||
path.append(os.path.join(userprofile, b'.hgrc')) | ||||
Kevin Bullock
|
r18690 | return path | ||
Yuya Nishihara
|
r30309 | |||
Augie Fackler
|
r43345 | |||
Matt Harbison
|
r50703 | def _legacy_expanduser(path: bytes) -> bytes: | ||
Matt Harbison
|
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
|
r50703 | def termsize(ui: "uimod.ui") -> Tuple[int, int]: | ||
Yuya Nishihara
|
r30314 | return win32.termsize() | ||