# HG changeset patch # User Yuya Nishihara # Date 2016-10-08 15:22:07 # Node ID f701fffd21d89c542d5795a98990eb6b5aa9171a # Parent 68010ed1636da51fe5cde2e12ef57f7e55bfa701 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. diff --git a/contrib/check-py3-compat.py b/contrib/check-py3-compat.py --- a/contrib/check-py3-compat.py +++ b/contrib/check-py3-compat.py @@ -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 @@ def check_compat_py3(f): 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, 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 @@ -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: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at bzr.py:*) - hgext/convert/convcmd.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at convcmd.py:*) - hgext/convert/cvs.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at cvs.py:*) - hgext/convert/darcs.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at darcs.py:*) - hgext/convert/filemap.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at filemap.py:*) - hgext/convert/git.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at git.py:*) - hgext/convert/gnuarch.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at gnuarch.py:*) - hgext/convert/hg.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at hg.py:*) - hgext/convert/monotone.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at monotone.py:*) - hgext/convert/p4.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at p4.py:*) - hgext/convert/subversion.py: error importing: Parent module 'hgext.convert' not loaded, cannot perform relative import (error at subversion.py:*) - hgext/convert/transport.py: error importing: No module named 'svn.client' (error at transport.py:*) - hgext/fsmonitor/watchmanclient.py: error importing: Parent module 'hgext.fsmonitor' not loaded, cannot perform relative import (error at watchmanclient.py:*) - hgext/journal.py: error importing: Parent module 'hgext' not loaded, cannot perform relative import (error at journal.py:*) - hgext/largefiles/basestore.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at basestore.py:*) - hgext/largefiles/lfcommands.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at lfcommands.py:*) - hgext/largefiles/localstore.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at localstore.py:*) - hgext/largefiles/overrides.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at overrides.py:*) - hgext/largefiles/proto.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at proto.py:*) - hgext/largefiles/remotestore.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at remotestore.py:*) - hgext/largefiles/reposetup.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at reposetup.py:*) - hgext/largefiles/storefactory.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at storefactory.py:*) - hgext/largefiles/uisetup.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at uisetup.py:*) - hgext/largefiles/wirestore.py: error importing: Parent module 'hgext.largefiles' not loaded, cannot perform relative import (error at wirestore.py:*) - hgext/mq.py: error importing: startswith first arg must be str or a tuple of str, not bytes (error at extensions.py:*) - hgext/rebase.py: error importing: Can't convert 'bytes' object to str implicitly (error at registrar.py:*) - hgext/record.py: error importing: '^commit|ci' (error at record.py:*) - hgext/shelve.py: error importing: Parent module 'hgext' not loaded, cannot perform relative import (error at shelve.py:*) - hgext/transplant.py: error importing: Can't convert 'bytes' object to str implicitly (error at registrar.py:*) - mercurial/encoding.py: error importing: bytes expected, not str (error at encoding.py:*) - mercurial/fileset.py: error importing: Can't convert 'bytes' object to str implicitly (error at registrar.py:*) - mercurial/i18n.py: error importing: bytes expected, not str (error at i18n.py:*) - mercurial/revset.py: error importing: 'dict' object has no attribute 'iteritems' (error at revset.py:*) + hgext/convert/bzr.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/convert/convcmd.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/convert/subversion.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/convert/transport.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/fsmonitor/pywatchman/capabilities.py: error importing: No module named 'pybser' (error at __init__.py:*) + hgext/fsmonitor/pywatchman/pybser.py: error importing: No module named 'pybser' (error at __init__.py:*) + hgext/fsmonitor/watchmanclient.py: error importing: No module named 'pybser' (error at __init__.py:*) + hgext/journal.py: error importing: Type names and field names must be valid identifiers: "b'journalentry'" (error at journal.py:*) + hgext/largefiles/basestore.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/lfcommands.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/lfutil.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/localstore.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/overrides.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/proto.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/remotestore.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/reposetup.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/storefactory.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/uisetup.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/largefiles/wirestore.py: error importing: cannot mix bytes and nonbytes literals (subversion.py, line 533) (error at convcmd.py:*) + hgext/mq.py: error importing: __import__() argument 1 must be str, not bytes (error at extensions.py:*) mercurial/scmwindows.py: error importing: No module named 'winreg' (error at scmwindows.py:*) - mercurial/store.py: error importing: Can't convert 'bytes' object to str implicitly (error at store.py:*) mercurial/win32.py: error importing: No module named 'msvcrt' (error at win32.py:*) mercurial/windows.py: error importing: No module named 'msvcrt' (error at windows.py:*)