Mercurial > hg
view mercurial/scmwindows.py @ 52059:b332ae615714
merge: improve working-copy mtime race handling
Explanations inline. This also makes use of `make_mtime_reliable`, which
unifies our mtime raciness logic from the status.
On top of this, this fixes the handling of the pure dirstate status to better
catch racy status, as we've been doing in Rust for a long time now.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Wed, 16 Oct 2024 19:14:30 +0200 |
parents | f4733654f144 |
children |
line wrap: on
line source
from __future__ import annotations import os import winreg # pytype: disable=import-error from typing import ( List, TYPE_CHECKING, Tuple, ) from . import ( encoding, pycompat, util, win32, ) if TYPE_CHECKING: from . import ui as uimod # MS-DOS 'more' is the only pager available by default on Windows. fallbackpager = b'more' def systemrcpath() -> List[bytes]: '''return default os-specific hgrc search path''' rcpath = [] filename = win32.executablepath() # Use mercurial.ini found in directory with hg.exe progrc = os.path.join(os.path.dirname(filename), b'mercurial.ini') rcpath.append(progrc) def _processdir(progrcd: bytes) -> None: if os.path.isdir(progrcd): for f, kind in sorted(util.listdir(progrcd)): if f.endswith(b'.rc'): rcpath.append(os.path.join(progrcd, f)) # Use hgrc.d found in directory with hg.exe _processdir(os.path.join(os.path.dirname(filename), b'hgrc.d')) # 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) # next look for a system rcpath in the registry value = util.lookupreg( # pytype: disable=module-attr b'SOFTWARE\\Mercurial', None, winreg.HKEY_LOCAL_MACHINE # pytype: enable=module-attr ) 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) else: _processdir(p) return rcpath def userrcpath() -> List[bytes]: '''return os-specific hgrc search path to the user dir''' home = _legacy_expanduser(b'~') path = [os.path.join(home, b'mercurial.ini'), os.path.join(home, b'.hgrc')] userprofile = encoding.environ.get(b'USERPROFILE') if userprofile and userprofile != home: path.append(os.path.join(userprofile, b'mercurial.ini')) path.append(os.path.join(userprofile, b'.hgrc')) return path def _legacy_expanduser(path: bytes) -> bytes: """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:] def termsize(ui: "uimod.ui") -> Tuple[int, int]: return win32.termsize()