From b7bd825e15166036f28d42f8f4c395a76ae2c23c Mon Sep 17 00:00:00 2001 From: Ben Picolo Date: Thu, 5 Jan 2017 09:31:22 -0500 Subject: [PATCH 1/3] Support docker hooks with args --- pre_commit/languages/docker.py | 9 ++++++--- testing/resources/docker_hooks_repo/hooks.yaml | 6 ++++++ tests/repository_test.py | 11 +++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index d335b351..68061ab2 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -81,14 +81,17 @@ def run_hook(repo_cmd_runner, hook, file_args): # 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) + + entry_parts = hook['entry'].split(' ') + entry_executable, entry_args = entry_parts[0], entry_parts[1:] + cmd = ( 'docker', 'run', '--rm', - '-u', '{}:{}'.format(os.getuid(), os.getgid()), '-v', '{}:/src:rw'.format(os.getcwd()), '--workdir', '/src', - '--entrypoint', hook['entry'], + '--entrypoint', entry_executable, docker_tag(repo_cmd_runner) ) - return xargs(cmd + tuple(hook['args']), file_args) + return xargs(cmd + tuple(entry_args) + tuple(hook['args']), file_args) diff --git a/testing/resources/docker_hooks_repo/hooks.yaml b/testing/resources/docker_hooks_repo/hooks.yaml index 2c9a115d..52957396 100644 --- a/testing/resources/docker_hooks_repo/hooks.yaml +++ b/testing/resources/docker_hooks_repo/hooks.yaml @@ -4,6 +4,12 @@ language: docker files: \.txt$ +- id: docker-hook-arg + name: Docker test hook + entry: echo -n + language: docker + files: \.txt$ + - id: docker-hook-failing name: Docker test hook with nonzero exit code entry: bork diff --git a/tests/repository_test.py b/tests/repository_test.py index 5d8ed8ab..ad3c8234 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -141,6 +141,17 @@ def test_run_a_docker_hook(tempdir_factory, store): ) +@skipif_slowtests_false +@skipif_cant_run_docker +@pytest.mark.integration +def test_run_a_docker_hook_with_entry_args(tempdir_factory, store): + _test_hook_repo( + tempdir_factory, store, 'docker_hooks_repo', + 'docker-hook-arg', + ['Hello World from docker'], b'Hello World from docker', + ) + + @skipif_slowtests_false @skipif_cant_run_docker @pytest.mark.integration From 54d212f0d7af718d2dcf5a7cbf5061883374f2a1 Mon Sep 17 00:00:00 2001 From: Ben Picolo Date: Thu, 5 Jan 2017 10:52:31 -0500 Subject: [PATCH 2/3] Use shlex.split --- pre_commit/languages/docker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 68061ab2..b60c5f56 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import hashlib import os +import shlex from pre_commit import five from pre_commit.languages import helpers @@ -82,7 +83,7 @@ def run_hook(repo_cmd_runner, hook, file_args): # automated cleanup of docker images. build_docker_image(repo_cmd_runner, pull=False) - entry_parts = hook['entry'].split(' ') + entry_parts = shlex.split(hook['entry']) entry_executable, entry_args = entry_parts[0], entry_parts[1:] cmd = ( From 8cbd56a0a52b8a45c8c973037d590858e21658b5 Mon Sep 17 00:00:00 2001 From: Ben Picolo Date: Thu, 5 Jan 2017 12:55:08 -0500 Subject: [PATCH 3/3] Put user back where it was --- pre_commit/languages/docker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index b60c5f56..ea415c94 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -89,6 +89,7 @@ def run_hook(repo_cmd_runner, hook, file_args): cmd = ( 'docker', 'run', '--rm', + '-u', '{}:{}'.format(os.getuid(), os.getgid()), '-v', '{}:/src:rw'.format(os.getcwd()), '--workdir', '/src', '--entrypoint', entry_executable,