mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-01-23 01:10:04 -06:00
Each set of additional dependencies gets its own env
This commit is contained in:
@@ -33,9 +33,9 @@ def _update_repo(repo_config, runner, tags_only):
|
||||
Args:
|
||||
repo_config - A config for a repository
|
||||
"""
|
||||
repo = Repository.create(repo_config, runner.store)
|
||||
repo_path = runner.store.clone(repo_config['repo'], repo_config['sha'])
|
||||
|
||||
with cwd(repo._repo_path):
|
||||
with cwd(repo_path):
|
||||
cmd_output('git', 'fetch')
|
||||
tag_cmd = ('git', 'describe', 'origin/master', '--tags')
|
||||
if tags_only:
|
||||
@@ -57,7 +57,7 @@ def _update_repo(repo_config, runner, tags_only):
|
||||
new_repo = Repository.create(new_config, runner.store)
|
||||
|
||||
# See if any of our hooks were deleted with the new commits
|
||||
hooks = {hook['id'] for hook in repo.repo_config['hooks']}
|
||||
hooks = {hook['id'] for hook in repo_config['hooks']}
|
||||
hooks_missing = hooks - (hooks & set(new_repo.manifest_hooks))
|
||||
if hooks_missing:
|
||||
raise RepositoryCannotBeUpdatedError(
|
||||
|
||||
@@ -7,7 +7,6 @@ import os
|
||||
import pipes
|
||||
import shutil
|
||||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
import pkg_resources
|
||||
from cached_property import cached_property
|
||||
@@ -149,22 +148,11 @@ class Repository(object):
|
||||
else:
|
||||
return cls(config, store)
|
||||
|
||||
@cached_property
|
||||
def _repo_path(self):
|
||||
return self.store.clone(
|
||||
self.repo_config['repo'], self.repo_config['sha'],
|
||||
)
|
||||
|
||||
@cached_property
|
||||
def _prefix(self):
|
||||
return Prefix(self._repo_path)
|
||||
|
||||
def _prefix_from_deps(self, language_name, deps):
|
||||
return self._prefix
|
||||
|
||||
@cached_property
|
||||
def manifest_hooks(self):
|
||||
manifest_path = os.path.join(self._repo_path, C.MANIFEST_FILE)
|
||||
repo, sha = self.repo_config['repo'], self.repo_config['sha']
|
||||
repo_path = self.store.clone(repo, sha)
|
||||
manifest_path = os.path.join(repo_path, C.MANIFEST_FILE)
|
||||
return {hook['id']: hook for hook in load_manifest(manifest_path)}
|
||||
|
||||
@cached_property
|
||||
@@ -185,21 +173,25 @@ class Repository(object):
|
||||
for hook in self.repo_config['hooks']
|
||||
)
|
||||
|
||||
@cached_property
|
||||
def _prefix_from_deps(self, language_name, deps):
|
||||
repo, sha = self.repo_config['repo'], self.repo_config['sha']
|
||||
return Prefix(self.store.clone(repo, sha, deps))
|
||||
|
||||
def _venvs(self):
|
||||
deps_dict = defaultdict(_UniqueList)
|
||||
for _, hook in self.hooks:
|
||||
deps_dict[(hook['language'], hook['language_version'])].update(
|
||||
hook['additional_dependencies'],
|
||||
)
|
||||
ret = []
|
||||
for (language, version), deps in deps_dict.items():
|
||||
ret.append((self._prefix, language, version, deps))
|
||||
for _, hook in self.hooks:
|
||||
language = hook['language']
|
||||
version = hook['language_version']
|
||||
deps = hook['additional_dependencies']
|
||||
ret.append((
|
||||
self._prefix_from_deps(language, deps),
|
||||
language, version, deps,
|
||||
))
|
||||
return tuple(ret)
|
||||
|
||||
def require_installed(self):
|
||||
if not self.__installed:
|
||||
_install_all(self._venvs, self.repo_config['repo'], self.store)
|
||||
_install_all(self._venvs(), self.repo_config['repo'], self.store)
|
||||
self.__installed = True
|
||||
|
||||
def run_hook(self, hook, file_args):
|
||||
@@ -237,19 +229,6 @@ class LocalRepository(Repository):
|
||||
for hook in self.repo_config['hooks']
|
||||
)
|
||||
|
||||
@cached_property
|
||||
def _venvs(self):
|
||||
ret = []
|
||||
for _, hook in self.hooks:
|
||||
language = hook['language']
|
||||
version = hook['language_version']
|
||||
deps = hook['additional_dependencies']
|
||||
ret.append((
|
||||
self._prefix_from_deps(language, deps),
|
||||
language, version, deps,
|
||||
))
|
||||
return tuple(ret)
|
||||
|
||||
|
||||
class MetaRepository(LocalRepository):
|
||||
@cached_property
|
||||
@@ -303,14 +282,3 @@ class MetaRepository(LocalRepository):
|
||||
(hook['id'], _hook(self.manifest_hooks[hook['id']], hook))
|
||||
for hook in self.repo_config['hooks']
|
||||
)
|
||||
|
||||
|
||||
class _UniqueList(list):
|
||||
def __init__(self):
|
||||
self._set = set()
|
||||
|
||||
def update(self, obj):
|
||||
for item in obj:
|
||||
if item not in self._set:
|
||||
self._set.add(item)
|
||||
self.append(item)
|
||||
|
||||
@@ -72,9 +72,9 @@ class Store(object):
|
||||
with contextlib.closing(sqlite3.connect(tmpfile)) as db:
|
||||
db.executescript(
|
||||
'CREATE TABLE repos ('
|
||||
' repo CHAR(255) NOT NULL,'
|
||||
' ref CHAR(255) NOT NULL,'
|
||||
' path CHAR(255) NOT NULL,'
|
||||
' repo TEXT NOT NULL,'
|
||||
' ref TEXT NOT NULL,'
|
||||
' path TEXT NOT NULL,'
|
||||
' PRIMARY KEY (repo, ref)'
|
||||
');',
|
||||
)
|
||||
@@ -101,15 +101,17 @@ class Store(object):
|
||||
self._create()
|
||||
self.__created = True
|
||||
|
||||
def _new_repo(self, repo, ref, make_strategy):
|
||||
def _new_repo(self, repo, ref, deps, make_strategy):
|
||||
self.require_created()
|
||||
if deps:
|
||||
repo = '{}:{}'.format(repo, ','.join(sorted(deps)))
|
||||
|
||||
def _get_result():
|
||||
# Check if we already exist
|
||||
with sqlite3.connect(self.db_path) as db:
|
||||
result = db.execute(
|
||||
'SELECT path FROM repos WHERE repo = ? AND ref = ?',
|
||||
[repo, ref],
|
||||
(repo, ref),
|
||||
).fetchone()
|
||||
if result:
|
||||
return result[0]
|
||||
@@ -137,7 +139,7 @@ class Store(object):
|
||||
)
|
||||
return directory
|
||||
|
||||
def clone(self, repo, ref):
|
||||
def clone(self, repo, ref, deps=()):
|
||||
"""Clone the given url and checkout the specific ref."""
|
||||
def clone_strategy(directory):
|
||||
cmd_output(
|
||||
@@ -151,7 +153,7 @@ class Store(object):
|
||||
env=no_git_env(),
|
||||
)
|
||||
|
||||
return self._new_repo(repo, ref, clone_strategy)
|
||||
return self._new_repo(repo, ref, deps, clone_strategy)
|
||||
|
||||
def make_local(self, deps):
|
||||
def make_local_strategy(directory):
|
||||
@@ -172,8 +174,7 @@ class Store(object):
|
||||
_git_cmd('commit', '--no-edit', '--no-gpg-sign', '-n', '-minit')
|
||||
|
||||
return self._new_repo(
|
||||
'local:{}'.format(','.join(sorted(deps))), C.LOCAL_REPO_VERSION,
|
||||
make_local_strategy,
|
||||
'local', C.LOCAL_REPO_VERSION, deps, make_local_strategy,
|
||||
)
|
||||
|
||||
@cached_property
|
||||
|
||||
Reference in New Issue
Block a user