mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
Make ^C^C during install not cause subsequent runs to fail. Resolves #186.
This commit is contained in:
parent
901c50632f
commit
1996a4c8a1
2 changed files with 44 additions and 1 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import shutil
|
||||||
|
|
||||||
from cached_property import cached_property
|
from cached_property import cached_property
|
||||||
|
|
||||||
from pre_commit.languages.all import languages
|
from pre_commit.languages.all import languages
|
||||||
|
|
@ -64,11 +66,21 @@ class Repository(object):
|
||||||
language = languages[language_name]
|
language = languages[language_name]
|
||||||
if (
|
if (
|
||||||
language.ENVIRONMENT_DIR is None or
|
language.ENVIRONMENT_DIR is None or
|
||||||
self.cmd_runner.exists(language.ENVIRONMENT_DIR)
|
self.cmd_runner.exists(language.ENVIRONMENT_DIR, '.installed')
|
||||||
):
|
):
|
||||||
# The language is already installed
|
# The language is already installed
|
||||||
continue
|
continue
|
||||||
|
# There's potentially incomplete cleanup from previous runs
|
||||||
|
# Clean it up!
|
||||||
|
if self.cmd_runner.exists(language.ENVIRONMENT_DIR):
|
||||||
|
shutil.rmtree(self.cmd_runner.path(language.ENVIRONMENT_DIR))
|
||||||
|
|
||||||
language.install_environment(self.cmd_runner, language_version)
|
language.install_environment(self.cmd_runner, language_version)
|
||||||
|
# Touch the .installed file (atomic) to indicate we've installed
|
||||||
|
open(
|
||||||
|
self.cmd_runner.path(language.ENVIRONMENT_DIR, '.installed'),
|
||||||
|
'w',
|
||||||
|
).close()
|
||||||
|
|
||||||
def run_hook(self, hook, file_args):
|
def run_hook(self, hook, file_args):
|
||||||
"""Run a hook.
|
"""Run a hook.
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
import os.path
|
import os.path
|
||||||
|
import shutil
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
import pytest
|
import pytest
|
||||||
|
|
@ -10,6 +11,7 @@ import pytest
|
||||||
from pre_commit.clientlib.validate_config import CONFIG_JSON_SCHEMA
|
from pre_commit.clientlib.validate_config import CONFIG_JSON_SCHEMA
|
||||||
from pre_commit.clientlib.validate_config import validate_config_extra
|
from pre_commit.clientlib.validate_config import validate_config_extra
|
||||||
from pre_commit.jsonschema_extensions import apply_defaults
|
from pre_commit.jsonschema_extensions import apply_defaults
|
||||||
|
from pre_commit.languages.python import PythonEnv
|
||||||
from pre_commit.repository import Repository
|
from pre_commit.repository import Repository
|
||||||
from pre_commit.util import cmd_output
|
from pre_commit.util import cmd_output
|
||||||
from pre_commit.util import cwd
|
from pre_commit.util import cwd
|
||||||
|
|
@ -266,6 +268,35 @@ def test_reinstall(tmpdir_factory, store):
|
||||||
repo.require_installed()
|
repo.require_installed()
|
||||||
|
|
||||||
|
|
||||||
|
def test_control_c_control_c_on_install(tmpdir_factory, store):
|
||||||
|
"""Regression test for #186."""
|
||||||
|
path = make_repo(tmpdir_factory, 'python_hooks_repo')
|
||||||
|
config = make_config_from_repo(path)
|
||||||
|
repo = Repository.create(config, store)
|
||||||
|
hook = repo.hooks[0][1]
|
||||||
|
|
||||||
|
class MyKeyboardInterrupt(KeyboardInterrupt):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# To simulate a killed install, we'll make PythonEnv.run raise ^C
|
||||||
|
# and then to simulate a second ^C during cleanup, we'll make shutil.rmtree
|
||||||
|
# raise as well.
|
||||||
|
with pytest.raises(MyKeyboardInterrupt):
|
||||||
|
with mock.patch.object(
|
||||||
|
PythonEnv, 'run', side_effect=MyKeyboardInterrupt,
|
||||||
|
):
|
||||||
|
with mock.patch.object(shutil, 'rmtree', MyKeyboardInterrupt):
|
||||||
|
repo.run_hook(hook, [])
|
||||||
|
|
||||||
|
# Should have made an environment, however this environment is broken!
|
||||||
|
assert os.path.exists(repo.cmd_runner.path('py_env'))
|
||||||
|
|
||||||
|
# However, it should be perfectly runnable (reinstall after botched
|
||||||
|
# install)
|
||||||
|
retv, stdout, stderr = repo.run_hook(hook, [])
|
||||||
|
assert retv == 0
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.integration
|
@pytest.mark.integration
|
||||||
def test_really_long_file_paths(tmpdir_factory, store):
|
def test_really_long_file_paths(tmpdir_factory, store):
|
||||||
base_path = tmpdir_factory.get()
|
base_path = tmpdir_factory.get()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue