Merge pull request #598 from pre-commit/docker_image_language

Add new docker_image language type.
This commit is contained in:
Anthony Sottile
2017-09-02 20:44:15 -07:00
committed by GitHub
10 changed files with 63 additions and 28 deletions

View File

@@ -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
@@ -49,6 +50,7 @@ from pre_commit.languages import system
languages = {
'docker': docker,
'docker_image': docker_image,
'golang': golang,
'node': node,
'pcre': pcre,

View File

@@ -77,6 +77,16 @@ 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
@@ -84,16 +94,8 @@ def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
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)

View File

@@ -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)

View File

@@ -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')

View File

@@ -10,11 +10,7 @@ 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):
"""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):

View File

@@ -7,11 +7,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):
"""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):

View File

@@ -7,11 +7,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):
"""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):

View File

@@ -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:

View File

@@ -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

View File

@@ -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