diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 46aa0595..86f5368c 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -89,8 +89,26 @@ def get_default_version(): return get_default_version() +def _sys_executable_matches(version): + if version == 'python': + return True + elif not version.startswith('python'): + return False + + try: + info = tuple(int(p) for p in version[len('python'):].split('.')) + except ValueError: + return False + + return sys.version_info[:len(info)] == info + + def norm_version(version): if os.name == 'nt': # pragma: no cover (windows) + # first see if our current executable is appropriate + if _sys_executable_matches(version): + return sys.executable + # Try looking up by name version_exec = find_executable(version) if version_exec and version_exec != version: diff --git a/tests/languages/python_test.py b/tests/languages/python_test.py index 366c010e..426d3ec6 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -2,6 +2,10 @@ from __future__ import absolute_import from __future__ import unicode_literals import os.path +import sys + +import mock +import pytest from pre_commit.languages import python @@ -16,3 +20,15 @@ def test_norm_version_expanduser(): expected_path = home + '/.pyenv/versions/3.4.3/bin/python' result = python.norm_version(path) assert result == expected_path + + +@pytest.mark.parametrize('v', ('python3.6', 'python3', 'python')) +def test_sys_executable_matches(v): + with mock.patch.object(sys, 'version_info', (3, 6, 7)): + assert python._sys_executable_matches(v) + + +@pytest.mark.parametrize('v', ('notpython', 'python3.x')) +def test_sys_executable_matches_does_not_match(v): + with mock.patch.object(sys, 'version_info', (3, 6, 7)): + assert not python._sys_executable_matches(v)