From patchwork Sat Jun 25 21:11:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [6,of,9,V2] i18n: use unicode literals to appease Python 3 From: Gregory Szorc X-Patchwork-Id: 15620 Message-Id: <5ca58f193ff2f421ce7b.1466889080@ubuntu-vm-main> To: mercurial-devel@mercurial-scm.org Date: Sat, 25 Jun 2016 14:11:20 -0700 # HG changeset patch # User Gregory Szorc # Date 1466887325 25200 # Sat Jun 25 13:42:05 2016 -0700 # Node ID 5ca58f193ff2f421ce7b7c6b577e0cf7d31758ab # Parent 3803d2501ef928a177fa09df612da6a09e9f42e6 i18n: use unicode literals to appease Python 3 The use of u'' prefixing in the datapath function is a bit unfortunate as the in-line comment explains. It looks like Python's stdlib doesn't treat paths as byte strings like it probably should. Pity. diff --git a/mercurial/i18n.py b/mercurial/i18n.py --- a/mercurial/i18n.py +++ b/mercurial/i18n.py @@ -41,18 +41,21 @@ if (os.name == 'nt' _languages = [locale.windows_locale[langid]] except (ImportError, AttributeError, KeyError): # ctypes not found or unknown langid pass _ugettext = None def setdatapath(datapath): - localedir = os.path.join(datapath, 'locale') - t = gettextmod.translation('hg', localedir, _languages, fallback=True) + localedir = os.path.join(datapath, u'locale') + # gettext.find() performs a os.path.join() with string literal + # arguments. So passing a bytes localedir will fail because Python + # 3 insists all os.path.join() arguments are the same type. + t = gettextmod.translation(u'hg', localedir, _languages, fallback=True) global _ugettext try: _ugettext = t.ugettext except AttributeError: _ugettext = t.gettext _msgcache = {} @@ -70,34 +73,34 @@ def gettext(message): if message is None or not _ugettext: return message if message not in _msgcache: if type(message) is unicode: # goofy unicode docstrings in test paragraphs = message.split(u'\n\n') else: - paragraphs = [p.decode("ascii") for p in message.split('\n\n')] + paragraphs = [p.decode(u'ascii') for p in message.split('\n\n')] # Be careful not to translate the empty string -- it holds the # meta data of the .po file. u = u'\n\n'.join([p and _ugettext(p) or '' for p in paragraphs]) try: # encoding.tolocal cannot be used since it will first try to # decode the Unicode string. Calling u.decode(enc) really # means u.encode(sys.getdefaultencoding()).decode(enc). Since # the Python encoding defaults to 'ascii', this fails if the # translated string use non-ASCII characters. - _msgcache[message] = u.encode(encoding.encoding, "replace") + _msgcache[message] = u.encode(encoding.encoding, u'replace') except LookupError: # An unknown encoding results in a LookupError. _msgcache[message] = message return _msgcache[message] def _plain(): - if 'HGPLAIN' not in os.environ and 'HGPLAINEXCEPT' not in os.environ: + if u'HGPLAIN' not in os.environ and u'HGPLAINEXCEPT' not in os.environ: return False - exceptions = os.environ.get('HGPLAINEXCEPT', '').strip().split(',') - return 'i18n' not in exceptions + exceptions = os.environ.get(u'HGPLAINEXCEPT', u'').strip().split(u',') + return u'i18n' not in exceptions if _plain(): _ = lambda message: message else: _ = gettext diff --git a/tests/test-check-py3-compat.t b/tests/test-check-py3-compat.t --- a/tests/test-check-py3-compat.t +++ b/tests/test-check-py3-compat.t @@ -19,121 +19,116 @@ tests/md5sum.py not using absolute_import tests/readlink.py not using absolute_import tests/run-tests.py not using absolute_import tests/test-demandimport.py not using absolute_import #if py3exe $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs $PYTHON3 contrib/check-py3-compat.py doc/hgmanpage.py: invalid syntax: invalid syntax (, line *) (glob) - hgext/acl.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/automv.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/blackbox.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + hgext/acl.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/automv.py: error importing module: invalid syntax (commands.py, line *) (glob) + hgext/blackbox.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) hgext/bugzilla.py: error importing module: No module named 'urlparse' (line *) (glob) - hgext/censor.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + hgext/censor.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) hgext/chgserver.py: error importing module: No module named 'SocketServer' (line *) (glob) - hgext/children.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/churn.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/clonebundles.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + hgext/children.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/churn.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/clonebundles.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) hgext/color.py: invalid syntax: invalid syntax (, line *) (glob) - hgext/convert/bzr.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/common.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/convcmd.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/cvs.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/cvsps.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/darcs.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/filemap.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/git.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/gnuarch.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/hg.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/monotone.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/p4.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/convert/subversion.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + hgext/convert/bzr.py: error importing module: Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob) + hgext/convert/common.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/convcmd.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/cvs.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/cvsps.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/darcs.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/filemap.py: error importing module: Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob) + hgext/convert/git.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/gnuarch.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/hg.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/monotone.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/p4.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/convert/subversion.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) hgext/convert/transport.py: error importing module: No module named 'svn.client' (line *) (glob) - hgext/eol.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/extdiff.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/factotum.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/fetch.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/fsmonitor/state.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/fsmonitor/watchmanclient.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/gpg.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/graphlog.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/hgk.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/highlight/highlight.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/histedit.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/keyword.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/basestore.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/lfcommands.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/lfutil.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/localstore.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/overrides.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/proto.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/remotestore.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/reposetup.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/storefactory.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/largefiles/uisetup.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + hgext/eol.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/extdiff.py: error importing module: invalid syntax (archival.py, line *) (glob) + hgext/factotum.py: error importing: No module named 'rfc822' (error at __init__.py:*) (glob) + hgext/fetch.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/fsmonitor/state.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/fsmonitor/watchmanclient.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/gpg.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/graphlog.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/hgk.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/highlight/highlight.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/histedit.py: error importing module: invalid syntax (bundle2.py, line *) (glob) + hgext/keyword.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/basestore.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/lfcommands.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/lfutil.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/localstore.py: error importing module: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (line *) (glob) + hgext/largefiles/overrides.py: error importing module: invalid syntax (archival.py, line *) (glob) + hgext/largefiles/proto.py: error importing: No module named 'httplib' (error at httppeer.py:*) (glob) + hgext/largefiles/remotestore.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/reposetup.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/storefactory.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/largefiles/uisetup.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) hgext/largefiles/wirestore.py: error importing module: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (line *) (glob) - hgext/mq.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/notify.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/pager.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/patchbomb.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/purge.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/rebase.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/record.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/relink.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/schemes.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/share.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/shelve.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/strip.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/transplant.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/win32mbcs.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - hgext/win32text.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + hgext/mq.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/notify.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/pager.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/patchbomb.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/purge.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/rebase.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/record.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/relink.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/schemes.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/share.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/shelve.py: error importing module: invalid syntax (bundle2.py, line *) (glob) + hgext/strip.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + hgext/transplant.py: error importing: invalid syntax (bundle2.py, line *) (glob) + hgext/win32text.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/archival.py: invalid syntax: invalid syntax (, line *) (glob) - mercurial/bookmarks.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/branchmap.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + mercurial/bookmarks.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/branchmap.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/bundle2.py: invalid syntax: invalid syntax (, line *) (glob) - mercurial/bundlerepo.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/byterange.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/changegroup.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/changelog.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/cmdutil.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + mercurial/bundlerepo.py: error importing module: invalid syntax (bundle2.py, line *) (glob) + mercurial/byterange.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/changegroup.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/changelog.py: error importing: getattr(): attribute name must be string (error at pycompat.py:*) (glob) + mercurial/cmdutil.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/commands.py: invalid syntax: invalid syntax (, line *) (glob) mercurial/commandserver.py: error importing module: No module named 'SocketServer' (line *) (glob) - mercurial/config.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/context.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/copies.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/crecord.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/dagparser.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/dagutil.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/destutil.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/dirstate.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/discovery.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/dispatch.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/exchange.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/extensions.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/fancyopts.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/filelog.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/filemerge.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/fileset.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/formatter.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/graphmod.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/hbisect.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/help.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/hg.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + mercurial/config.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/context.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/copies.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/crecord.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/destutil.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/dirstate.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/discovery.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/dispatch.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/exchange.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/extensions.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/filelog.py: error importing: getattr(): attribute name must be string (error at pycompat.py:*) (glob) + mercurial/filemerge.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/fileset.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/formatter.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/graphmod.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/help.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/hg.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/hgweb/common.py: error importing module: No module named 'BaseHTTPServer' (line *) (glob) mercurial/hgweb/hgweb_mod.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) mercurial/hgweb/hgwebdir_mod.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) mercurial/hgweb/protocol.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) mercurial/hgweb/request.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) mercurial/hgweb/server.py: error importing module: No module named 'BaseHTTPServer' (line *) (glob) mercurial/hgweb/webcommands.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) mercurial/hgweb/webutil.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) mercurial/hgweb/wsgicgi.py: error importing module: Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob) - mercurial/hook.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) - mercurial/httpconnection.py: error importing: str expected, not bytes (error at i18n.py:*) (glob) + mercurial/hook.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) + mercurial/httpconnection.py: error importing: No module named 'rfc822' (error at __init__.py:*) (glob) mercurial/httppeer.py: error importing module: No module named 'httplib' (line *) (glob) mercurial/keepalive.py: error importing module: No module named 'httplib' (line *) (glob) mercurial/localrepo.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/lock.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/mail.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/manifest.py: error importing: getattr(): attribute name must be string (error at pycompat.py:*) (glob) mercurial/match.py: error importing: '_fields_' must be a sequence of (name, C type) pairs (error at osutil.py:*) (glob) mercurial/mdiff.py: error importing: getattr(): attribute name must be string (error at pycompat.py:*) (glob)