changeset 30094:f701fffd21d8

py3: make check-py3-compat.py load modules in standard manner Otherwise no code transformation would be applied to the modules which are imported only by imp.load_module(). This change means modules are imported from PYTHONPATH, not from the paths given by command arguments. This isn't always correct, but seems acceptable.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 08 Oct 2016 17:22:07 +0200
parents 68010ed1636d
children e8aeeb28e35e
files contrib/check-py3-compat.py tests/test-check-py3-compat.t
diffstat 2 files changed, 23 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/contrib/check-py3-compat.py	Sun Oct 09 08:31:39 2016 +0200
+++ b/contrib/check-py3-compat.py	Sat Oct 08 17:22:07 2016 +0200
@@ -10,7 +10,7 @@
 from __future__ import absolute_import, print_function
 
 import ast
-import imp
+import importlib
 import os
 import sys
 import traceback
@@ -56,9 +56,9 @@
     if f.startswith(('hgext/', 'mercurial/')) and not f.endswith('__init__.py'):
         assert f.endswith('.py')
         name = f.replace('/', '.')[:-3].replace('.pure.', '.')
-        with open(f, 'r') as fh:
+        if True:
             try:
-                imp.load_module(name, fh, f, ('py', 'r', imp.PY_SOURCE))
+                importlib.import_module(name)
             except Exception as e:
                 exc_type, exc_value, tb = sys.exc_info()
                 # We walk the stack and ignore frames from our custom importer,
--- a/tests/test-check-py3-compat.t	Sun Oct 09 08:31:39 2016 +0200
+++ b/tests/test-check-py3-compat.t	Sat Oct 08 17:22:07 2016 +0200
@@ -16,41 +16,27 @@
   $ hg files 'set:(**.py) - grep(pygments)' | sed 's|\\|/|g' \
   > | xargs $PYTHON3 contrib/check-py3-compat.py \
   > | sed 's/[0-9][0-9]*)$/*)/'
-  hgext/convert/bzr.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at bzr.py:*)
-  hgext/convert/convcmd.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at convcmd.py:*)
-  hgext/convert/cvs.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at cvs.py:*)
-  hgext/convert/darcs.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at darcs.py:*)
-  hgext/convert/filemap.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at filemap.py:*)
-  hgext/convert/git.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at git.py:*)
-  hgext/convert/gnuarch.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at gnuarch.py:*)
-  hgext/convert/hg.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at hg.py:*)
-  hgext/convert/monotone.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at monotone.py:*)
-  hgext/convert/p4.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at p4.py:*)
-  hgext/convert/subversion.py: error importing: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (error at subversion.py:*)
-  hgext/convert/transport.py: error importing: <ImportError> No module named 'svn.client' (error at transport.py:*)
-  hgext/fsmonitor/watchmanclient.py: error importing: <SystemError> Parent module 'hgext.fsmonitor' not loaded, cannot perform relative import (error at watchmanclient.py:*)
-  hgext/journal.py: error importing: <SystemError> Parent module 'hgext' not loaded, cannot perform relative import (error at journal.py:*)
-  hgext/largefiles/basestore.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at basestore.py:*)
-  hgext/largefiles/lfcommands.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at lfcommands.py:*)
-  hgext/largefiles/localstore.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at localstore.py:*)
-  hgext/largefiles/overrides.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at overrides.py:*)
-  hgext/largefiles/proto.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at proto.py:*)
-  hgext/largefiles/remotestore.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at remotestore.py:*)
-  hgext/largefiles/reposetup.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at reposetup.py:*)
-  hgext/largefiles/storefactory.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at storefactory.py:*)
-  hgext/largefiles/uisetup.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at uisetup.py:*)
-  hgext/largefiles/wirestore.py: error importing: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at wirestore.py:*)
-  hgext/mq.py: error importing: <TypeError> startswith first arg must be str or a tuple of str, not bytes (error at extensions.py:*)
-  hgext/rebase.py: error importing: <TypeError> Can't convert 'bytes' object to str implicitly (error at registrar.py:*)
-  hgext/record.py: error importing: <KeyError> '^commit|ci' (error at record.py:*)
-  hgext/shelve.py: error importing: <SystemError> Parent module 'hgext' not loaded, cannot perform relative import (error at shelve.py:*)
-  hgext/transplant.py: error importing: <TypeError> Can't convert 'bytes' object to str implicitly (error at registrar.py:*)
-  mercurial/encoding.py: error importing: <TypeError> bytes expected, not str (error at encoding.py:*)
-  mercurial/fileset.py: error importing: <TypeError> Can't convert 'bytes' object to str implicitly (error at registrar.py:*)
-  mercurial/i18n.py: error importing: <TypeError> bytes expected, not str (error at i18n.py:*)
-  mercurial/revset.py: error importing: <AttributeError> 'dict' object has no attribute 'iteritems' (error at revset.py:*)
+  hgext/convert/bzr.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/convert/convcmd.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/convert/subversion.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/convert/transport.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/fsmonitor/pywatchman/capabilities.py: error importing: <ImportError> No module named 'pybser' (error at __init__.py:*)
+  hgext/fsmonitor/pywatchman/pybser.py: error importing: <ImportError> No module named 'pybser' (error at __init__.py:*)
+  hgext/fsmonitor/watchmanclient.py: error importing: <ImportError> No module named 'pybser' (error at __init__.py:*)
+  hgext/journal.py: error importing: <ValueError> Type names and field names must be valid identifiers: "b'journalentry'" (error at journal.py:*)
+  hgext/largefiles/basestore.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/lfcommands.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/lfutil.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/localstore.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/overrides.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/proto.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/remotestore.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/reposetup.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/storefactory.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/uisetup.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/largefiles/wirestore.py: error importing: <SyntaxError> cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*)
+  hgext/mq.py: error importing: <TypeError> __import__() argument 1 must be str, not bytes (error at extensions.py:*)
   mercurial/scmwindows.py: error importing: <ImportError> No module named 'winreg' (error at scmwindows.py:*)
-  mercurial/store.py: error importing: <TypeError> Can't convert 'bytes' object to str implicitly (error at store.py:*)
   mercurial/win32.py: error importing: <ImportError> No module named 'msvcrt' (error at win32.py:*)
   mercurial/windows.py: error importing: <ImportError> No module named 'msvcrt' (error at windows.py:*)