Skip to content

Commit 9c3bbec

Browse files
committed
Add new docker_image language type.
`docker_image` is intended to be a lightweight hook type similar to system / script which allows one to use an existing docker image which provides a hook.
1 parent 491b905 commit 9c3bbec

File tree

10 files changed

+63
-28
lines changed

10 files changed

+63
-28
lines changed

pre_commit/languages/all.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import unicode_literals
22

33
from pre_commit.languages import docker
4+
from pre_commit.languages import docker_image
45
from pre_commit.languages import golang
56
from pre_commit.languages import node
67
from pre_commit.languages import pcre
@@ -49,6 +50,7 @@
4950

5051
languages = {
5152
'docker': docker,
53+
'docker_image': docker_image,
5254
'golang': golang,
5355
'node': node,
5456
'pcre': pcre,

pre_commit/languages/docker.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,23 +77,25 @@ def install_environment(
7777
os.mkdir(directory)
7878

7979

80+
def docker_cmd():
81+
return (
82+
'docker', 'run',
83+
'--rm',
84+
'-u', '{}:{}'.format(os.getuid(), os.getgid()),
85+
'-v', '{}:/src:rw'.format(os.getcwd()),
86+
'--workdir', '/src',
87+
)
88+
89+
8090
def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
8191
assert_docker_available()
8292
# Rebuild the docker image in case it has gone missing, as many people do
8393
# automated cleanup of docker images.
8494
build_docker_image(repo_cmd_runner, pull=False)
8595

8696
hook_cmd = helpers.to_cmd(hook)
87-
entry_executable, cmd_rest = hook_cmd[0], hook_cmd[1:]
88-
89-
cmd = (
90-
'docker', 'run',
91-
'--rm',
92-
'-u', '{}:{}'.format(os.getuid(), os.getgid()),
93-
'-v', '{}:/src:rw'.format(os.getcwd()),
94-
'--workdir', '/src',
95-
'--entrypoint', entry_executable,
96-
docker_tag(repo_cmd_runner),
97-
) + cmd_rest
97+
entry_exe, cmd_rest = hook_cmd[0], hook_cmd[1:]
9898

99+
entry_tag = ('--entrypoint', entry_exe, docker_tag(repo_cmd_runner))
100+
cmd = docker_cmd() + entry_tag + cmd_rest
99101
return xargs(cmd, file_args)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from __future__ import absolute_import
2+
from __future__ import unicode_literals
3+
4+
from pre_commit.languages import helpers
5+
from pre_commit.languages.docker import assert_docker_available
6+
from pre_commit.languages.docker import docker_cmd
7+
from pre_commit.xargs import xargs
8+
9+
10+
ENVIRONMENT_DIR = None
11+
get_default_version = helpers.basic_get_default_version
12+
healthy = helpers.basic_healthy
13+
install_environment = helpers.no_install
14+
15+
16+
def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
17+
assert_docker_available()
18+
cmd = docker_cmd() + helpers.to_cmd(hook)
19+
return xargs(cmd, file_args)

pre_commit/languages/helpers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,7 @@ def basic_get_default_version():
4141

4242
def basic_healthy(repo_cmd_runner, language_version):
4343
return True
44+
45+
46+
def no_install(repo_cmd_runner, version, additional_dependencies):
47+
raise AssertionError('This type is not installable')

pre_commit/languages/pcre.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@
1010
GREP = 'ggrep' if sys.platform == 'darwin' else 'grep'
1111
get_default_version = helpers.basic_get_default_version
1212
healthy = helpers.basic_healthy
13-
14-
15-
def install_environment(repo_cmd_runner, version, additional_dependencies):
16-
"""Installation for pcre type is a noop."""
17-
raise AssertionError('Cannot install pcre repo.')
13+
install_environment = helpers.no_install
1814

1915

2016
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/script.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
ENVIRONMENT_DIR = None
88
get_default_version = helpers.basic_get_default_version
99
healthy = helpers.basic_healthy
10-
11-
12-
def install_environment(repo_cmd_runner, version, additional_dependencies):
13-
"""Installation for script type is a noop."""
14-
raise AssertionError('Cannot install script repo.')
10+
install_environment = helpers.no_install
1511

1612

1713
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/system.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
ENVIRONMENT_DIR = None
88
get_default_version = helpers.basic_get_default_version
99
healthy = helpers.basic_healthy
10-
11-
12-
def install_environment(repo_cmd_runner, version, additional_dependencies):
13-
"""Installation for system type is a noop."""
14-
raise AssertionError('Cannot install system repo.')
10+
install_environment = helpers.no_install
1511

1612

1713
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/repository.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ class LocalRepository(Repository):
202202
def _cmd_runner_from_deps(self, language_name, deps):
203203
"""local repositories have a cmd runner per hook"""
204204
language = languages[language_name]
205-
# pcre / script / system do not have environments so they work out
206-
# of the current directory
205+
# pcre / script / system / docker_image do not have environments so
206+
# they work out of the current directory
207207
if language.ENVIRONMENT_DIR is None:
208208
return PrefixedCommandRunner(git.get_root())
209209
else:
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- id: echo-entrypoint
2+
name: echo (via --entrypoint)
3+
language: docker_image
4+
entry: --entrypoint echo cogniteev/echo
5+
- id: echo-cmd
6+
name: echo (via cmd)
7+
language: docker_image
8+
entry: cogniteev/echo echo

tests/repository_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,18 @@ def test_run_a_failing_docker_hook(tempdir_factory, store):
164164
)
165165

166166

167+
@skipif_slowtests_false
168+
@skipif_cant_run_docker
169+
@pytest.mark.integration
170+
@pytest.mark.parametrize('hook_id', ('echo-entrypoint', 'echo-cmd'))
171+
def test_run_a_docker_image_hook(tempdir_factory, store, hook_id):
172+
_test_hook_repo(
173+
tempdir_factory, store, 'docker_image_hooks_repo',
174+
hook_id,
175+
['Hello World from docker'], b'Hello World from docker\n',
176+
)
177+
178+
167179
@skipif_slowtests_false
168180
@xfailif_windows_no_node
169181
@pytest.mark.integration

0 commit comments

Comments
 (0)