Simplify the install and uninstall commands and improve tests.

This commit is contained in:
Anthony Sottile 2014-03-23 18:33:18 -07:00
parent 48bbc68b35
commit ecdacd474b
7 changed files with 82 additions and 52 deletions

25
pre_commit/commands.py Normal file
View file

@ -0,0 +1,25 @@
import os
import pkg_resources
import stat
def install(runner):
"""Install the pre-commit hooks."""
pre_commit_file = pkg_resources.resource_filename('pre_commit', 'resources/pre-commit.sh')
with open(runner.pre_commit_path, 'w') as pre_commit_file_obj:
pre_commit_file_obj.write(open(pre_commit_file).read())
original_mode = os.stat(runner.pre_commit_path).st_mode
os.chmod(
runner.pre_commit_path,
original_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH,
)
return 0
def uninstall(runner):
"""Uninstall the pre-commit hooks."""
if os.path.exists(runner.pre_commit_path):
os.remove(runner.pre_commit_path)
return 0

View file

@ -1,9 +1,7 @@
import functools
import os
import os.path
import pkg_resources
import re
import stat
from plumbum import local
from pre_commit.util import memoize_by_cwd
@ -24,23 +22,6 @@ def get_root():
return _get_root_new()
@memoize_by_cwd
def get_pre_commit_path():
return os.path.join(get_root(), '.git/hooks/pre-commit')
def create_pre_commit():
path = get_pre_commit_path()
pre_commit_file = pkg_resources.resource_filename('pre_commit', 'resources/pre-commit.sh')
local.path(path).write(local.path(pre_commit_file).read())
original_mode = os.stat(path).st_mode
os.chmod(path, original_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
def remove_pre_commit():
local.path(get_pre_commit_path()).delete()
def get_head_sha(git_repo_path):
with local.cwd(git_repo_path):
return local['git']['rev-parse', 'HEAD']().strip()

View file

@ -4,6 +4,7 @@ import os.path
import subprocess
import sys
from pre_commit import commands
from pre_commit import git
from pre_commit.runner import Runner
from pre_commit.util import entry
@ -126,13 +127,13 @@ def run(argv):
runner = Runner.create()
if args.command == 'install':
git.create_pre_commit()
print 'pre-commit installed at {0}'.format(git.get_pre_commit_path())
return 0
retval = commands.install(runner)
print 'pre-commit installed at {0}'.format(runner.pre_commit_path)
return retval
elif args.command == 'uninstall':
git.remove_pre_commit()
retval = commands.uninstall(runner)
print 'pre-commit uninstalled'
return 0
return retval
elif args.command == 'run':
if args.hook:
return run_single_hook(runner, args.hook, all_files=args.all_files)
@ -148,6 +149,10 @@ def run(argv):
'Command {0} not implemented.'.format(args.command)
)
raise AssertionError(
'Command {0} failed to exit with a returncode'.format(args.command)
)
if __name__ == '__main__':
sys.exit(run())

View file

@ -40,3 +40,7 @@ class Runner(object):
"""Returns a tuple of the configured repositories."""
config = load_config(self.config_file_path)
return tuple(map(Repository, config))
@cached_property
def pre_commit_path(self):
return os.path.join(self.git_root, '.git/hooks/pre-commit')