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

Commit 8e1560b

Browse files
committed
Combined Upload v1
1 parent af557db commit 8e1560b

File tree

5 files changed

+46
-64
lines changed

5 files changed

+46
-64
lines changed

upload/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from upload.views.bundle_analysis import BundleAnalysisView
44
from upload.views.commits import CommitViews
5+
from upload.views.combined_upload import CombinedUploadView
56
from upload.views.empty_upload import EmptyUploadView
67
from upload.views.legacy import UploadDownloadHandler, UploadHandler
78
from upload.views.reports import ReportResultsView, ReportViews
@@ -57,6 +58,11 @@
5758
CommitViews.as_view(),
5859
name="new_upload.commits",
5960
),
61+
path(
62+
"<str:service>/<str:repo>/combined-upload",
63+
CombinedUploadView.as_view(),
64+
name="new_upload.combined_upload",
65+
),
6066
# This was getting in the way of the new endpoints, so I moved to the end
6167
re_path(r"(?P<version>\w+)/?", UploadHandler.as_view(), name="upload-handler"),
6268
]

upload/views/combined_upload.py

Lines changed: 34 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import logging
22

3+
from django.conf import settings
4+
from django.http import HttpRequest
35
from rest_framework import status
4-
from rest_framework.generics import ListCreateAPIView
6+
from rest_framework.views import APIView
57
from rest_framework.response import Response
8+
from services.archive import ArchiveService
69

710
from codecov_auth.authentication.repo_auth import (
811
GitHubOIDCTokenAuthentication,
@@ -19,18 +22,15 @@
1922
UploadSerializer,
2023
)
2124
from upload.throttles import UploadsPerCommitThrottle, UploadsPerWindowThrottle
25+
from upload.views.base import GetterMixin
2226
from upload.views.commits import CommitLogicMixin
2327
from upload.views.reports import ReportLogicMixin
2428
from upload.views.uploads import CanDoCoverageUploadsPermission, UploadLogicMixin
2529

2630
log = logging.getLogger(__name__)
2731

2832

29-
class CombinedUploadMixin(CommitLogicMixin, ReportLogicMixin, UploadLogicMixin):
30-
pass
31-
32-
33-
class CombinedUploadView(ListCreateAPIView, CombinedUploadMixin):
33+
class CombinedUploadView(APIView, GetterMixin, CommitLogicMixin, ReportLogicMixin, UploadLogicMixin):
3434
permission_classes = [CanDoCoverageUploadsPermission]
3535
authentication_classes = [
3636
UploadTokenRequiredAuthenticationCheck,
@@ -40,86 +40,62 @@ class CombinedUploadView(ListCreateAPIView, CombinedUploadMixin):
4040
RepositoryLegacyTokenAuthentication,
4141
TokenlessAuthentication,
4242
]
43-
throttle_classes = [UploadsPerCommitThrottle, UploadsPerWindowThrottle]
4443

4544
def get_exception_handler(self):
4645
return repo_auth_custom_exception_handler
4746

48-
def create(self, request, *args, **kwargs):
47+
def post(self, request: HttpRequest, *args, **kwargs) -> Response:
4948
# Create commit
5049
create_commit_data = dict(
50+
commitid=request.data.get("commit_sha"),
51+
parent_commit_id=request.data.get("parent_sha"),
52+
pullid=request.data.get("pull_request_number"),
5153
branch=request.data.get("branch"),
52-
commit_sha=request.data.get("commit_sha"),
53-
fail_on_error=True,
54-
git_service=request.data.get("git_service"),
55-
parent_sha=request.data.get("parent_sha"),
56-
pull_request_number=request.data.get("pull_request_number"),
57-
slug=request.data.get("slug"),
58-
token=request.data.get("token"),
5954
)
6055
commit_serializer = CommitSerializer(data=create_commit_data)
61-
commit_serializer.is_valid(raise_exception=True)
62-
56+
if not commit_serializer.is_valid():
57+
return Response(
58+
commit_serializer.errors, status=status.HTTP_400_BAD_REQUEST
59+
)
60+
log.info(f"Creating commit for {commit_serializer.validated_data}")
6361
repository = self.get_repo()
6462
commit = self.create_commit(commit_serializer, repository)
6563

6664
# Create report
6765
commit_report_data = dict(
6866
code=request.data.get("code"),
69-
commit_sha=request.data.get("commit_sha"),
70-
fail_on_error=True,
71-
git_service=request.data.get("git_service"),
72-
slug=request.data.get("slug"),
73-
token=request.data.get("token"),
7467
)
7568
commit_report_serializer = CommitReportSerializer(data=commit_report_data)
69+
if not commit_report_serializer.is_valid():
70+
return Response(
71+
commit_report_serializer.errors, status=status.HTTP_400_BAD_REQUEST
72+
)
7673
report = self.create_report(commit_report_serializer, repository, commit)
7774

7875
# Do upload
7976
upload_data = dict(
80-
branch=request.data.get("branch"),
81-
build_code=request.data.get("build_code"),
82-
build_url=request.data.get("build_url"),
83-
commit_sha=request.data.get("commit_sha"),
84-
disable_file_fixes=request.data.get("disable_file_fixes"),
85-
disable_search=request.data.get("disable_search"),
86-
dry_run=request.data.get("dry_run"),
87-
env_vars=request.data.get("env_vars"),
88-
fail_on_error=request.data.get("fail_on_error"),
89-
files_search_exclude_folders=request.data.get(
90-
"files_search_exclude_folders"
91-
),
92-
files_search_explicitly_listed_files=request.data.get(
93-
"files_search_explicitly_listed_files"
94-
),
95-
files_search_root_folder=request.data.get("files_search_root_folder"),
77+
ci_url=request.data.get("build_url"),
78+
env=request.data.get("env_vars"),
9679
flags=request.data.get("flags"),
97-
gcov_args=request.data.get("gcov_args"),
98-
gcov_executable=request.data.get("gcov_executable"),
99-
gcov_ignore=request.data.get("gcov_ignore"),
100-
gcov_include=request.data.get("gcov_include"),
101-
git_service=request.data.get("git_service"),
102-
handle_no_reports_found=request.data.get("handle_no_reports_found"),
80+
ci_service=request.data.get("ci_service"),
10381
job_code=request.data.get("job_code"),
10482
name=request.data.get("name"),
105-
network_filter=request.data.get("network_filter"),
106-
network_prefix=request.data.get("network_prefix"),
107-
network_root_folder=request.data.get("network_root_folder"),
108-
plugin_names=request.data.get("plugin_names"),
109-
pull_request_number=request.data.get("pull_request_number"),
110-
report_code=report.code,
111-
report_type=request.data.get("report_type"),
112-
slug=request.data.get("slug"),
113-
swift_project=request.data.get("swift_project"),
114-
token=request.data.get("token"),
115-
use_legacy_uploader=request.data.get("use_legacy_uploader"),
11683
)
11784
upload_serializer = UploadSerializer(data=upload_data)
118-
upload_serializer.is_valid(raise_exception=True)
119-
85+
if not upload_serializer.is_valid():
86+
return Response(upload_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
12087
instance = self.create_upload(upload_serializer, repository, commit, report)
88+
89+
repository = instance.report.commit.repository
90+
commit = instance.report.commit
91+
92+
url = f"{settings.CODECOV_DASHBOARD_URL}/{repository.author.service}/{repository.author.username}/{repository.name}/commit/{commit.commitid}"
93+
94+
archive_service = ArchiveService(repository)
95+
raw_upload_location = archive_service.create_presigned_put(instance.storage_path)
96+
12197
if instance:
122-
return Response(data=instance.data, status=status.HTTP_201_CREATED)
98+
return Response({"raw_upload_location": raw_upload_location, "url": url}, status=status.HTTP_201_CREATED)
12399
else:
124100
return Response(
125101
upload_serializer.errors, status=status.HTTP_400_BAD_REQUEST

upload/views/commits.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@
2626
log = logging.getLogger(__name__)
2727

2828

29-
class CommitLogicMixin(GetterMixin):
29+
class CommitLogicMixin:
3030
def create_commit(self, serializer, repository):
3131
validate_activated_repo(repository)
3232
commit = serializer.save(repository=repository)
3333
return commit
3434

3535

36-
class CommitViews(ListCreateAPIView, CommitLogicMixin):
36+
class CommitViews(ListCreateAPIView, GetterMixin, CommitLogicMixin):
3737
serializer_class = CommitSerializer
3838
permission_classes = [CanDoCoverageUploadsPermission]
3939
authentication_classes = [

upload/views/reports.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
log = logging.getLogger(__name__)
2929

3030

31-
class ReportLogicMixin(GetterMixin):
31+
class ReportLogicMixin:
3232
def create_report(self, serializer, repository, commit):
3333
code = serializer.validated_data.get("code")
3434
if code == "default":
@@ -44,7 +44,7 @@ def create_report(self, serializer, repository, commit):
4444
return instance
4545

4646

47-
class ReportViews(ListCreateAPIView, ReportLogicMixin):
47+
class ReportViews(ListCreateAPIView, GetterMixin, ReportLogicMixin):
4848
serializer_class = CommitReportSerializer
4949
permission_classes = [CanDoCoverageUploadsPermission]
5050
authentication_classes = [

upload/views/uploads.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def has_permission(self, request, view):
4949
)
5050

5151

52-
class UploadLogicMixin(GetterMixin):
52+
class UploadLogicMixin:
5353
def create_upload(self, serializer, repository, commit, report):
5454
version = (
5555
serializer.validated_data["version"]
@@ -182,7 +182,7 @@ def get_token_for_analytics(self, commit: Commit):
182182
return token
183183

184184

185-
class UploadViews(ListCreateAPIView, UploadLogicMixin):
185+
class UploadViews(ListCreateAPIView, GetterMixin, UploadLogicMixin):
186186
serializer_class = UploadSerializer
187187
permission_classes = [
188188
CanDoCoverageUploadsPermission,

0 commit comments

Comments
 (0)