# HG changeset patch # User Augie Fackler # Date 2018-02-14 06:00:01 # Node ID 64600233836567ba2738f7e7ec5f3ea1f78116a1 # Parent 187f2474bc117848692176eeb8e33ae68494fe2d py3: introduce and use pycompat.getargspec This is getfullargspec on py3, which means we can't use namedtuple named accessors for all fields (eg keywords from getargspec is varkw from getfullargspec, with the same meaning). Solves some warning issues on Python 3. I didn't clean up httpclient because that's vendored code I think we should probably discard, and I didn't touch the manpage generator for now either. Differential Revision: https://phab.mercurial-scm.org/D2251 diff --git a/contrib/perf.py b/contrib/perf.py --- a/contrib/perf.py +++ b/contrib/perf.py @@ -64,6 +64,12 @@ try: from mercurial import scmutil # since 1.9 (or 8b252e826c68) except ImportError: pass +try: + from mercurial import pycompat + getargspec = pycompat.getargspec # added to module after 4.5 +except (ImportError, AttributeError): + import inspect + getargspec = inspect.getargspec # for "historical portability": # define util.safehasattr forcibly, because util.safehasattr has been @@ -114,9 +120,8 @@ def parsealiases(cmd): if safehasattr(registrar, 'command'): command = registrar.command(cmdtable) elif safehasattr(cmdutil, 'command'): - import inspect command = cmdutil.command(cmdtable) - if 'norepo' not in inspect.getargspec(command)[0]: + if 'norepo' not in getargspec(command).args: # for "historical portability": # wrap original cmdutil.command, because "norepo" option has # been available since 3.1 (or 75a96326cecb) diff --git a/mercurial/extensions.py b/mercurial/extensions.py --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -195,11 +195,7 @@ def _runextsetup(name, ui): try: extsetup(ui) except TypeError: - # Try to use getfullargspec (Python 3) first, and fall - # back to getargspec only if it doesn't exist so as to - # avoid warnings. - if getattr(inspect, 'getfullargspec', - getattr(inspect, 'getargspec'))(extsetup).args: + if pycompat.getargspec(extsetup).args: raise extsetup() # old extsetup with no ui argument except Exception as inst: diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -9,7 +9,6 @@ from __future__ import absolute_import import errno import hashlib -import inspect import os import random import time @@ -1068,7 +1067,7 @@ class localrepository(object): if not fn: fn = lambda s, c, **kwargs: util.filter(s, c) # Wrap old filters not supporting keyword arguments - if not inspect.getargspec(fn)[2]: + if not pycompat.getargspec(fn)[2]: oldfn = fn fn = lambda s, c, **kwargs: oldfn(s, c) l.append((mf, fn, params)) diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py --- a/mercurial/pycompat.py +++ b/mercurial/pycompat.py @@ -11,6 +11,7 @@ This contains aliases to hide python ver from __future__ import absolute_import import getopt +import inspect import os import shlex import sys @@ -65,6 +66,7 @@ if ispy3: maplist = lambda *args: list(map(*args)) ziplist = lambda *args: list(zip(*args)) rawinput = input + getargspec = inspect.getfullargspec # TODO: .buffer might not exist if std streams were replaced; we'll need # a silly wrapper to make a bytes stream backed by a unicode one. @@ -330,6 +332,7 @@ else: maplist = map ziplist = zip rawinput = raw_input + getargspec = inspect.getargspec def emailparser(*args, **kwargs): import email.parser