comparison contrib/check-py3-compat.py @ 45217:4e5da64d5549

tests: make check-py3-compat.py actually load the specified files correctly For most uses, this change is essentially a no-op, as this script is generally only run by test-check-py3-compat.t, which will already put `$TESTDIR/..` in `$PYTHONPATH`. When running outside of tests, however, `$PYTHONPATH` is likely not set, causing check-py3-compat.py to parse the file from the repo, but then import the installed version, and raise any errors about the installed version, not the one currently in the repo. Additionally, this helps users (like me) who have a strange set up where their home directory (and thus their hg repos) happen to be in a subdirectory of sys.prefix (which is /usr on my system). Since the '.' entry added to sys.path takes precedence over the absolute path of `$TESTDIR/..` in `$PYTHONPATH`, the path to the modules that it imports (and that show up in any stack trace) are *relative*, meaning that we don't detect them as starting with `sys.prefix`. Sample non-test invocation, and the difference this change makes (the path for 'error at <path>:<line>' is correct now):: Before: ``` $ python3 contrib/check-py3-compat.py mercurial/win*.py mercurial/win32.py: error importing: <ValueError> _type_ 'v' not supported (error at check-py3-compat.py:65) mercurial/windows.py: error importing: <ModuleNotFoundError> No module named 'msvcrt' (error at check-py3-compat.py:65) ``` After: ``` $ python3 contrib/check-py3-compat.py mercurial/win*.py mercurial/win32.py: error importing: <ValueError> _type_ 'v' not supported (error at win32.py:11) mercurial/windows.py: error importing: <ModuleNotFoundError> No module named 'msvcrt' (error at windows.py:12) ``` Differential Revision: https://phab.mercurial-scm.org/D8814
author Kyle Lippincott <spectral@google.com>
date Fri, 24 Jul 2020 16:32:45 -0700
parents 9d2b2df2c2ba
children c102b704edb5
comparison
equal deleted inserted replaced
45216:357d8415aa27 45217:4e5da64d5549
95 95
96 if __name__ == '__main__': 96 if __name__ == '__main__':
97 if sys.version_info[0] == 2: 97 if sys.version_info[0] == 2:
98 fn = check_compat_py2 98 fn = check_compat_py2
99 else: 99 else:
100 # check_compat_py3 will import every filename we specify as long as it
101 # starts with one of a few prefixes. It does this by converting
102 # specified filenames like 'mercurial/foo.py' to 'mercurial.foo' and
103 # importing that. When running standalone (not as part of a test), this
104 # means we actually import the installed versions, not the files we just
105 # specified. When running as test-check-py3-compat.t, we technically
106 # would import the correct paths, but it's cleaner to have both cases
107 # use the same import logic.
108 sys.path.insert(0, '.')
100 fn = check_compat_py3 109 fn = check_compat_py3
101 110
102 for f in sys.argv[1:]: 111 for f in sys.argv[1:]:
103 with warnings.catch_warnings(record=True) as warns: 112 with warnings.catch_warnings(record=True) as warns:
104 fn(f) 113 fn(f)