Mercurial > hg
view mercurial/scmposix.py @ 50757:19108906abaf stable
extensions: imp module is removed in Python 3.12 - use importlib to load files
imp has been deprecated for a long time, and has finally been removed in Python
3.12 .
imp was only used for loading extensions that has been specified with direct
.py path or path to a package directory. The same use cases can be achieved
quite simple with importlib, , possiby with small changes in corner cases with
undefined behaviour, such as extensions without .py source.
There might also be corner cases and undefined behaviour around use of
sys.modules and reloading.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Wed, 28 Jun 2023 14:23:13 +0200 |
parents | 7a4143428db7 |
children | 18c8c18993f0 |
line wrap: on
line source
import array import errno import fcntl import os import sys from typing import ( List, Tuple, ) from .pycompat import getattr from . import ( encoding, pycompat, util, ) if pycompat.TYPE_CHECKING: from . import ui as uimod # BSD 'more' escapes ANSI color sequences by default. This can be disabled by # $MORE variable, but there's no compatible option with Linux 'more'. Given # OS X is widely used and most modern Unix systems would have 'less', setting # 'less' as the default seems reasonable. fallbackpager = b'less' def _rcfiles(path: bytes) -> List[bytes]: rcs = [os.path.join(path, b'hgrc')] rcdir = os.path.join(path, b'hgrc.d') try: rcs.extend( [ os.path.join(rcdir, f) for f, kind in sorted(util.listdir(rcdir)) if f.endswith(b".rc") ] ) except OSError: pass return rcs def systemrcpath() -> List[bytes]: path = [] if pycompat.sysplatform == b'plan9': root = b'lib/mercurial' else: root = b'etc/mercurial' # old mod_python does not set sys.argv if len(getattr(sys, 'argv', [])) > 0: p = os.path.dirname(os.path.dirname(pycompat.sysargv[0])) if p != b'/': path.extend(_rcfiles(os.path.join(p, root))) path.extend(_rcfiles(b'/' + root)) return path def userrcpath() -> List[bytes]: if pycompat.sysplatform == b'plan9': return [encoding.environ[b'home'] + b'/lib/hgrc'] elif pycompat.isdarwin: return [os.path.expanduser(b'~/.hgrc')] else: confighome = encoding.environ.get(b'XDG_CONFIG_HOME') if confighome is None or not os.path.isabs(confighome): confighome = os.path.expanduser(b'~/.config') return [ os.path.expanduser(b'~/.hgrc'), os.path.join(confighome, b'hg', b'hgrc'), ] def termsize(ui: "uimod.ui") -> Tuple[int, int]: try: import termios TIOCGWINSZ = termios.TIOCGWINSZ # unavailable on IRIX (issue3449) except (AttributeError, ImportError): return 80, 24 for dev in (ui.ferr, ui.fout, ui.fin): try: try: fd = dev.fileno() except AttributeError: continue if not os.isatty(fd): continue arri = fcntl.ioctl(fd, TIOCGWINSZ, b'\0' * 8) height, width = array.array('h', arri)[:2] if width > 0 and height > 0: return width, height except ValueError: pass except IOError as e: if e.errno == errno.EINVAL: pass else: raise return 80, 24