X Tutup
Skip to content

Commit 1b435f1

Browse files
singergr-ctdsasottile
authored andcommitted
add init-templatedir --no-allow-missing-config
Add a `--no-allow-missing-config` option to the `init-templatedir` command. Enable configuration of a Git template that requires newly cloned repos to have a `pre-commit` config.
1 parent 0e851bd commit 1b435f1

File tree

4 files changed

+83
-2
lines changed

4 files changed

+83
-2
lines changed

pre_commit/commands/init_templatedir.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,15 @@ def init_templatedir(
1515
store: Store,
1616
directory: str,
1717
hook_types: Sequence[str],
18+
skip_on_missing_config: bool = True,
1819
) -> int:
1920
install(
20-
config_file, store, hook_types=hook_types,
21-
overwrite=True, skip_on_missing_config=True, git_dir=directory,
21+
config_file,
22+
store,
23+
hook_types=hook_types,
24+
overwrite=True,
25+
skip_on_missing_config=skip_on_missing_config,
26+
git_dir=directory,
2227
)
2328
try:
2429
_, out, _ = cmd_output('git', 'config', 'init.templateDir')

pre_commit/main.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
245245
init_templatedir_parser.add_argument(
246246
'directory', help='The directory in which to write the hook script.',
247247
)
248+
init_templatedir_parser.add_argument(
249+
'--no-allow-missing-config',
250+
action='store_false',
251+
dest='allow_missing_config',
252+
help='Assume cloned repos should have a `pre-commit` config.',
253+
)
248254
_add_hook_type_option(init_templatedir_parser)
249255

250256
install_parser = subparsers.add_parser(
@@ -383,6 +389,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
383389
return init_templatedir(
384390
args.config, store, args.directory,
385391
hook_types=args.hook_types,
392+
skip_on_missing_config=args.allow_missing_config,
386393
)
387394
elif args.command == 'install-hooks':
388395
return install_hooks(args.config, store)

tests/commands/init_templatedir_test.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import os.path
22
from unittest import mock
33

4+
import pytest
5+
46
import pre_commit.constants as C
57
from pre_commit.commands.init_templatedir import init_templatedir
68
from pre_commit.envcontext import envcontext
@@ -90,3 +92,49 @@ def test_init_templatedir_hookspath_set(tmpdir, tempdir_factory, store):
9092
C.CONFIG_FILE, store, target, hook_types=['pre-commit'],
9193
)
9294
assert target.join('hooks/pre-commit').exists()
95+
96+
97+
@pytest.mark.parametrize(
98+
('skip', 'commit_retcode', 'commit_output_snippet'),
99+
(
100+
(True, 0, 'Skipping `pre-commit`.'),
101+
(False, 1, f'No {C.CONFIG_FILE} file was found'),
102+
),
103+
)
104+
def test_init_templatedir_skip_on_missing_config(
105+
tmpdir,
106+
tempdir_factory,
107+
store,
108+
cap_out,
109+
skip,
110+
commit_retcode,
111+
commit_output_snippet,
112+
):
113+
target = str(tmpdir.join('tmpl'))
114+
init_git_dir = git_dir(tempdir_factory)
115+
with cwd(init_git_dir):
116+
cmd_output('git', 'config', 'init.templateDir', target)
117+
init_templatedir(
118+
C.CONFIG_FILE,
119+
store,
120+
target,
121+
hook_types=['pre-commit'],
122+
skip_on_missing_config=skip,
123+
)
124+
125+
lines = cap_out.get().splitlines()
126+
assert len(lines) == 1
127+
assert lines[0].startswith('pre-commit installed at')
128+
129+
with envcontext((('GIT_TEMPLATE_DIR', target),)):
130+
verify_git_dir = git_dir(tempdir_factory)
131+
132+
with cwd(verify_git_dir):
133+
retcode, output = git_commit(
134+
fn=cmd_output_mocked_pre_commit_home,
135+
tempdir_factory=tempdir_factory,
136+
retcode=None,
137+
)
138+
139+
assert retcode == commit_retcode
140+
assert commit_output_snippet in output

tests/main_test.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,28 @@ def test_try_repo(mock_store_dir):
159159
def test_init_templatedir(mock_store_dir):
160160
with mock.patch.object(main, 'init_templatedir') as patch:
161161
main.main(('init-templatedir', 'tdir'))
162+
163+
assert patch.call_count == 1
164+
assert 'tdir' in patch.call_args[0]
165+
assert patch.call_args[1]['hook_types'] == ['pre-commit']
166+
assert patch.call_args[1]['skip_on_missing_config'] is True
167+
168+
169+
def test_init_templatedir_options(mock_store_dir):
170+
args = (
171+
'init-templatedir',
172+
'tdir',
173+
'--hook-type',
174+
'commit-msg',
175+
'--no-allow-missing-config',
176+
)
177+
with mock.patch.object(main, 'init_templatedir') as patch:
178+
main.main(args)
179+
162180
assert patch.call_count == 1
181+
assert 'tdir' in patch.call_args[0]
182+
assert patch.call_args[1]['hook_types'] == ['commit-msg']
183+
assert patch.call_args[1]['skip_on_missing_config'] is False
163184

164185

165186
def test_help_cmd_in_empty_directory(

0 commit comments

Comments
 (0)
X Tutup