diff --git a/pre_commit/git.py b/pre_commit/git.py index 7a50ead2..692dbc23 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -40,12 +40,16 @@ def get_all_files(): def get_files_matching(all_file_list_strategy): @functools.wraps(all_file_list_strategy) @memoize_by_cwd - def wrapper(expr): - regex = re.compile(expr) + def wrapper(include_expr, exclude_expr): + include_regex = re.compile(include_expr) + exclude_regex = re.compile(exclude_expr) return set(filter(os.path.exists, ( filename for filename in all_file_list_strategy() - if regex.search(filename) + if ( + include_regex.search(filename) and + not exclude_regex.search(filename) + ) ))) return wrapper diff --git a/pre_commit/run.py b/pre_commit/run.py index 1b76e834..14974313 100644 --- a/pre_commit/run.py +++ b/pre_commit/run.py @@ -35,7 +35,7 @@ def _run_single_hook(runner, repository, hook_id, all_files=False): retcode, stdout, stderr = repository.run_hook( runner.cmd_runner, hook_id, - get_filenames(hook['files']), + get_filenames(hook['files'], hook['exclude']), ) if retcode != repository.hooks[hook_id]['expected_return_value']: diff --git a/tests/git_test.py b/tests/git_test.py index 17d60311..a6ecc574 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -29,7 +29,7 @@ def get_files_matching_func(): def test_get_files_matching_base(get_files_matching_func): - ret = get_files_matching_func('') + ret = get_files_matching_func('', '^$') assert ret == set([ 'pre_commit/run.py', 'pre_commit/git.py', @@ -38,7 +38,7 @@ def test_get_files_matching_base(get_files_matching_func): def test_get_files_matching_total_match(get_files_matching_func): - ret = get_files_matching_func('^.*\.py$') + ret = get_files_matching_func('^.*\.py$', '^$') assert ret == set([ 'pre_commit/run.py', 'pre_commit/git.py', @@ -46,10 +46,15 @@ def test_get_files_matching_total_match(get_files_matching_func): def test_does_search_instead_of_match(get_files_matching_func): - ret = get_files_matching_func('\.yaml$') + ret = get_files_matching_func('\.yaml$', '^$') assert ret == set(['hooks.yaml']) def test_does_not_include_deleted_fileS(get_files_matching_func): - ret = get_files_matching_func('exist.py') + ret = get_files_matching_func('exist.py', '^$') assert ret == set() + + +def test_exclude_removes_files(get_files_matching_func): + ret = get_files_matching_func('', '\.py$') + assert ret == set(['hooks.yaml'])