Browse Source

fix(release): Use latest release commit when dupes are present (#76141)

See comment for explanation

Closes https://github.com/getsentry/sentry/issues/75964
Fixes [SENTRY-390Z](https://sentry.sentry.io/issues/5319784997/)
Seiji Chew 7 months ago
parent
commit
a0a0832ef9

+ 20 - 13
src/sentry/api/endpoints/project_release_commits.py

@@ -54,24 +54,31 @@ class ProjectReleaseCommitsEndpoint(ProjectEndpoint):
         repo_name = request.query_params.get("repo_name")
 
         # prefer repo external ID to name
+        # NOTE: We filter on Repository here instead of using get b/c sometimes,
+        # we have have multiple repos for the same external_id/name that differ
+        # in other fields that differ such as 'provider' or 'config'.
         if repo_id:
-            try:
-                repo = Repository.objects.get(
-                    organization_id=organization_id, external_id=repo_id, status=ObjectStatus.ACTIVE
-                )
-                queryset = queryset.filter(commit__repository_id=repo.id)
-            except Repository.DoesNotExist:
+            repos = Repository.objects.filter(
+                organization_id=organization_id, external_id=repo_id, status=ObjectStatus.ACTIVE
+            ).order_by("-date_added")
+
+            latest_repo = repos.first()
+            if latest_repo is None:
                 raise ResourceDoesNotExist
 
-        elif repo_name:
-            try:
-                repo = Repository.objects.get(
-                    organization_id=organization_id, name=repo_name, status=ObjectStatus.ACTIVE
-                )
-                queryset = queryset.filter(commit__repository_id=repo.id)
-            except Repository.DoesNotExist:
+            queryset = queryset.filter(commit__repository_id=latest_repo.id)
+
+        if repo_name:
+            repos = Repository.objects.filter(
+                organization_id=organization_id, name=repo_name, status=ObjectStatus.ACTIVE
+            ).order_by("-date_added")
+
+            latest_repo = repos.first()
+            if latest_repo is None:
                 raise ResourceDoesNotExist
 
+            queryset = queryset.filter(commit__repository_id=latest_repo.id)
+
         return self.paginate(
             request=request,
             queryset=queryset,

+ 25 - 0
tests/sentry/api/endpoints/test_project_release_commits.py

@@ -82,6 +82,31 @@ class ReleaseCommitsListTest(APITestCase):
         assert response.data[0]["id"] == self.commit2.key
         assert response.data[1]["id"] == self.commit.key
 
+    def test_query_external_id_with_duplicate_repos(self):
+        newest_repo = Repository.objects.create(
+            organization_id=self.project.organization_id,
+            name=self.project.name,
+            external_id=123,
+        )
+        new_commit = Commit.objects.create(
+            organization_id=self.project.organization_id, repository_id=newest_repo.id, key="c" * 40
+        )
+        ReleaseCommit.objects.create(
+            organization_id=self.project.organization_id,
+            release=self.release,
+            commit=new_commit,
+            order=2,
+        )
+        response = self.get_success_response(
+            self.project.organization.slug,
+            self.project.slug,
+            self.release.version,
+            qs_params={"repo_id": newest_repo.external_id},
+        )
+
+        assert len(response.data) == 1
+        assert response.data[0]["id"] == new_commit.key
+
     def test_query_does_not_exist(self):
         self.get_error_response(
             self.project.organization.slug,