Skip to content

Commit a0c0870

Browse files
authored
Merge pull request pre-commit#1601 from int3l/distinct_exit_codes
Distinct exit codes for the various error cases
2 parents 9d0ab3b + 47e758d commit a0c0870

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

pre_commit/error_handler.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
from pre_commit.util import force_bytes
1313

1414

15-
def _log_and_exit(msg: str, exc: BaseException, formatted: str) -> None:
15+
def _log_and_exit(
16+
msg: str,
17+
ret_code: int,
18+
exc: BaseException,
19+
formatted: str,
20+
) -> None:
1621
error_msg = f'{msg}: {type(exc).__name__}: '.encode() + force_bytes(exc)
1722
output.write_line_b(error_msg)
1823

@@ -51,7 +56,7 @@ def _log_and_exit(msg: str, exc: BaseException, formatted: str) -> None:
5156
_log_line('```')
5257
_log_line(formatted.rstrip())
5358
_log_line('```')
54-
raise SystemExit(1)
59+
raise SystemExit(ret_code)
5560

5661

5762
@contextlib.contextmanager
@@ -60,9 +65,9 @@ def error_handler() -> Generator[None, None, None]:
6065
yield
6166
except (Exception, KeyboardInterrupt) as e:
6267
if isinstance(e, FatalError):
63-
msg = 'An error has occurred'
68+
msg, ret_code = 'An error has occurred', 1
6469
elif isinstance(e, KeyboardInterrupt):
65-
msg = 'Interrupted (^C)'
70+
msg, ret_code = 'Interrupted (^C)', 130
6671
else:
67-
msg = 'An unexpected error has occurred'
68-
_log_and_exit(msg, e, traceback.format_exc())
72+
msg, ret_code = 'An unexpected error has occurred', 3
73+
_log_and_exit(msg, ret_code, e, traceback.format_exc())

tests/error_handler_test.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def test_error_handler_fatal_error(mocked_log_and_exit):
3333

3434
mocked_log_and_exit.assert_called_once_with(
3535
'An error has occurred',
36+
1,
3637
exc,
3738
# Tested below
3839
mock.ANY,
@@ -47,7 +48,7 @@ def test_error_handler_fatal_error(mocked_log_and_exit):
4748
r' raise exc\n'
4849
r'(pre_commit\.errors\.)?FatalError: just a test\n',
4950
)
50-
pattern.assert_matches(mocked_log_and_exit.call_args[0][2])
51+
pattern.assert_matches(mocked_log_and_exit.call_args[0][3])
5152

5253

5354
def test_error_handler_uncaught_error(mocked_log_and_exit):
@@ -57,6 +58,7 @@ def test_error_handler_uncaught_error(mocked_log_and_exit):
5758

5859
mocked_log_and_exit.assert_called_once_with(
5960
'An unexpected error has occurred',
61+
3,
6062
exc,
6163
# Tested below
6264
mock.ANY,
@@ -70,7 +72,7 @@ def test_error_handler_uncaught_error(mocked_log_and_exit):
7072
r' raise exc\n'
7173
r'ValueError: another test\n',
7274
)
73-
pattern.assert_matches(mocked_log_and_exit.call_args[0][2])
75+
pattern.assert_matches(mocked_log_and_exit.call_args[0][3])
7476

7577

7678
def test_error_handler_keyboardinterrupt(mocked_log_and_exit):
@@ -80,6 +82,7 @@ def test_error_handler_keyboardinterrupt(mocked_log_and_exit):
8082

8183
mocked_log_and_exit.assert_called_once_with(
8284
'Interrupted (^C)',
85+
130,
8386
exc,
8487
# Tested below
8588
mock.ANY,
@@ -93,7 +96,7 @@ def test_error_handler_keyboardinterrupt(mocked_log_and_exit):
9396
r' raise exc\n'
9497
r'KeyboardInterrupt\n',
9598
)
96-
pattern.assert_matches(mocked_log_and_exit.call_args[0][2])
99+
pattern.assert_matches(mocked_log_and_exit.call_args[0][3])
97100

98101

99102
def test_log_and_exit(cap_out, mock_store_dir):
@@ -103,8 +106,9 @@ def test_log_and_exit(cap_out, mock_store_dir):
103106
'pre_commit.errors.FatalError: hai\n'
104107
)
105108

106-
with pytest.raises(SystemExit):
107-
error_handler._log_and_exit('msg', FatalError('hai'), tb)
109+
with pytest.raises(SystemExit) as excinfo:
110+
error_handler._log_and_exit('msg', 1, FatalError('hai'), tb)
111+
assert excinfo.value.code == 1
108112

109113
printed = cap_out.get()
110114
log_file = os.path.join(mock_store_dir, 'pre-commit.log')
@@ -170,7 +174,7 @@ def test_error_handler_no_tty(tempdir_factory):
170174
'from pre_commit.error_handler import error_handler\n'
171175
'with error_handler():\n'
172176
' raise ValueError("\\u2603")\n',
173-
retcode=1,
177+
retcode=3,
174178
tempdir_factory=tempdir_factory,
175179
pre_commit_home=pre_commit_home,
176180
)

0 commit comments

Comments
 (0)