Skip to content

Commit 619f2bf

Browse files
committed
eagerly catch invalid yaml in migrate-config
1 parent dc667ab commit 619f2bf

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

pre_commit/commands/migrate_config.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import re
44
import textwrap
55

6+
import cfgv
67
import yaml
78

9+
from pre_commit.clientlib import InvalidConfigError
810
from pre_commit.yaml import yaml_load
911

1012

@@ -44,6 +46,13 @@ def migrate_config(config_file: str, quiet: bool = False) -> int:
4446
with open(config_file) as f:
4547
orig_contents = contents = f.read()
4648

49+
with cfgv.reraise_as(InvalidConfigError):
50+
with cfgv.validate_context(f'File {config_file}'):
51+
try:
52+
yaml_load(orig_contents)
53+
except Exception as e:
54+
raise cfgv.ValidationError(str(e))
55+
4756
contents = _migrate_map(contents)
4857
contents = _migrate_sha_to_rev(contents)
4958

tests/commands/migrate_config_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from __future__ import annotations
22

3+
import pytest
4+
35
import pre_commit.constants as C
6+
from pre_commit.clientlib import InvalidConfigError
47
from pre_commit.commands.migrate_config import migrate_config
58

69

@@ -129,3 +132,13 @@ def test_migrate_config_sha_to_rev(tmpdir):
129132
' rev: v1.2.0\n'
130133
' hooks: []\n'
131134
)
135+
136+
137+
def test_migrate_config_invalid_yaml(tmpdir):
138+
contents = '['
139+
cfg = tmpdir.join(C.CONFIG_FILE)
140+
cfg.write(contents)
141+
with tmpdir.as_cwd(), pytest.raises(InvalidConfigError) as excinfo:
142+
migrate_config(C.CONFIG_FILE)
143+
expected = '\n==> File .pre-commit-config.yaml\n=====> '
144+
assert str(excinfo.value).startswith(expected)

0 commit comments

Comments
 (0)