##// END OF EJS Templates
procutils: don't try to get `.buffer` if sys.stdin is None...
procutils: don't try to get `.buffer` if sys.stdin is None While hunting down following test failure of test-chg.t on Python 3, I stumbled the case when `.buffer` is not available as sys.stdin is None. --- /home/pulkit/repo/hg-committed/tests/test-chg.t +++ /home/pulkit/repo/hg-committed/tests/test-chg.t.err @@ -203,7 +203,31 @@ $ CHGDEBUG=1 chg version -q 0<&- chg: debug: * stdio fds are missing (glob) chg: debug: * execute original hg (glob) - Mercurial Distributed SCM * (glob) + Traceback (most recent call last): + File "/tmp/hgtests.avspvsq4/install/bin/hg", line 43, in <module> + dispatch.run() + File "/usr/lib/python3.6/importlib/util.py", line 233, in __getattribute__ + self.__spec__.loader.exec_module(self) + File "<frozen importlib._bootstrap_external>", line 678, in exec_module + File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed + File "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/dispatch.py", line 726, in <module> + class lazyaliasentry(object): + File "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/dispatch.py", line 737, in lazyaliasentry + @util.propertycache + File "/usr/lib/python3.6/importlib/util.py", line 233, in __getattribute__ + self.__spec__.loader.exec_module(self) + File "<frozen importlib._bootstrap_external>", line 678, in exec_module + File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed + File "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/util.py", line 3473, in <module> + f=procutil.stderr, + File "/usr/lib/python3.6/importlib/util.py", line 233, in __getattribute__ + self.__spec__.loader.exec_module(self) + File "<frozen importlib._bootstrap_external>", line 678, in exec_module + File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed + File "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/utils/procutil.py", line 127, in <module> + stdin = sys.stdin.buffer + AttributeError: 'NoneType' object has no attribute 'buffer' + [1] server lifecycle ---------------- Differential Revision: https://phab.mercurial-scm.org/D9500

File last commit:

r44082:4cd91104 stable
r46699:81c1f5d1 default
Show More
base85.py
88 lines | 2.0 KiB | text/x-python | PythonLexer
Brendan Cully
Pure python base85 fallback...
r7701 # base85.py: pure python base85 codec
#
# Copyright (C) 2009 Brendan Cully <brendan@kublai.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Brendan Cully
Pure python base85 fallback...
r7701
Gregory Szorc
base85: use absolute_import
r27334 from __future__ import absolute_import
Brendan Cully
Pure python base85 fallback...
r7701 import struct
Pulkit Goyal
py3: use pycompat.bytestr to convert _b85chars to bytes...
r35962 from .. import pycompat
Augie Fackler
formatting: blacken the codebase...
r43346 _b85chars = pycompat.bytestr(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
b"ghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
Augie Fackler
formatting: blacken the codebase...
r43346 )
Mads Kiilerich
Optimization of pure.base85.b85encode...
r7835 _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
Brendan Cully
Pure python base85 fallback...
r7701 _b85dec = {}
Augie Fackler
formatting: blacken the codebase...
r43346
Brendan Cully
Pure python base85 fallback...
r7701 def _mkb85dec():
Martin Geisler
replace "i in range(len(xs))" with "i, x in enumerate(xs)"...
r8632 for i, c in enumerate(_b85chars):
_b85dec[c] = i
Brendan Cully
Pure python base85 fallback...
r7701
Augie Fackler
formatting: blacken the codebase...
r43346
Brendan Cully
Pure python base85 fallback...
r7701 def b85encode(text, pad=False):
"""encode text in base85 format"""
l = len(text)
r = l % 4
if r:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 text += b'\0' * (4 - r)
Brendan Cully
Pure python base85 fallback...
r7701 longs = len(text) >> 2
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 words = struct.unpack(b'>%dL' % longs, text)
Brendan Cully
Pure python base85 fallback...
r7701
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 out = b''.join(
Augie Fackler
formatting: blacken the codebase...
r43346 _b85chars[(word // 52200625) % 85]
+ _b85chars2[(word // 7225) % 7225]
+ _b85chars2[word % 7225]
for word in words
)
Brendan Cully
Pure python base85 fallback...
r7701
if pad:
return out
# Trim padding
olen = l % 4
if olen:
olen += 1
Alejandro Santos
compat: use // for integer division
r9029 olen += l // 4 * 5
Brendan Cully
Pure python base85 fallback...
r7701 return out[:olen]
Augie Fackler
formatting: blacken the codebase...
r43346
Brendan Cully
Pure python base85 fallback...
r7701 def b85decode(text):
"""decode base85-encoded text"""
if not _b85dec:
_mkb85dec()
l = len(text)
out = []
for i in range(0, len(text), 5):
Augie Fackler
formatting: blacken the codebase...
r43346 chunk = text[i : i + 5]
Pulkit Goyal
py3: converts bytes to pycompat.bytestr to get bytechrs while enumerating...
r36209 chunk = pycompat.bytestr(chunk)
Brendan Cully
Pure python base85 fallback...
r7701 acc = 0
Martin Geisler
replace "i in range(len(xs))" with "i, x in enumerate(xs)"...
r8632 for j, c in enumerate(chunk):
Brendan Cully
Pure python base85 fallback...
r7701 try:
Martin Geisler
replace "i in range(len(xs))" with "i, x in enumerate(xs)"...
r8632 acc = acc * 85 + _b85dec[c]
Brendan Cully
Pure python base85 fallback...
r7701 except KeyError:
Augie Fackler
formatting: blacken the codebase...
r43346 raise ValueError(
pure: use string for exception in the pure version of base85...
r44081 'bad base85 character at position %d' % (i + j)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Brendan Cully
Pure python base85 fallback...
r7701 if acc > 4294967295:
pure: use string for another exception in the pure version of base85...
r44082 raise ValueError('Base85 overflow in hunk starting at byte %d' % i)
Brendan Cully
Pure python base85 fallback...
r7701 out.append(acc)
# Pad final chunk if necessary
cl = l % 5
if cl:
acc *= 85 ** (5 - cl)
if cl > 1:
Augie Fackler
formatting: blacken the codebase...
r43346 acc += 0xFFFFFF >> (cl - 2) * 8
Brendan Cully
Pure python base85 fallback...
r7701 out[-1] = acc
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 out = struct.pack(b'>%dL' % (len(out)), *out)
Brendan Cully
Pure python base85 fallback...
r7701 if cl:
Augie Fackler
formatting: blacken the codebase...
r43346 out = out[: -(5 - cl)]
Brendan Cully
Pure python base85 fallback...
r7701
return out