##// END OF EJS Templates
repo-config: adjust "root" path for parsing shared config...
repo-config: adjust "root" path for parsing shared config That "root" argument is used to resolve relative path in the config. For a repository config it is expected to be the root of the working copy (the directory that contains the `.hg` directory). Before this patch, the config was loaded using the `.hg/` directory of the share source, this is not the right directory and would break in all cases. Instead we use the working copy directory of the share. This is not always good, if some relative path we pointing inside the source's `.hg`. However that is better than something plain wrong. Also this is the right answer for all path that refer to the actual working copy. Fixing this ambiguity is left as an exercises to a future developer. At least we no longer use a plain invalid value.

File last commit:

r52756:f4733654 default
r53319:8a52fd13 default
Show More
scmposix.py
103 lines | 2.6 KiB | text/x-python | PythonLexer
from __future__ import annotations
import array
import errno
import fcntl
import os
import sys
import typing
from typing import (
List,
Tuple,
)
from . import (
encoding,
pycompat,
util,
)
if typing.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']
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