Merge pull request #295 from blarghmatey/install_dependencies

Added the additional_dependencies config parameter
This commit is contained in:
Anthony Sottile
2015-11-23 12:08:15 -08:00
11 changed files with 132 additions and 17 deletions

View File

@@ -39,6 +39,10 @@ CONFIG_JSON_SCHEMA = {
'type': 'array',
'items': {'type': 'string'},
},
'additional_dependencies': {
'type': 'array',
'items': {'type': 'string'}
}
},
'required': ['id'],
}

View File

@@ -12,7 +12,11 @@ from pre_commit.languages import system
# # Use None for no environment
# ENVIRONMENT_DIR = 'foo_env'
#
# def install_environment(repo_cmd_runner, version='default'):
# def install_environment(
# repo_cmd_runner,
# version='default',
# additional_dependencies=None,
# ):
# """Installs a repository in the given repository. Note that the current
# working directory will already be inside the repository.
#

View File

@@ -5,6 +5,7 @@ import sys
from pre_commit.languages import helpers
from pre_commit.util import clean_path_on_failure
from pre_commit.util import shell_escape
ENVIRONMENT_DIR = 'node_env'
@@ -23,7 +24,11 @@ def in_env(repo_cmd_runner, language_version):
yield NodeEnv(repo_cmd_runner, language_version)
def install_environment(repo_cmd_runner, version='default'):
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=None,
):
assert repo_cmd_runner.exists('package.json')
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
@@ -41,6 +46,13 @@ def install_environment(repo_cmd_runner, version='default'):
with in_env(repo_cmd_runner, version) as node_env:
node_env.run("cd '{prefix}' && npm install -g")
if additional_dependencies:
node_env.run(
"cd '{prefix}' && npm install -g " +
' '.join(
shell_escape(dep) for dep in additional_dependencies
)
)
def run_hook(repo_cmd_runner, hook, file_args):

View File

@@ -9,7 +9,11 @@ from pre_commit.util import shell_escape
ENVIRONMENT_DIR = None
def install_environment(repo_cmd_runner, version='default'):
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=None,
):
"""Installation for pcre type is a noop."""
raise AssertionError('Cannot install pcre repo.')

View File

@@ -9,6 +9,7 @@ import virtualenv
from pre_commit.languages import helpers
from pre_commit.util import clean_path_on_failure
from pre_commit.util import shell_escape
ENVIRONMENT_DIR = 'py_env'
@@ -42,7 +43,11 @@ def norm_version(version):
return version
def install_environment(repo_cmd_runner, version='default'):
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=None,
):
assert repo_cmd_runner.exists('setup.py')
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
@@ -57,6 +62,13 @@ def install_environment(repo_cmd_runner, version='default'):
repo_cmd_runner.run(venv_cmd)
with in_env(repo_cmd_runner, version) as env:
env.run("cd '{prefix}' && pip install .")
if additional_dependencies:
env.run(
"cd '{prefix}' && pip install " +
' '.join(
shell_escape(dep) for dep in additional_dependencies
)
)
def run_hook(repo_cmd_runner, hook, file_args):

View File

@@ -8,6 +8,7 @@ from pre_commit.languages import helpers
from pre_commit.util import CalledProcessError
from pre_commit.util import clean_path_on_failure
from pre_commit.util import resource_filename
from pre_commit.util import shell_escape
from pre_commit.util import tarfile_open
@@ -78,7 +79,11 @@ def _install_ruby(environment, version):
environment.run('rbenv install {0}'.format(version))
def install_environment(repo_cmd_runner, version='default'):
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=None,
):
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
with clean_path_on_failure(repo_cmd_runner.path(directory)):
# TODO: this currently will fail if there's no version specified and
@@ -88,9 +93,16 @@ def install_environment(repo_cmd_runner, version='default'):
if version != 'default':
_install_ruby(ruby_env, version)
ruby_env.run(
'cd {prefix} && gem build *.gemspec'
' && gem install --no-ri --no-rdoc *.gem',
'cd {prefix} && gem build *.gemspec && '
'gem install --no-ri --no-rdoc *.gem',
)
if additional_dependencies:
ruby_env.run(
'cd {prefix} && gem install --no-ri --no-rdoc ' +
' '.join(
shell_escape(dep) for dep in additional_dependencies
)
)
def run_hook(repo_cmd_runner, hook, file_args):

View File

@@ -6,7 +6,11 @@ from pre_commit.languages.helpers import file_args_to_stdin
ENVIRONMENT_DIR = None
def install_environment(repo_cmd_runner, version='default'):
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=None,
):
"""Installation for script type is a noop."""
raise AssertionError('Cannot install script repo.')
@@ -14,7 +18,6 @@ def install_environment(repo_cmd_runner, version='default'):
def run_hook(repo_cmd_runner, hook, file_args):
return repo_cmd_runner.run(
['xargs', '-0', '{{prefix}}{0}'.format(hook['entry'])] + hook['args'],
# TODO: this is duplicated in pre_commit/languages/helpers.py
stdin=file_args_to_stdin(file_args),
retcode=None,
encoding=None,

View File

@@ -8,7 +8,11 @@ from pre_commit.languages.helpers import file_args_to_stdin
ENVIRONMENT_DIR = None
def install_environment(repo_cmd_runner, version='default'):
def install_environment(
repo_cmd_runner,
version='default',
additional_dependencies=None,
):
"""Installation for system type is a noop."""
raise AssertionError('Cannot install system repo.')

View File

@@ -2,6 +2,7 @@ from __future__ import unicode_literals
import logging
import shutil
from collections import defaultdict
from cached_property import cached_property
@@ -49,6 +50,14 @@ class Repository(object):
for _, hook in self.hooks
)
@cached_property
def additional_dependencies(self):
dep_dict = defaultdict(lambda: defaultdict(set))
for _, hook in self.hooks:
dep_dict[hook['language']][hook['language_version']].update(
hook.get('additional_dependencies', []))
return dep_dict
@cached_property
def hooks(self):
# TODO: merging in manifest dicts is a smell imo
@@ -107,7 +116,9 @@ class Repository(object):
if self.cmd_runner.exists(directory):
shutil.rmtree(self.cmd_runner.path(directory))
language.install_environment(self.cmd_runner, language_version)
language.install_environment(
self.cmd_runner, language_version,
self.additional_dependencies[language_name][language_version])
# Touch the .installed file (atomic) to indicate we've installed
open(self.cmd_runner.path(directory, '.installed'), 'w').close()