Docker hook support for pre-commit

This commit is contained in:
Ben Picolo 2017-01-03 16:47:59 -05:00
parent 8837cfa7ff
commit 5f392f0ba5
2 changed files with 64 additions and 0 deletions

View file

@ -1,5 +1,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from pre_commit.languages import docker
from pre_commit.languages import node from pre_commit.languages import node
from pre_commit.languages import pcre from pre_commit.languages import pcre
from pre_commit.languages import python from pre_commit.languages import python
@ -40,6 +41,7 @@ from pre_commit.languages import system
# """ # """
languages = { languages = {
'docker': docker,
'node': node, 'node': node,
'pcre': pcre, 'pcre': pcre,
'python': python, 'python': python,

View file

@ -0,0 +1,62 @@
from __future__ import unicode_literals
import hashlib
import os
from pre_commit.languages import helpers
from pre_commit.util import clean_path_on_failure
from pre_commit.util import mkdirp
from pre_commit.xargs import xargs
ENVIRONMENT_DIR = 'docker'
def md5(s):
m = hashlib.md5()
m.update(s)
return m.hexdigest()
def docker_tag(repo_cmd_runner):
return 'pre-commit-{}'.format(
md5(os.path.basename(repo_cmd_runner.path()))
).lower()
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=(),
):
assert repo_cmd_runner.exists('Dockerfile')
# I don't know of anybody trying to juggle multiple docker installations
# so this seems sufficient
directory = helpers.environment_dir(ENVIRONMENT_DIR, 'default')
mkdirp(os.path.join(repo_cmd_runner.path(), directory))
cmd = (
'docker', 'build', '--pull',
'--tag', docker_tag(repo_cmd_runner),
'.'
)
# Docker doesn't really have relevant disk environment, but pre-commit
# still needs to cleanup it's state files on failure
env_dir = repo_cmd_runner.path(directory)
with clean_path_on_failure(env_dir):
helpers.run_setup_cmd(repo_cmd_runner, cmd)
def run_hook(repo_cmd_runner, hook, file_args):
cmd = (
'docker', 'run',
'-t',
'-v', '{}:/src'.format(os.getcwd()),
'--workdir', '/src',
docker_tag(repo_cmd_runner)
)
return xargs(
cmd + (hook['entry'],) + tuple(hook['args']), file_args,
)