From 6498321e1ebbf63793faa5e05bfe9f3a91183573 Mon Sep 17 00:00:00 2001 From: Ken Struys Date: Thu, 13 Mar 2014 16:29:59 -0700 Subject: [PATCH] added more integration with git repo creation --- pre_commit/git.py | 50 ++++++++++++++++++---- tests/git_test.py | 104 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 142 insertions(+), 12 deletions(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index e5bb2132..47323436 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -1,5 +1,8 @@ import os import pkg_resources +import contextlib + +import pre_commit.constants as C from plumbum import local @@ -11,11 +14,11 @@ def get_pre_commit_path(): return os.path.join(get_root(), '.git/hooks/pre-commit') -def get_env_path(): - return os.path.join(get_root(), '.pre-commit') +def get_pre_commit_dir_path(): + return os.path.join(get_root(), C.PRE_COMMIT_DIR) def create_pre_commit_package_dir(): - local.path(get_root() + '/.pre-commit').mkdir() + local.path(get_pre_commit_dir_path()).mkdir() def create_pre_commit(): path = get_pre_commit_path() @@ -26,11 +29,40 @@ def create_pre_commit(): def remove_pre_commit(): local.path(get_pre_commit_path()).delete() -def create_repo_in_env(name, git_repo_path): - create_pre_commit_package_dir() - env_path = get_env_path() +class PreCommitProject(object): + + def __init__(self, git_repo_path, sha): + self.git_repo_path = git_repo_path + self.sha = sha + + @contextlib.contextmanager + def in_checkout(self): + with local.cwd(get_pre_commit_dir_path()): + with local.cwd(self.sha): + yield + + def create(self): + create_pre_commit_package_dir() + + with local.cwd(get_pre_commit_dir_path()): + local['git']['clone', self.git_repo_path, self.sha]() + with self.in_checkout(): + local['git']['checkout', self.sha]() + + def install(self): + with self.in_checkout(): + if local.path('setup.py').exists(): + local['virtualenv']['py_env']() + local['bash'][local['pip']['install', '.']] + +def create_repo_in_env(git_repo_path, sha): + project = PreCommitProject(git_repo_path, sha) + project.create() + +def install_pre_commit(git_repo_path, sha): + project = PreCommitProject(git_repo_path, sha) + project.create() + project.install() + - with local.cwd(env_path): - local['git']['clone', git_repo_path, name]() - print local.cwd.getpath() diff --git a/tests/git_test.py b/tests/git_test.py index 11c0454a..5cfd5e79 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -5,6 +5,17 @@ import pytest from plumbum import local from pre_commit import git +import pre_commit.constants as C + +def add_and_commit(): + local['git']['add', '.']() + local['git']['commit', '-m', 'random commit']() + + +def get_sha(git_repo): + with local.cwd(git_repo): + return (local['git']['log', '--format="%H"'] | local['head']['-n1'])().strip('"\n') + @pytest.yield_fixture def empty_git_dir(tmpdir): @@ -16,11 +27,66 @@ def empty_git_dir(tmpdir): @pytest.yield_fixture def dummy_git_repo(empty_git_dir): local['touch']['dummy']() - local['git']['add', 'dummy']() - local['git']['commit', '-m', 'dummy commit']() + add_and_commit() yield empty_git_dir + +@pytest.yield_fixture +def dummy_pre_commit_hooks_git_repo(dummy_git_repo): + local.path(C.MANIFEST_FILE).write(""" +hooks: + - + id: foo + name: Foo + entry: foo + language: python>2.6 + """) + + add_and_commit() + + yield dummy_git_repo + +@pytest.yield_fixture +def python_pre_commit_git_repo(dummy_pre_commit_hooks_git_repo): + local.path('setup.py').write( +""" +from setuptools import find_packages +from setuptools import setup + +setup( + name='Foo', + version='0.0.0', + packages=find_packages('.'), + entry_points={ + 'console_scripts': [ + 'entry = foo.main:func' + ], + } +) +""" + ) + + foo_module = local.path('foo') + + foo_module.mkdir() + + with local.cwd(foo_module): + local.path('__init__.py').write('') + local.path('main.py').write( +""" + +def func(): + return 0 + +""" + ) + + add_and_commit() + + yield dummy_pre_commit_hooks_git_repo + + def test_get_root(empty_git_dir): assert git.get_root() == empty_git_dir @@ -52,4 +118,36 @@ def test_remove_pre_commit(empty_git_dir): def test_create_repo_in_env(empty_git_dir, dummy_git_repo): - git.create_repo_in_env('pre-commit', dummy_git_repo) \ No newline at end of file + sha = get_sha(dummy_git_repo) + git.create_repo_in_env(dummy_git_repo, sha) + assert os.path.exists(os.path.join(dummy_git_repo, C.PRE_COMMIT_DIR, sha)) + + +def test_install_python_repo_in_env(empty_git_dir, python_pre_commit_git_repo): + sha = get_sha(python_pre_commit_git_repo) + git.install_pre_commit(python_pre_commit_git_repo, sha) + assert os.path.exists(os.path.join(python_pre_commit_git_repo, C.PRE_COMMIT_DIR, sha, 'py_env')) + + +# def install_config(): +# config = [ +# { +# 'repo': 'repo1', +# 'sha': 'dsfjksljfslkf', +# 'hooks': [ +# { +# 'id': 'script', +# 'args': [ +# { +# 'type': 'files', +# 'opt': '*.py' +# }, +# ] +# } +# ], +# }, +# ] +# for repo in config: +# clone(repo) +# for +