Skip to content

Commit 364eeac

Browse files
Merge branch 'main' into cy/more_metrics
2 parents 62400cb + 2be4e29 commit 364eeac

11 files changed

Lines changed: 113 additions & 43 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import click
2+
3+
from codecov_cli.helpers.git import GitService
4+
5+
# The set of acceptable upload services from Shelter
6+
_CODECOV_UPLOAD_SERVICES = frozenset(s.value for s in GitService) | {"github-actions"}
7+
8+
9+
def validate_upload_service(
10+
service: str,
11+
) -> None:
12+
allowed = ", ".join(sorted(_CODECOV_UPLOAD_SERVICES))
13+
if not service:
14+
raise click.ClickException(
15+
"Upload service is missing (Codecov requires it for upload URLs). "
16+
f"Pass --git-service with one of: {allowed}"
17+
)
18+
if service not in _CODECOV_UPLOAD_SERVICES:
19+
raise click.ClickException(
20+
f"Invalid upload service {service!r}. Use one of: {allowed}"
21+
)

codecov-cli/codecov_cli/services/commit/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
log_warnings_and_errors_if_any,
1111
send_post_request,
1212
)
13+
from codecov_cli.helpers.upload_url_validation import validate_upload_service
1314

1415
logger = logging.getLogger("codecovcli")
1516

16-
1717
def create_commit_logic(
1818
commit_sha: str,
1919
parent_sha: typing.Optional[str],
@@ -80,7 +80,9 @@ def send_commit_data(
8080
}
8181

8282
upload_url = enterprise_url or CODECOV_INGEST_URL
83-
url = f"{upload_url}/upload/{service}/{slug}/commits"
83+
service_part = (service or "").strip()
84+
validate_upload_service(service_part)
85+
url = f"{upload_url}/upload/{service_part}/{slug}/commits"
8486
return send_post_request(
8587
url=url,
8688
data=data,

codecov-cli/codecov_cli/services/empty_upload/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from codecov_cli import __version__ as codecov_cli_version
55
from codecov_cli.helpers.config import CODECOV_API_URL
66
from codecov_cli.helpers.encoder import encode_slug
7+
from codecov_cli.helpers.upload_url_validation import validate_upload_service
8+
79
from codecov_cli.helpers.request import (
810
get_token_header,
911
log_warnings_and_errors_if_any,
@@ -26,7 +28,9 @@ def empty_upload_logic(
2628
encoded_slug = encode_slug(slug)
2729
headers = get_token_header(token)
2830
upload_url = enterprise_url or CODECOV_API_URL
29-
url = f"{upload_url}/upload/{git_service}/{encoded_slug}/commits/{commit_sha}/empty-upload"
31+
service_part = (git_service or "").strip()
32+
validate_upload_service(service_part)
33+
url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/empty-upload"
3034
sending_result = send_post_request(
3135
url=url,
3236
headers=headers,

codecov-cli/codecov_cli/services/report/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
request_result,
1414
send_post_request,
1515
)
16+
from codecov_cli.helpers.upload_url_validation import validate_upload_service
1617

1718
logger = logging.getLogger("codecovcli")
1819
MAX_NUMBER_TRIES = 3
@@ -61,7 +62,9 @@ def send_create_report_request(
6162
}
6263
headers = get_token_header(token)
6364
upload_url = enterprise_url or CODECOV_INGEST_URL
64-
url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports"
65+
service_part = (service or "").strip()
66+
validate_upload_service(service_part)
67+
url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/reports"
6568
return send_post_request(url=url, headers=headers, data=data)
6669

6770

@@ -107,7 +110,9 @@ def send_reports_result_request(
107110
}
108111
headers = get_token_header(token)
109112
upload_url = enterprise_url or CODECOV_API_URL
110-
url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
113+
service_part = (service or "").strip()
114+
validate_upload_service(service_part)
115+
url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
111116
return send_post_request(url=url, data=data, headers=headers)
112117

113118

@@ -122,7 +127,9 @@ def send_reports_result_get_request(
122127
):
123128
headers = get_token_header(token)
124129
upload_url = enterprise_url or CODECOV_API_URL
125-
url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
130+
service_part = (service or "").strip()
131+
validate_upload_service(service_part)
132+
url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
126133
number_tries = 0
127134
while number_tries < MAX_NUMBER_TRIES:
128135
resp = request.get(url=url, headers=headers)

codecov-cli/codecov_cli/services/upload/upload_sender.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from codecov_cli.helpers.config import CODECOV_INGEST_URL
1212
from codecov_cli.helpers.encoder import encode_slug
1313
from codecov_cli.helpers.upload_type import ReportType
14+
from codecov_cli.helpers.upload_url_validation import validate_upload_service
1415
from codecov_cli.helpers.request import (
1516
get_token_header,
1617
send_post_request,
@@ -219,8 +220,11 @@ def get_url_and_possibly_update_data(
219220
upload_coverage=False,
220221
file_not_found=False,
221222
):
223+
service_part = (git_service or "").strip()
224+
222225
if report_type == ReportType.COVERAGE:
223-
base_url = f"{upload_url}/upload/{git_service}/{encoded_slug}"
226+
validate_upload_service(service_part)
227+
base_url = f"{upload_url}/upload/{service_part}/{encoded_slug}"
224228
if upload_coverage:
225229
url = f"{base_url}/upload-coverage"
226230
else:
@@ -229,7 +233,7 @@ def get_url_and_possibly_update_data(
229233
data["slug"] = encoded_slug
230234
data["branch"] = branch
231235
data["commit"] = commit_sha
232-
data["service"] = git_service
236+
data["service"] = service_part if service_part else None
233237
data["file_not_found"] = file_not_found
234238
url = f"{upload_url}/upload/test_results/v1"
235239

codecov-cli/codecov_cli/services/upload_completion/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from codecov_cli import __version__ as codecov_cli_version
55
from codecov_cli.helpers.config import CODECOV_API_URL
66
from codecov_cli.helpers.encoder import encode_slug
7+
from codecov_cli.helpers.upload_url_validation import validate_upload_service
78
from codecov_cli.helpers.request import (
89
get_token_header,
910
log_warnings_and_errors_if_any,
@@ -25,7 +26,9 @@ def upload_completion_logic(
2526
encoded_slug = encode_slug(slug)
2627
headers = get_token_header(token)
2728
upload_url = enterprise_url or CODECOV_API_URL
28-
url = f"{upload_url}/upload/{git_service}/{encoded_slug}/commits/{commit_sha}/upload-complete"
29+
service_part = (git_service or "").strip()
30+
validate_upload_service(service_part)
31+
url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/upload-complete"
2932
data = {
3033
"cli_args": args,
3134
"version": codecov_cli_version,

codecov-cli/tests/services/commit/test_commit_service.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import uuid
22

3+
import click
4+
import pytest
35
from click.testing import CliRunner
46

57
from codecov_cli import __version__ as codecov_cli_version
@@ -27,7 +29,7 @@ def test_commit_command_with_warnings(mocker):
2729
branch="branch",
2830
slug="owner/repo",
2931
token="token",
30-
service="service",
32+
service="github",
3133
)
3234

3335
out_bytes = parse_outstreams_into_log_lines(outstreams[0].getvalue())
@@ -44,7 +46,7 @@ def test_commit_command_with_warnings(mocker):
4446
branch="branch",
4547
slug="owner::::repo",
4648
token="token",
47-
service="service",
49+
service="github",
4850
enterprise_url=None,
4951
args=None,
5052
)
@@ -73,7 +75,7 @@ def test_commit_command_with_error(mocker):
7375
branch="branch",
7476
slug="owner/repo",
7577
token="token",
76-
service="service",
78+
service="github",
7779
enterprise_url=None,
7880
args={},
7981
)
@@ -94,7 +96,7 @@ def test_commit_command_with_error(mocker):
9496
branch="branch",
9597
slug="owner::::repo",
9698
token="token",
97-
service="service",
99+
service="github",
98100
enterprise_url=None,
99101
args={},
100102
)
@@ -113,7 +115,7 @@ def test_commit_sender_200(mocker):
113115
"branch",
114116
"owner::::repo",
115117
token,
116-
"service",
118+
"github",
117119
None,
118120
None,
119121
)
@@ -135,7 +137,7 @@ def test_commit_sender_403(mocker):
135137
"branch",
136138
"owner::::repo",
137139
token,
138-
"service",
140+
"github",
139141
None,
140142
None,
141143
)
@@ -178,6 +180,33 @@ def test_commit_sender_with_forked_repo(mocker):
178180
)
179181

180182

183+
@pytest.mark.parametrize(
184+
"service,slug,enterprise_url,fragment",
185+
[
186+
(None, "o::::r", None, "Upload service is missing"),
187+
("", "o::::r", None, "Upload service is missing"),
188+
("circleci", "o::::r", None, "Invalid upload service"),
189+
],
190+
)
191+
def test_commit_sender_rejects_invalid_url_parts(
192+
mocker, service, slug, enterprise_url, fragment
193+
):
194+
mocker.patch("codecov_cli.helpers.request.requests.post")
195+
with pytest.raises(click.ClickException) as excinfo:
196+
send_commit_data(
197+
"commit_sha",
198+
"parent_sha",
199+
"pr",
200+
"branch",
201+
slug,
202+
uuid.uuid4(),
203+
service,
204+
enterprise_url,
205+
None,
206+
)
207+
assert fragment in str(excinfo.value)
208+
209+
181210
def test_commit_without_token(mocker):
182211
mocked_response = mocker.patch(
183212
"codecov_cli.services.commit.send_post_request",

codecov-cli/tests/services/empty_upload/test_empty_upload.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def test_empty_upload_with_warnings(mocker):
2626
"commit_sha",
2727
"owner/repo",
2828
uuid.uuid4(),
29-
"service",
29+
"github",
3030
None,
3131
False,
3232
False,
@@ -62,7 +62,7 @@ def test_empty_upload_with_error(mocker):
6262
"commit_sha",
6363
"owner/repo",
6464
uuid.uuid4(),
65-
"service",
65+
"github",
6666
None,
6767
False,
6868
False,
@@ -93,7 +93,7 @@ def test_empty_upload_200(mocker):
9393
runner = CliRunner()
9494
with runner.isolation() as outstreams:
9595
res = empty_upload_logic(
96-
"commit_sha", "owner/repo", token, "service", None, False, False, None
96+
"commit_sha", "owner/repo", token, "github", None, False, False, None
9797
)
9898
out_bytes = parse_outstreams_into_log_lines(outstreams[0].getvalue())
9999
assert out_bytes == [
@@ -113,7 +113,7 @@ def test_empty_upload_403(mocker):
113113
)
114114
token = uuid.uuid4()
115115
res = empty_upload_logic(
116-
"commit_sha", "owner/repo", token, "service", None, False, False, None
116+
"commit_sha", "owner/repo", token, "github", None, False, False, None
117117
)
118118
assert res.error == RequestError(
119119
code="HTTP Error 403",
@@ -138,7 +138,7 @@ def test_empty_upload_force(mocker):
138138
runner = CliRunner()
139139
with runner.isolation() as outstreams:
140140
res = empty_upload_logic(
141-
"commit_sha", "owner/repo", token, "service", None, False, True, None
141+
"commit_sha", "owner/repo", token, "github", None, False, True, None
142142
)
143143
out_bytes = parse_outstreams_into_log_lines(outstreams[0].getvalue())
144144
assert out_bytes == [
@@ -165,7 +165,7 @@ def test_empty_upload_no_token(mocker):
165165
runner = CliRunner()
166166
with runner.isolation() as outstreams:
167167
res = empty_upload_logic(
168-
"commit_sha", "owner/repo", None, "service", None, False, False, None
168+
"commit_sha", "owner/repo", None, "github", None, False, False, None
169169
)
170170

171171
out_bytes = parse_outstreams_into_log_lines(outstreams[0].getvalue())

0 commit comments

Comments
 (0)