Skip to content
This repository was archived by the owner on Jul 16, 2025. It is now read-only.

Commit 2bd1833

Browse files
Add --fail-on-error option to do-upload command (#82)
`--fail-on-error` forces a `SystemExit(1)` in case of errors when uploading. This was the `--nonZero` option in the legacy uploader.
1 parent 092182a commit 2bd1833

File tree

5 files changed

+66
-2
lines changed

5 files changed

+66
-2
lines changed

codecov_cli/commands/upload.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ def _turn_env_vars_into_dict(ctx, params, value):
146146
@click.option(
147147
"--plugin", "plugin_names", multiple=True, default=["xcode", "gcov", "pycoverage"]
148148
)
149+
@click.option(
150+
"-Z",
151+
"--fail-on-error",
152+
"fail_on_error",
153+
is_flag=True,
154+
help="Exit with non-zero code in case of error uploading.",
155+
)
149156
@click.option("--use-new-uploader", "is_using_new_uploader", default=False)
150157
@click.pass_context
151158
def do_upload(
@@ -168,6 +175,7 @@ def do_upload(
168175
slug: typing.Optional[str],
169176
pull_request_number: typing.Optional[str],
170177
is_using_new_uploader: bool,
178+
fail_on_error: bool,
171179
):
172180
versioning_system = ctx.obj["versioning_system"]
173181
codecov_yaml = ctx.obj["codecov_yaml"] or {}
@@ -219,4 +227,5 @@ def do_upload(
219227
slug=slug,
220228
pull_request_number=pull_request_number,
221229
is_using_new_uploader=is_using_new_uploader,
230+
fail_on_error=fail_on_error,
222231
)

codecov_cli/helpers/request.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ def request_result(resp):
4747
)
4848

4949

50-
def log_warnings_and_errors_if_any(sending_result: RequestResult, process_desc):
50+
def log_warnings_and_errors_if_any(
51+
sending_result: RequestResult, process_desc: str, fail_on_error: bool = False
52+
):
5153
if sending_result.warnings:
5254
number_warnings = len(sending_result.warnings)
5355
pluralization = "s" if number_warnings > 1 else ""
@@ -58,3 +60,5 @@ def log_warnings_and_errors_if_any(sending_result: RequestResult, process_desc):
5860
logger.warning(f"Warning {ind + 1}: {w.message}")
5961
if sending_result.error is not None:
6062
logger.error(f"{process_desc} failed: {sending_result.error.description}")
63+
if fail_on_error:
64+
exit(1)

codecov_cli/services/legacy_upload/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def do_upload_logic(
4444
slug: typing.Optional[str],
4545
pull_request_number: typing.Optional[str],
4646
is_using_new_uploader: bool = False,
47+
fail_on_error: bool = False
4748
):
4849
preparation_plugins = select_preparation_plugins(cli_config, plugin_names)
4950
coverage_file_selector = select_coverage_file_finder(
@@ -81,5 +82,5 @@ def do_upload_logic(
8182
flags,
8283
service,
8384
)
84-
log_warnings_and_errors_if_any(sending_result, "Upload")
85+
log_warnings_and_errors_if_any(sending_result, "Upload", fail_on_error)
8586
return sending_result

tests/helpers/test_request.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import pytest
2+
3+
from codecov_cli.helpers.request import log_warnings_and_errors_if_any
4+
from codecov_cli.helpers.request import logger as req_log
5+
from codecov_cli.types import RequestError, RequestResult
6+
7+
8+
def test_log_error_no_raise(mocker):
9+
mock_log_error = mocker.patch.object(req_log, "error")
10+
error = RequestError(
11+
code=401, params={"some": "params"}, description="Unauthorized"
12+
)
13+
result = RequestResult(
14+
error=error, warnings=[], status_code=401, text="Unauthorized"
15+
)
16+
log_warnings_and_errors_if_any(result, "Process", fail_on_error=False)
17+
mock_log_error.assert_called_with(f"Process failed: Unauthorized")
18+
19+
20+
def test_log_error_raise(mocker):
21+
mock_log_error = mocker.patch.object(req_log, "error")
22+
error = RequestError(
23+
code=401, params={"some": "params"}, description="Unauthorized"
24+
)
25+
result = RequestResult(
26+
error=error, warnings=[], status_code=401, text="Unauthorized"
27+
)
28+
with pytest.raises(SystemExit):
29+
log_warnings_and_errors_if_any(result, "Process", fail_on_error=True)
30+
mock_log_error.assert_called_with(f"Process failed: Unauthorized")

tests/test_upload.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from click.testing import CliRunner
22

33
from codecov_cli.main import cli
4+
from codecov_cli.services.legacy_upload import UploadSender
5+
from codecov_cli.types import RequestError, RequestResult
46

57

68
def test_upload_missing_commit_sha(mocker):
@@ -15,3 +17,21 @@ def test_upload_missing_commit_sha(mocker):
1517
result = runner.invoke(cli, ["do-upload"], obj={})
1618
assert result.exit_code != 0
1719
assert "Missing option '-C' / '--sha' / '--commit-sha'" in result.output
20+
21+
22+
def test_upload_raise_Z_option(mocker):
23+
error = RequestError(
24+
code=401, params={"some": "params"}, description="Unauthorized"
25+
)
26+
result = RequestResult(
27+
error=error, warnings=[], status_code=401, text="Unauthorized"
28+
)
29+
upload_sender = mocker.patch.object(
30+
UploadSender, "send_upload_data", return_value=result
31+
)
32+
runner = CliRunner()
33+
result = runner.invoke(
34+
cli, ["do-upload", "--fail-on-error", "--use-new-uploader=True"], obj={}
35+
)
36+
upload_sender.assert_called
37+
assert str(result) == "<Result SystemExit(1)>"

0 commit comments

Comments
 (0)