Recover from invalid python virtualenvs

This commit is contained in:
Anthony Sottile 2017-07-19 14:23:39 -07:00
parent 64dd893ab4
commit cff98a634d
15 changed files with 76 additions and 6 deletions

View file

@ -21,6 +21,9 @@ from pre_commit.languages import system
# return 'default' if there is no better option.
# """
#
# def healthy(repo_cmd_runner, language_version):
# """Return whether or not the environment is considered functional."""
#
# def install_environment(repo_cmd_runner, version, additional_dependencies):
# """Installs a repository in the given repository. Note that the current
# working directory will already be inside the repository.

View file

@ -15,6 +15,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'docker'
PRE_COMMIT_LABEL = 'PRE_COMMIT'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def md5(s): # pragma: windows no cover

View file

@ -15,6 +15,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'golangenv'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def get_env_patch(venv):

View file

@ -37,3 +37,7 @@ def assert_no_additional_deps(lang, additional_deps):
def basic_get_default_version():
return 'default'
def basic_healthy(repo_cmd_runner, language_version):
return True

View file

@ -13,6 +13,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'node_env'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def get_env_patch(venv): # pragma: windows no cover

View file

@ -9,6 +9,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = None
GREP = 'ggrep' if sys.platform == 'darwin' else 'grep'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def install_environment(repo_cmd_runner, version, additional_dependencies):

View file

@ -10,11 +10,11 @@ from pre_commit.envcontext import Var
from pre_commit.languages import helpers
from pre_commit.parse_shebang import find_executable
from pre_commit.util import clean_path_on_failure
from pre_commit.util import cmd_output
from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'py_env'
get_default_version = helpers.basic_get_default_version
def bin_dir(venv):
@ -83,6 +83,14 @@ def get_default_version():
return get_default_version()
def healthy(repo_cmd_runner, language_version):
with in_env(repo_cmd_runner, language_version):
retcode, _, _ = cmd_output(
'python', '-c', 'import datetime, io, os, weakref', retcode=None,
)
return retcode == 0
def norm_version(version):
if os.name == 'nt': # pragma: no cover (windows)
# Try looking up by name

View file

@ -17,6 +17,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'rbenv'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def get_env_patch(venv, language_version): # pragma: windows no cover

View file

@ -6,6 +6,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def install_environment(repo_cmd_runner, version, additional_dependencies):

View file

@ -11,6 +11,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'swift_env'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
BUILD_DIR = '.build'
BUILD_CONFIG = 'release'

View file

@ -6,6 +6,7 @@ from pre_commit.xargs import xargs
ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
def install_environment(repo_cmd_runner, version, additional_dependencies):

View file

@ -36,7 +36,7 @@ def _state_filename(cmd_runner, venv):
)
def _read_installed_state(cmd_runner, venv):
def _read_state(cmd_runner, venv):
filename = _state_filename(cmd_runner, venv)
if not os.path.exists(filename):
return None
@ -44,7 +44,7 @@ def _read_installed_state(cmd_runner, venv):
return json.loads(io.open(filename).read())
def _write_installed_state(cmd_runner, venv, state):
def _write_state(cmd_runner, venv, state):
state_filename = _state_filename(cmd_runner, venv)
staging = state_filename + 'staging'
with io.open(staging, 'w') as state_file:
@ -57,8 +57,10 @@ def _installed(cmd_runner, language_name, language_version, additional_deps):
language = languages[language_name]
venv = environment_dir(language.ENVIRONMENT_DIR, language_version)
return (
venv is None or
_read_installed_state(cmd_runner, venv) == _state(additional_deps)
venv is None or (
_read_state(cmd_runner, venv) == _state(additional_deps) and
language.healthy(cmd_runner, language_version)
)
)
@ -89,7 +91,7 @@ def _install_all(venvs, repo_url):
language.install_environment(cmd_runner, version, deps)
# Write our state to indicate we're installed
state = _state(deps)
_write_installed_state(cmd_runner, venv, state)
_write_state(cmd_runner, venv, state)
def _validate_minimum_version(hook):