##// END OF EJS Templates
statichttprepo: fix `httprangereader.read()` for py3...
statichttprepo: fix `httprangereader.read()` for py3 It looks like there were a bunch of problems, not all of them py3 related: 1) The signature of BinaryIO.read() is -1, not None 2) The `end` variable can't be bytes and interpolate into str with "%s" 3) The `end` variable can't be an int and interpolate into str with "%s" 4) The result slicing could be out of bounds if more is requested than returned I guess if somebody would have called `read(-1)` (either directly or because a wrapper defaults to that), it wouldn't have been handled correctly. The fact that it is a valid value meaning to read everything requires some additional changes later in the method around when it slices the byte string that was read, but that seems to have already been broken.

File last commit:

r52756:f4733654 default
r52792:e26a0856 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