mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-01-13 20:40:08 -06:00
Merge pull request #821 from pre-commit/allow_language_fail_check_useless_excludes
Exempt `language: fail` hooks from check-hooks-apply
This commit is contained in:
@@ -15,7 +15,7 @@ def check_all_hooks_match_files(config_file):
|
||||
|
||||
for repo in repositories(load_config(config_file), Store()):
|
||||
for hook_id, hook in repo.hooks:
|
||||
if hook['always_run']:
|
||||
if hook['always_run'] or hook['language'] == 'fail':
|
||||
continue
|
||||
include, exclude = hook['files'], hook['exclude']
|
||||
filtered = _filter_by_include_exclude(files, include, exclude)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from collections import OrderedDict
|
||||
|
||||
from pre_commit.meta_hooks import check_hooks_apply
|
||||
from testing.fixtures import add_config_to_repo
|
||||
from testing.fixtures import git_dir
|
||||
@@ -7,17 +5,19 @@ from testing.util import cwd
|
||||
|
||||
|
||||
def test_hook_excludes_everything(capsys, tempdir_factory, mock_store_dir):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('exclude', '.pre-commit-config.yaml'),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [
|
||||
{
|
||||
'id': 'check-useless-excludes',
|
||||
'exclude': '.pre-commit-config.yaml',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -30,17 +30,19 @@ def test_hook_excludes_everything(capsys, tempdir_factory, mock_store_dir):
|
||||
|
||||
|
||||
def test_hook_includes_nothing(capsys, tempdir_factory, mock_store_dir):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('files', 'foo'),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [
|
||||
{
|
||||
'id': 'check-useless-excludes',
|
||||
'files': 'foo',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -53,17 +55,19 @@ def test_hook_includes_nothing(capsys, tempdir_factory, mock_store_dir):
|
||||
|
||||
|
||||
def test_hook_types_not_matched(capsys, tempdir_factory, mock_store_dir):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('types', ['python']),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [
|
||||
{
|
||||
'id': 'check-useless-excludes',
|
||||
'types': ['python'],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -78,17 +82,19 @@ def test_hook_types_not_matched(capsys, tempdir_factory, mock_store_dir):
|
||||
def test_hook_types_excludes_everything(
|
||||
capsys, tempdir_factory, mock_store_dir,
|
||||
):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('exclude_types', ['yaml']),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [
|
||||
{
|
||||
'id': 'check-useless-excludes',
|
||||
'exclude_types': ['yaml'],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -100,23 +106,51 @@ def test_hook_types_excludes_everything(
|
||||
assert 'check-useless-excludes does not apply to this repository' in out
|
||||
|
||||
|
||||
def test_valid_includes(capsys, tempdir_factory, mock_store_dir):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
)),
|
||||
# Should not be reported as an error due to always_run
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('files', '^$'),
|
||||
('always_run', True),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
def test_valid_always_run(capsys, tempdir_factory, mock_store_dir):
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [
|
||||
# Should not be reported as an error due to always_run
|
||||
{
|
||||
'id': 'check-useless-excludes',
|
||||
'files': '^$',
|
||||
'always_run': True,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
|
||||
with cwd(repo):
|
||||
assert check_hooks_apply.main(()) == 0
|
||||
|
||||
out, _ = capsys.readouterr()
|
||||
assert out == ''
|
||||
|
||||
|
||||
def test_valid_language_fail(capsys, tempdir_factory, mock_store_dir):
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'local',
|
||||
'hooks': [
|
||||
# Should not be reported as an error due to language: fail
|
||||
{
|
||||
'id': 'changelogs-rst',
|
||||
'name': 'changelogs must be rst',
|
||||
'entry': 'changelog filenames must end in .rst',
|
||||
'language': 'fail',
|
||||
'files': r'changelog/.*(?<!\.rst)$',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from collections import OrderedDict
|
||||
|
||||
from pre_commit.meta_hooks import check_useless_excludes
|
||||
from testing.fixtures import add_config_to_repo
|
||||
from testing.fixtures import git_dir
|
||||
@@ -7,23 +5,15 @@ from testing.util import cwd
|
||||
|
||||
|
||||
def test_useless_exclude_global(capsys, tempdir_factory):
|
||||
config = OrderedDict((
|
||||
('exclude', 'foo'),
|
||||
(
|
||||
'repos', [
|
||||
OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
)),
|
||||
),
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'exclude': 'foo',
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [{'id': 'check-useless-excludes'}],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -32,21 +22,19 @@ def test_useless_exclude_global(capsys, tempdir_factory):
|
||||
assert check_useless_excludes.main(()) == 1
|
||||
|
||||
out, _ = capsys.readouterr()
|
||||
assert "The global exclude pattern 'foo' does not match any files" in out
|
||||
out = out.strip()
|
||||
assert "The global exclude pattern 'foo' does not match any files" == out
|
||||
|
||||
|
||||
def test_useless_exclude_for_hook(capsys, tempdir_factory):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('exclude', 'foo'),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [{'id': 'check-useless-excludes', 'exclude': 'foo'}],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -55,24 +43,23 @@ def test_useless_exclude_for_hook(capsys, tempdir_factory):
|
||||
assert check_useless_excludes.main(()) == 1
|
||||
|
||||
out, _ = capsys.readouterr()
|
||||
out = out.strip()
|
||||
expected = (
|
||||
"The exclude pattern 'foo' for check-useless-excludes "
|
||||
"does not match any files"
|
||||
)
|
||||
assert expected in out
|
||||
assert expected == out
|
||||
|
||||
|
||||
def test_no_excludes(capsys, tempdir_factory):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [{'id': 'check-useless-excludes'}],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
@@ -85,17 +72,19 @@ def test_no_excludes(capsys, tempdir_factory):
|
||||
|
||||
|
||||
def test_valid_exclude(capsys, tempdir_factory):
|
||||
config = OrderedDict((
|
||||
('repo', 'meta'),
|
||||
(
|
||||
'hooks', (
|
||||
OrderedDict((
|
||||
('id', 'check-useless-excludes'),
|
||||
('exclude', '.pre-commit-config.yaml'),
|
||||
)),
|
||||
),
|
||||
),
|
||||
))
|
||||
config = {
|
||||
'repos': [
|
||||
{
|
||||
'repo': 'meta',
|
||||
'hooks': [
|
||||
{
|
||||
'id': 'check-useless-excludes',
|
||||
'exclude': '.pre-commit-config.yaml',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
repo = git_dir(tempdir_factory)
|
||||
add_config_to_repo(repo, config)
|
||||
Reference in New Issue
Block a user