Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pre_commit/languages/all.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import unicode_literals

from pre_commit.languages import docker
from pre_commit.languages import docker_image
from pre_commit.languages import golang
from pre_commit.languages import node
from pre_commit.languages import pcre
Expand Down Expand Up @@ -49,6 +50,7 @@

languages = {
'docker': docker,
'docker_image': docker_image,
'golang': golang,
'node': node,
'pcre': pcre,
Expand Down
24 changes: 13 additions & 11 deletions pre_commit/languages/docker.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,23 +77,25 @@ def install_environment(
os.mkdir(directory)


def docker_cmd():
return (
'docker', 'run',
'--rm',
'-u', '{}:{}'.format(os.getuid(), os.getgid()),
'-v', '{}:/src:rw'.format(os.getcwd()),
'--workdir', '/src',
)


def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
assert_docker_available()
# Rebuild the docker image in case it has gone missing, as many people do
# automated cleanup of docker images.
build_docker_image(repo_cmd_runner, pull=False)

hook_cmd = helpers.to_cmd(hook)
entry_executable, cmd_rest = hook_cmd[0], hook_cmd[1:]

cmd = (
'docker', 'run',
'--rm',
'-u', '{}:{}'.format(os.getuid(), os.getgid()),
'-v', '{}:/src:rw'.format(os.getcwd()),
'--workdir', '/src',
'--entrypoint', entry_executable,
docker_tag(repo_cmd_runner),
) + cmd_rest
entry_exe, cmd_rest = hook_cmd[0], hook_cmd[1:]

entry_tag = ('--entrypoint', entry_exe, docker_tag(repo_cmd_runner))
cmd = docker_cmd() + entry_tag + cmd_rest
return xargs(cmd, file_args)
19 changes: 19 additions & 0 deletions pre_commit/languages/docker_image.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from __future__ import absolute_import
from __future__ import unicode_literals

from pre_commit.languages import helpers
from pre_commit.languages.docker import assert_docker_available
from pre_commit.languages.docker import docker_cmd
from pre_commit.xargs import xargs


ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy
install_environment = helpers.no_install


def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
assert_docker_available()
cmd = docker_cmd() + helpers.to_cmd(hook)
return xargs(cmd, file_args)
4 changes: 4 additions & 0 deletions pre_commit/languages/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,7 @@ def basic_get_default_version():

def basic_healthy(repo_cmd_runner, language_version):
return True


def no_install(repo_cmd_runner, version, additional_dependencies):
raise AssertionError('This type is not installable')
6 changes: 1 addition & 5 deletions pre_commit/languages/pcre.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@
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):
"""Installation for pcre type is a noop."""
raise AssertionError('Cannot install pcre repo.')
install_environment = helpers.no_install


def run_hook(repo_cmd_runner, hook, file_args):
Expand Down
6 changes: 1 addition & 5 deletions pre_commit/languages/script.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,7 @@
ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy


def install_environment(repo_cmd_runner, version, additional_dependencies):
"""Installation for script type is a noop."""
raise AssertionError('Cannot install script repo.')
install_environment = helpers.no_install


def run_hook(repo_cmd_runner, hook, file_args):
Expand Down
6 changes: 1 addition & 5 deletions pre_commit/languages/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,7 @@
ENVIRONMENT_DIR = None
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy


def install_environment(repo_cmd_runner, version, additional_dependencies):
"""Installation for system type is a noop."""
raise AssertionError('Cannot install system repo.')
install_environment = helpers.no_install


def run_hook(repo_cmd_runner, hook, file_args):
Expand Down
4 changes: 2 additions & 2 deletions pre_commit/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,8 @@ class LocalRepository(Repository):
def _cmd_runner_from_deps(self, language_name, deps):
"""local repositories have a cmd runner per hook"""
language = languages[language_name]
# pcre / script / system do not have environments so they work out
# of the current directory
# pcre / script / system / docker_image do not have environments so
# they work out of the current directory
if language.ENVIRONMENT_DIR is None:
return PrefixedCommandRunner(git.get_root())
else:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
- id: echo-entrypoint
name: echo (via --entrypoint)
language: docker_image
entry: --entrypoint echo cogniteev/echo
- id: echo-cmd
name: echo (via cmd)
language: docker_image
entry: cogniteev/echo echo
12 changes: 12 additions & 0 deletions tests/repository_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,18 @@ def test_run_a_failing_docker_hook(tempdir_factory, store):
)


@skipif_slowtests_false
@skipif_cant_run_docker
@pytest.mark.integration
@pytest.mark.parametrize('hook_id', ('echo-entrypoint', 'echo-cmd'))
def test_run_a_docker_image_hook(tempdir_factory, store, hook_id):
_test_hook_repo(
tempdir_factory, store, 'docker_image_hooks_repo',
hook_id,
['Hello World from docker'], b'Hello World from docker\n',
)


@skipif_slowtests_false
@xfailif_windows_no_node
@pytest.mark.integration
Expand Down