Skip to content

Commit ef5a4a4

Browse files
authored
fix: handle invalid slug gracefully to prevent CLI crash
1 parent 152ecf8 commit ef5a4a4

7 files changed

Lines changed: 49 additions & 13 deletions

File tree

codecov_cli/commands/get_report_results.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import sentry_sdk
55

66
from codecov_cli.helpers.args import get_cli_args
7-
from codecov_cli.helpers.encoder import encode_slug
7+
from codecov_cli.helpers.encoder import safe_encode_slug
88
from codecov_cli.helpers.options import global_options
99
from codecov_cli.services.report import send_reports_result_get_request
1010
from codecov_cli.types import CommandContext
@@ -38,7 +38,9 @@ def get_report_results(
3838
extra_log_attributes=args,
3939
),
4040
)
41-
encoded_slug = encode_slug(slug)
41+
encoded_slug = safe_encode_slug(slug)
42+
if encoded_slug is None:
43+
raise click.UsageError("The provided slug is invalid")
4244
send_reports_result_get_request(
4345
commit_sha=commit_sha,
4446
report_code=code,

codecov_cli/helpers/encoder.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
import logging
12
import re
23

4+
logger = logging.getLogger("codecovcli")
5+
36
slug_without_subgroups_regex = re.compile(r"[^/\s]+\/[^/\s]+$")
47
slug_with_subgroups_regex = re.compile(r"[^/\s]+(\/[^/\s]+)+$")
58
encoded_slug_regex = re.compile(r"[^:\s]+(:::[^:\s]+)*(::::[^:\s]+){1}$")
@@ -14,6 +17,16 @@ def encode_slug(slug: str):
1417
return encoded_slug
1518

1619

20+
def safe_encode_slug(slug):
21+
try:
22+
return encode_slug(slug)
23+
except ValueError:
24+
logger.error(
25+
"The provided slug is invalid. Please provide a valid slug in the form owner/repo."
26+
)
27+
return None
28+
29+
1730
def decode_slug(slug: str):
1831
if slug_encoded_incorrectly(slug):
1932
raise ValueError("The slug is not encoded correctly")

codecov_cli/services/commit/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
import os
33
import typing
44

5+
import click
6+
57
from codecov_cli import __version__ as codecov_cli_version
68
from codecov_cli.helpers.config import CODECOV_INGEST_URL
7-
from codecov_cli.helpers.encoder import encode_slug
9+
from codecov_cli.helpers.encoder import safe_encode_slug
810
from codecov_cli.helpers.request import (
911
get_token_header,
1012
log_warnings_and_errors_if_any,
@@ -26,7 +28,9 @@ def create_commit_logic(
2628
fail_on_error: bool = False,
2729
args: dict = None,
2830
):
29-
encoded_slug = encode_slug(slug)
31+
encoded_slug = safe_encode_slug(slug)
32+
if encoded_slug is None:
33+
raise click.UsageError("The provided slug is invalid")
3034
sending_result = send_commit_data(
3135
commit_sha=commit_sha,
3236
parent_sha=parent_sha,

codecov_cli/services/empty_upload/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
from codecov_cli import __version__ as codecov_cli_version
55
from codecov_cli.helpers.config import CODECOV_API_URL
6-
from codecov_cli.helpers.encoder import encode_slug
6+
import click
7+
8+
from codecov_cli.helpers.encoder import safe_encode_slug
79
from codecov_cli.helpers.upload_url_validation import validate_upload_service
810

911
from codecov_cli.helpers.request import (
@@ -25,7 +27,9 @@ def empty_upload_logic(
2527
should_force,
2628
args,
2729
):
28-
encoded_slug = encode_slug(slug)
30+
encoded_slug = safe_encode_slug(slug)
31+
if encoded_slug is None:
32+
raise click.UsageError("The provided slug is invalid")
2933
headers = get_token_header(token)
3034
upload_url = enterprise_url or CODECOV_API_URL
3135
service_part = (git_service or "").strip()

codecov_cli/services/report/__init__.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
from codecov_cli import __version__ as codecov_cli_version
77
from codecov_cli.helpers import request
88
from codecov_cli.helpers.config import CODECOV_API_URL, CODECOV_INGEST_URL
9-
from codecov_cli.helpers.encoder import encode_slug
9+
import click
10+
11+
from codecov_cli.helpers.encoder import safe_encode_slug
1012
from codecov_cli.helpers.request import (
1113
get_token_header,
1214
log_warnings_and_errors_if_any,
@@ -30,7 +32,9 @@ def create_report_logic(
3032
fail_on_error: bool = False,
3133
args: typing.Union[dict, None] = None,
3234
):
33-
encoded_slug = encode_slug(slug)
35+
encoded_slug = safe_encode_slug(slug)
36+
if encoded_slug is None:
37+
raise click.UsageError("The provided slug is invalid")
3438
sending_result = send_create_report_request(
3539
commit_sha,
3640
code,
@@ -78,7 +82,9 @@ def create_report_results_logic(
7882
fail_on_error: bool = False,
7983
args: typing.Union[dict, None] = None,
8084
):
81-
encoded_slug = encode_slug(slug)
85+
encoded_slug = safe_encode_slug(slug)
86+
if encoded_slug is None:
87+
raise click.UsageError("The provided slug is invalid")
8288
sending_result = send_reports_result_request(
8389
commit_sha=commit_sha,
8490
report_code=code,

codecov_cli/services/upload/upload_sender.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
import zlib
66
from typing import Any, Dict
77

8+
import click
89
import sentry_sdk
910

1011
from codecov_cli import __version__ as codecov_cli_version
1112
from codecov_cli.helpers.config import CODECOV_INGEST_URL
12-
from codecov_cli.helpers.encoder import encode_slug
13+
from codecov_cli.helpers.encoder import safe_encode_slug
1314
from codecov_cli.helpers.upload_type import ReportType
1415
from codecov_cli.helpers.upload_url_validation import validate_upload_service
1516
from codecov_cli.helpers.request import (
@@ -80,7 +81,9 @@ def send_upload_data(
8081
data["parent_commit_id"] = parent_sha
8182
data["pullid"] = pull_request_number
8283
headers = get_token_header(token)
83-
encoded_slug = encode_slug(slug)
84+
encoded_slug = safe_encode_slug(slug)
85+
if encoded_slug is None:
86+
raise click.UsageError("The provided slug is invalid")
8487
upload_url = enterprise_url or CODECOV_INGEST_URL
8588
url, data = self.get_url_and_possibly_update_data(
8689
data,

codecov_cli/services/upload_completion/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
from codecov_cli import __version__ as codecov_cli_version
55
from codecov_cli.helpers.config import CODECOV_API_URL
6-
from codecov_cli.helpers.encoder import encode_slug
6+
import click
7+
8+
from codecov_cli.helpers.encoder import safe_encode_slug
79
from codecov_cli.helpers.upload_url_validation import validate_upload_service
810
from codecov_cli.helpers.request import (
911
get_token_header,
@@ -23,7 +25,9 @@ def upload_completion_logic(
2325
fail_on_error=False,
2426
args=None,
2527
):
26-
encoded_slug = encode_slug(slug)
28+
encoded_slug = safe_encode_slug(slug)
29+
if encoded_slug is None:
30+
raise click.UsageError("The provided slug is invalid")
2731
headers = get_token_header(token)
2832
upload_url = enterprise_url or CODECOV_API_URL
2933
service_part = (git_service or "").strip()

0 commit comments

Comments
 (0)