Skip to content

Commit cf5c5a4

Browse files
committed
skip projects that don't have seer pref
1 parent f3b33d2 commit cf5c5a4

File tree

2 files changed

+89
-7
lines changed

2 files changed

+89
-7
lines changed

src/sentry/tasks/seer/context_engine_index.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,19 +260,20 @@ def index_repos(organization_id: int, *args, **kwargs) -> None:
260260
preferences_by_id = bulk_get_project_preferences(organization_id, list(project_map.keys()))
261261

262262
for project_id, project in project_map.items():
263-
existing_pref = preferences_by_id.get(str(project_id), {})
263+
existing_pref = preferences_by_id.get(str(project_id))
264+
if not existing_pref:
265+
continue
266+
264267
project_pref_repos = existing_pref.get("repositories") or []
265-
autofix_repos = get_autofix_repos_from_project_code_mappings(project)
266268

269+
autofix_repos = get_autofix_repos_from_project_code_mappings(project)
267270
# Use autofix repos to get repo languages
268271
language_map: dict[tuple[str, str, str], list[str]] = {}
269272
for autofix_repo in autofix_repos:
270273
key = (autofix_repo["provider"], autofix_repo["owner"], autofix_repo["name"])
271274
language_map[key] = autofix_repo["languages"]
272275

273-
# Use seer project rpeferences if available, else fallback to autofix repos
274-
repos = project_pref_repos if project_pref_repos else autofix_repos
275-
for repo in repos:
276+
for repo in project_pref_repos:
276277
key = (repo["provider"], repo["owner"], repo["name"])
277278
if key in org_repo_definitions:
278279
repo_definition = org_repo_definitions[key]

tests/sentry/tasks/seer/test_context_engine_index.py

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,30 @@ def test_returns_early_when_no_projects(
287287
def test_calls_seer_with_correct_org_and_repos(
288288
self, mock_mock_make_org_repo_knowledge_index_request, mock_bulk_get_project_preferences
289289
) -> None:
290-
mock_bulk_get_project_preferences.return_value = {}
290+
mock_bulk_get_project_preferences.return_value = {
291+
str(self.project1.id): {
292+
"repositories": [
293+
{
294+
"name": "sentry",
295+
"owner": "getsentry",
296+
"provider": "integrations:github",
297+
"external_id": "123",
298+
"integration_id": str(self.integration.id),
299+
}
300+
],
301+
},
302+
str(self.project2.id): {
303+
"repositories": [
304+
{
305+
"name": "relay",
306+
"owner": "getsentry",
307+
"provider": "integrations:github",
308+
"external_id": "456",
309+
"integration_id": str(self.integration.id),
310+
}
311+
],
312+
},
313+
}
291314
mock_mock_make_org_repo_knowledge_index_request.return_value.status = 200
292315
with override_options({"explorer.context_engine_indexing.enable": True}):
293316
with self.feature({"organizations:context-engine-experiments": True}):
@@ -321,7 +344,30 @@ def test_calls_seer_with_correct_org_and_repos(
321344
def test_deduplicates_repos_across_projects(
322345
self, mock_mock_make_org_repo_knowledge_index_request, mock_bulk_get_project_preferences
323346
) -> None:
324-
mock_bulk_get_project_preferences.return_value = {}
347+
mock_bulk_get_project_preferences.return_value = {
348+
str(self.project1.id): {
349+
"repositories": [
350+
{
351+
"name": "sentry",
352+
"owner": "getsentry",
353+
"provider": "integrations:github",
354+
"external_id": "123",
355+
"integration_id": str(self.integration.id),
356+
}
357+
],
358+
},
359+
str(self.project2.id): {
360+
"repositories": [
361+
{
362+
"name": "sentry",
363+
"owner": "getsentry",
364+
"provider": "integrations:github",
365+
"external_id": "123",
366+
"integration_id": str(self.integration.id),
367+
}
368+
],
369+
},
370+
}
325371
mock_mock_make_org_repo_knowledge_index_request.return_value.status = 200
326372
# Map project2 to the same repo as project1
327373
self.create_code_mapping(
@@ -385,9 +431,44 @@ def test_uses_seer_project_preferences_if_available(
385431
repos = body["repos"]
386432
repos_by_name = {r["name"]: r for r in repos}
387433

434+
assert len(repos) == 1
388435
sentry_repo = repos_by_name["sentry-seer"]
389436
assert sorted(sentry_repo["project_ids"]) == sorted([self.project1.id])
390437

438+
@mock.patch("sentry.tasks.seer.context_engine_index.bulk_get_project_preferences")
439+
@mock.patch("sentry.tasks.seer.context_engine_index.make_org_repo_knowledge_index_request")
440+
def test_skips_projects_without_seer_preferences(
441+
self, mock_mock_make_org_repo_knowledge_index_request, mock_bulk_get_project_preferences
442+
) -> None:
443+
mock_mock_make_org_repo_knowledge_index_request.return_value.status = 200
444+
445+
# Only project1 has preferences; project2 is absent from the map
446+
mock_bulk_get_project_preferences.return_value = {
447+
str(self.project1.id): {
448+
"repositories": [
449+
{
450+
"name": "sentry",
451+
"owner": "getsentry",
452+
"provider": "integrations:github",
453+
"external_id": "123",
454+
"integration_id": str(self.integration.id),
455+
}
456+
],
457+
},
458+
}
459+
460+
with override_options({"explorer.context_engine_indexing.enable": True}):
461+
with self.feature({"organizations:context-engine-experiments": True}):
462+
index_repos(self.org.id)
463+
464+
mock_mock_make_org_repo_knowledge_index_request.assert_called_once()
465+
body = mock_mock_make_org_repo_knowledge_index_request.call_args[0][0]
466+
repos = body["repos"]
467+
468+
assert len(repos) == 1
469+
assert repos[0]["name"] == "sentry"
470+
assert repos[0]["project_ids"] == [self.project1.id]
471+
391472

392473
@django_db_all
393474
class TestScheduleContextEngineIndexingTasks(TestCase):

0 commit comments

Comments
 (0)