Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion codecov-cli/codecov_cli/commands/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,27 @@
import os
import pathlib
import typing

import click
import sentry_sdk

from codecov_cli.fallbacks import CodecovOption, FallbackFieldEnum
from codecov_cli.helpers.args import get_cli_args
from codecov_cli.helpers.options import global_options
from codecov_cli.helpers.upload_type import ReportType, report_type_from_str
from codecov_cli.services.upload import do_upload_logic
from codecov_cli.types import CommandContext
from codecov_cli.helpers.upload_type import report_type_from_str, ReportType

logger = logging.getLogger("codecovcli")

DEFAULT_URL_PATHS = {
ReportType.COVERAGE: {
"upload_coverage": "/upload/{git_service}/{encoded_slug}/upload-coverage",
"uploads": "/upload/{git_service}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/uploads",
},
ReportType.TEST_RESULTS: "/upload/test_results/v1",
}


def _turn_env_vars_into_dict(ctx, params, value):
return dict((v, os.getenv(v, None)) for v in value)
Expand Down Expand Up @@ -264,6 +273,8 @@ def do_upload(
ci_adapter = ctx.obj.get("ci_adapter")
enterprise_url = ctx.obj.get("enterprise_url")
args = get_cli_args(ctx)

url_paths = ctx.obj.get("url_paths", DEFAULT_URL_PATHS)
logger.debug(
"Starting upload processing",
extra=dict(
Expand All @@ -276,6 +287,7 @@ def do_upload(
cli_config,
versioning_system,
ci_adapter,
url_paths,
branch=branch,
build_code=build_code,
build_url=build_url,
Expand Down
10 changes: 8 additions & 2 deletions codecov-cli/codecov_cli/commands/upload_coverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@

from codecov_cli.commands.commit import create_commit
from codecov_cli.commands.report import create_report
from codecov_cli.commands.upload import do_upload, global_upload_options
from codecov_cli.commands.upload import (
DEFAULT_URL_PATHS,
do_upload,
global_upload_options,
)
from codecov_cli.helpers.args import get_cli_args
from codecov_cli.helpers.options import global_options
from codecov_cli.helpers.upload_type import ReportType, report_type_from_str
from codecov_cli.opentelemetry import close_telem
from codecov_cli.helpers.upload_type import report_type_from_str, ReportType
from codecov_cli.services.upload_coverage import upload_coverage_logic
from codecov_cli.types import CommandContext

Expand Down Expand Up @@ -83,11 +87,13 @@ def upload_coverage(
ci_adapter = ctx.obj.get("ci_adapter")
enterprise_url = ctx.obj.get("enterprise_url")
args = get_cli_args(ctx)
url_paths = ctx.obj.get("url_paths", DEFAULT_URL_PATHS)
ctx.invoke(
upload_coverage_logic,
cli_config,
versioning_system,
ci_adapter,
url_paths=url_paths,
branch=branch,
build_code=build_code,
build_url=build_url,
Expand Down
4 changes: 3 additions & 1 deletion codecov-cli/codecov_cli/services/upload/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from codecov_cli.fallbacks import FallbackFieldEnum
from codecov_cli.helpers.ci_adapters.base import CIAdapterBase
from codecov_cli.helpers.request import log_warnings_and_errors_if_any
from codecov_cli.helpers.versioning_systems import VersioningSystemInterface
from codecov_cli.helpers.upload_type import ReportType
from codecov_cli.helpers.versioning_systems import VersioningSystemInterface
from codecov_cli.plugins import select_preparation_plugins
from codecov_cli.services.upload.file_finder import select_file_finder
from codecov_cli.services.upload.legacy_upload_sender import LegacyUploadSender
Expand All @@ -25,6 +25,7 @@ def do_upload_logic(
cli_config: typing.Dict,
versioning_system: VersioningSystemInterface,
ci_adapter: CIAdapterBase,
url_paths: typing.Dict,
upload_coverage: bool = False,
*,
args: dict = None,
Expand Down Expand Up @@ -141,6 +142,7 @@ def do_upload_logic(
token=token,
env_vars=env_vars,
report_code=report_code,
url_paths=url_paths,
report_type=report_type,
name=name,
branch=branch,
Expand Down
22 changes: 17 additions & 5 deletions codecov-cli/codecov_cli/services/upload/upload_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@
from codecov_cli import __version__ as codecov_cli_version
from codecov_cli.helpers.config import CODECOV_INGEST_URL
from codecov_cli.helpers.encoder import encode_slug
from codecov_cli.helpers.upload_type import ReportType
from codecov_cli.helpers.request import (
get_token_header,
send_post_request,
send_put_request,
)
from codecov_cli.helpers.upload_type import ReportType
from codecov_cli.types import (
RequestResult,
UploadCollectionResult,
Expand All @@ -33,6 +33,7 @@ def send_upload_data(
token: typing.Optional[str],
env_vars: typing.Dict[str, str],
report_code: str,
url_paths: typing.Dict,
report_type: ReportType = ReportType.COVERAGE,
name: typing.Optional[str] = None,
branch: typing.Optional[str] = None,
Expand Down Expand Up @@ -90,6 +91,7 @@ def send_upload_data(
encoded_slug,
commit_sha,
report_code,
url_paths,
upload_coverage,
)
# Data that goes to storage
Expand Down Expand Up @@ -212,21 +214,31 @@ def get_url_and_possibly_update_data(
encoded_slug,
commit_sha,
report_code,
url_paths: typing.Dict,
upload_coverage=False,
file_not_found=False,
):
if report_type == ReportType.COVERAGE:
base_url = f"{upload_url}/upload/{git_service}/{encoded_slug}"
coverage_paths = url_paths[report_type]
if upload_coverage:
url = f"{base_url}/upload-coverage"
path_template = coverage_paths["upload_coverage"]
else:
url = f"{base_url}/commits/{commit_sha}/reports/{report_code}/uploads"
path_template = coverage_paths["uploads"]

url = upload_url + path_template.format(
git_service=git_service,
encoded_slug=encoded_slug,
commit_sha=commit_sha,
report_code=report_code,
)
elif report_type == ReportType.TEST_RESULTS:
data["slug"] = encoded_slug
data["branch"] = branch
data["commit"] = commit_sha
data["service"] = git_service
data["file_not_found"] = file_not_found
url = f"{upload_url}/upload/test_results/v1"

path_template = url_paths[report_type]
url = upload_url + path_template

return url, data
4 changes: 3 additions & 1 deletion codecov-cli/codecov_cli/services/upload_coverage/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@
import typing

from codecov_cli.helpers.ci_adapters.base import CIAdapterBase
from codecov_cli.helpers.upload_type import ReportType
from codecov_cli.helpers.versioning_systems import VersioningSystemInterface
from codecov_cli.services.upload import do_upload_logic
from codecov_cli.helpers.upload_type import ReportType


def upload_coverage_logic(
cli_config: typing.Dict,
versioning_system: VersioningSystemInterface,
ci_adapter: CIAdapterBase,
url_paths: typing.Dict,
*,
branch: typing.Optional[str],
build_code: typing.Optional[str],
Expand Down Expand Up @@ -53,6 +54,7 @@ def upload_coverage_logic(
cli_config=cli_config,
versioning_system=versioning_system,
ci_adapter=ci_adapter,
url_paths=url_paths,
upload_coverage=True,
args=args,
branch=branch,
Expand Down
39 changes: 30 additions & 9 deletions codecov-cli/tests/helpers/test_upload_sender.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import json
import re
from copy import deepcopy
from pathlib import Path

from copy import deepcopy
import pytest
import responses
from responses import matchers

from codecov_cli import __version__ as codecov_cli_version
from codecov_cli.commands.upload import DEFAULT_URL_PATHS
from codecov_cli.helpers.encoder import encode_slug
from codecov_cli.helpers.upload_type import ReportType
from codecov_cli.services.upload.upload_sender import UploadSender
from codecov_cli.types import (
UploadCollectionResult,
UploadCollectionResultFileFixer,
UploadCollectionResultFile,
UploadCollectionResultFileFixer,
)
from tests.data import reports_examples
from codecov_cli.helpers.upload_type import ReportType

upload_collection = UploadCollectionResult(["1", "apple.py", "3"], [], [])
random_token = "f359afb9-8a2a-42ab-a448-c3d267ff495b"
Expand All @@ -26,6 +27,7 @@
"report_type": ReportType.COVERAGE,
"report_code": "report_code",
"env_vars": {},
"url_paths": DEFAULT_URL_PATHS,
"name": "name",
"branch": "branch",
"slug": "org/repo",
Expand All @@ -41,6 +43,7 @@
"report_type": ReportType.TEST_RESULTS,
"report_code": "report_code",
"env_vars": {},
"url_paths": DEFAULT_URL_PATHS,
"name": "name",
"branch": "branch",
"slug": "org/repo",
Expand Down Expand Up @@ -351,7 +354,10 @@ def test_upload_sender_post_called_with_right_parameters_tokenless(
]

sending_result = UploadSender().send_upload_data(
upload_collection, random_sha, None, **named_upload_data
upload_collection,
random_sha,
None,
**named_upload_data,
)
assert sending_result.error is None
assert sending_result.warnings == []
Expand All @@ -374,7 +380,10 @@ def test_upload_sender_put_called_with_right_parameters(
self, mocked_responses, mocked_legacy_upload_endpoint, mocked_storage_server
):
sending_result = UploadSender().send_upload_data(
upload_collection, random_sha, random_token, **named_upload_data
upload_collection,
random_sha,
random_token,
**named_upload_data,
)
assert sending_result.error is None
assert sending_result.warnings == []
Expand All @@ -388,7 +397,10 @@ def test_upload_sender_result_success(
self, mocked_responses, mocked_legacy_upload_endpoint, mocked_storage_server
):
sender = UploadSender().send_upload_data(
upload_collection, random_sha, random_token, **named_upload_data
upload_collection,
random_sha,
random_token,
**named_upload_data,
)

# default status for both put and post is 200
Expand All @@ -402,7 +414,10 @@ def test_upload_sender_result_fail_post_400(
mocked_legacy_upload_endpoint.status = 400

sender = UploadSender().send_upload_data(
upload_collection, random_sha, random_token, **named_upload_data
upload_collection,
random_sha,
random_token,
**named_upload_data,
)

assert len(mocked_responses.calls) == 1
Expand Down Expand Up @@ -439,7 +454,10 @@ def test_upload_sender_result_fail_put_400(
mocked_storage_server.status = 400

sender = UploadSender().send_upload_data(
upload_collection, random_sha, random_token, **named_upload_data
upload_collection,
random_sha,
random_token,
**named_upload_data,
)

assert len(mocked_responses.calls) == 2
Expand All @@ -455,7 +473,10 @@ def test_upload_sender_http_error_with_invalid_sha(
mocked_legacy_upload_endpoint.status = 400

sender = UploadSender().send_upload_data(
upload_collection, random_sha, random_token, **named_upload_data
upload_collection,
random_sha,
random_token,
**named_upload_data,
)

assert sender.error is not None
Expand Down
11 changes: 11 additions & 0 deletions codecov-cli/tests/services/upload/test_upload_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import pytest
from click.testing import CliRunner

from codecov_cli.commands.upload import DEFAULT_URL_PATHS
from codecov_cli.helpers.upload_type import ReportType
from codecov_cli.services.upload import (
LegacyUploadSender,
Expand Down Expand Up @@ -48,6 +49,7 @@ def test_do_upload_logic_happy_path_legacy_uploader(mocker):
cli_config,
versioning_system,
ci_adapter,
DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
commit_sha="commit_sha",
report_code="report_code",
Expand Down Expand Up @@ -116,6 +118,7 @@ def test_do_upload_logic_happy_path_legacy_uploader(mocker):
token="token",
env_vars=None,
report_code="report_code",
url_paths=DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
name="name",
branch="branch",
Expand Down Expand Up @@ -165,6 +168,7 @@ def test_do_upload_logic_happy_path(mocker):
cli_config,
versioning_system,
ci_adapter,
DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
commit_sha="commit_sha",
report_code="report_code",
Expand Down Expand Up @@ -231,6 +235,7 @@ def test_do_upload_logic_happy_path(mocker):
token="token",
env_vars=None,
report_code="report_code",
url_paths=DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
name="name",
branch="branch",
Expand Down Expand Up @@ -276,6 +281,7 @@ def test_do_upload_logic_dry_run(mocker):
cli_config,
versioning_system,
ci_adapter,
DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
commit_sha="commit_sha",
report_code="report_code",
Expand Down Expand Up @@ -362,6 +368,7 @@ def test_do_upload_logic_verbose(mocker, use_verbose_option):
cli_config,
versioning_system,
ci_adapter,
DEFAULT_URL_PATHS,
branch="branch",
build_code="build_code",
build_url="build_url",
Expand Down Expand Up @@ -444,6 +451,7 @@ def side_effect(*args, **kwargs):
cli_config,
versioning_system,
ci_adapter,
DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
commit_sha="commit_sha",
report_code="report_code",
Expand Down Expand Up @@ -550,6 +558,7 @@ def side_effect(*args, **kwargs):
cli_config,
versioning_system,
ci_adapter,
DEFAULT_URL_PATHS,
report_type=ReportType.COVERAGE,
commit_sha="commit_sha",
report_code="report_code",
Expand Down Expand Up @@ -640,6 +649,7 @@ def test_do_upload_logic_happy_path_test_results(mocker):
cli_config,
versioning_system,
ci_adapter,
url_paths={ReportType.TEST_RESULTS: "upload/test_results/v1"},
args={"args": "fake_args"},
branch="branch",
build_code="build_code",
Expand Down Expand Up @@ -694,6 +704,7 @@ def test_do_upload_logic_happy_path_test_results(mocker):
commit_sha="commit_sha",
token="token",
env_vars=None,
url_paths={ReportType.TEST_RESULTS: "upload/test_results/v1"},
report_code="report_code",
report_type=ReportType.TEST_RESULTS,
name="name",
Expand Down
Loading
Loading