Skip to content

Commit 043abe7

Browse files
cathtengarmenzg
authored andcommitted
ref(github-growth): check external id when creating repo (#53307)
1 parent 4181937 commit 043abe7

File tree

4 files changed

+31
-10
lines changed

4 files changed

+31
-10
lines changed

src/sentry/plugins/providers/integration_repository.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,32 +85,34 @@ def create_repository(
8585

8686
integration_id = result.get("integration_id")
8787
external_id = result.get("external_id")
88+
name = result.get("name")
8889

8990
repo_update_params = {
9091
"external_id": external_id,
9192
"url": result.get("url"),
9293
"config": result.get("config") or {},
9394
"provider": self.id,
9495
"integration_id": integration_id,
96+
"name": name,
9597
}
9698

9799
# first check if there is an existing hidden repository with an integration that matches
98100
existing_repo = Repository.objects.filter(
99101
organization_id=organization.id,
100-
name=result["name"],
101102
integration_id=integration_id,
102103
external_id=external_id,
103104
status=ObjectStatus.HIDDEN,
104105
).first()
105106
if existing_repo:
106107
existing_repo.status = ObjectStatus.ACTIVE
108+
existing_repo.name = name
107109
existing_repo.save()
108110
metrics.incr("sentry.integration_repo_provider.repo_relink")
109111
return result, existing_repo
110112

111113
# then check if there is a repository without an integration that matches
112114
repo = Repository.objects.filter(
113-
organization_id=organization.id, name=result["name"], integration_id=None
115+
organization_id=organization.id, external_id=external_id, integration_id=None
114116
).first()
115117

116118
if repo:
@@ -133,18 +135,23 @@ def create_repository(
133135
try:
134136
with transaction.atomic(router.db_for_write(Repository)):
135137
repo = Repository.objects.create(
136-
organization_id=organization.id, name=result["name"], **repo_update_params
138+
organization_id=organization.id, **repo_update_params
137139
)
138140
except IntegrityError:
139141
# Try to delete webhook we just created
140142
try:
141-
repo = Repository(
142-
organization_id=organization.id, name=result["name"], **repo_update_params
143-
)
143+
repo = Repository(organization_id=organization.id, **repo_update_params)
144144
self.on_delete_repository(repo)
145145
except IntegrationError:
146146
pass
147147

148+
# if possible update the repo with matching integration
149+
repo = Repository.objects.filter(
150+
organization_id=organization.id,
151+
external_id=external_id,
152+
integration_id=integration_id,
153+
).update(**repo_update_params)
154+
148155
raise RepoExistsError
149156

150157
return result, repo

tests/sentry/api/endpoints/test_organization_repositories.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,10 @@ def test_simple(self, mock_build_repository_config):
333333
)
334334
def test_floating_repo(self, mock_build_repository_config):
335335
repo = Repository.objects.create(
336-
organization_id=self.org.id, name="getsentry/sentry", status=2
336+
organization_id=self.org.id,
337+
name="getsentry/sentry",
338+
status=2,
339+
external_id="my_external_id",
337340
)
338341
with patch.object(
339342
ExampleRepositoryProvider, "build_repository_config", return_value=self.repo_config_data

tests/sentry/integrations/github/test_webhooks.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ def test_ignores_hidden_repo(self):
162162
name="baxterthehacker/public-repo",
163163
)
164164
repo.status = ObjectStatus.HIDDEN
165+
repo.external_id = "35129377"
165166
repo.save()
166167

167168
self._setup_repo_test(project)
@@ -453,6 +454,7 @@ def test_ignores_hidden_repo(self):
453454
name="baxterthehacker/public-repo",
454455
)
455456
repo.status = ObjectStatus.HIDDEN
457+
repo.external_id = "35129377"
456458
repo.save()
457459

458460
self._setup_repo_test(project)

tests/sentry/plugins/test_integration_repository.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ def setUp(self):
4545
def provider(self):
4646
return GitHubRepositoryProvider("integrations:github")
4747

48-
def _create_repo(self, external_id=None):
48+
def _create_repo(self, external_id=None, name=None):
4949
return Repository.objects.create(
50-
name=self.repo_name,
50+
name=name if name else self.repo_name,
5151
provider="integrations:github",
5252
organization_id=self.organization.id,
5353
integration_id=self.integration.id,
@@ -66,11 +66,20 @@ def test_create_repository(self, get_jwt):
6666
assert repos[0].provider == "integrations:github"
6767

6868
def test_create_repository__repo_exists(self, get_jwt):
69-
self._create_repo()
69+
self._create_repo(external_id=self.config["external_id"])
7070

7171
with pytest.raises(RepoExistsError):
7272
self.provider.create_repository(self.config, self.organization)
7373

74+
def test_create_repository__repo_exists_update_name(self, get_jwt):
75+
repo = self._create_repo(external_id=self.config["external_id"], name="getsentry/santry")
76+
77+
with pytest.raises(RepoExistsError):
78+
self.provider.create_repository(self.config, self.organization)
79+
80+
repo.refresh_from_db()
81+
assert repo.name == self.repo_name
82+
7483
@patch("sentry.models.Repository.objects.create")
7584
@patch("sentry.plugins.providers.IntegrationRepositoryProvider.on_delete_repository")
7685
def test_create_repository__delete_webhook(self, mock_on_delete, mock_repo, get_jwt):

0 commit comments

Comments
 (0)