Skip to content
Open
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
4 changes: 1 addition & 3 deletions src/sentry/api/endpoints/project_stacktrace_coverage.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from rest_framework.request import Request
from rest_framework.response import Response

from sentry import features
from sentry.api.api_owners import ApiOwner
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import cell_silo_endpoint
Expand Down Expand Up @@ -53,8 +52,7 @@ def get(self, request: Request, project: Project) -> Response:
if not configs:
return Response({"detail": "No code mappings found for this project"}, status=400)

use_fk = features.has("organizations:project-repository-fk-reads", project.organization)
result = get_stacktrace_config(configs, ctx, use_project_repository_fk=use_fk)
result = get_stacktrace_config(configs, ctx)
error = result["error"]
serialized_config = None

Expand Down
11 changes: 1 addition & 10 deletions src/sentry/api/serializers/models/projectcodeowners.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import logging
from typing import Any

from sentry import features
from sentry.api.serializers import Serializer, register, serialize
from sentry.integrations.api.serializers.models.repository_project_path_config import (
RepositoryProjectPathConfigSerializer,
Expand All @@ -24,12 +23,6 @@ def __init__(

def get_attrs(self, item_list, user, **kwargs):
attrs = {}
use_fk = False
if item_list:
use_fk = features.has(
"organizations:project-repository-fk-reads",
item_list[0].project.organization,
)
integrations = {
i.id: i
for i in integration_service.get_integrations(
Expand All @@ -38,9 +31,7 @@ def get_attrs(self, item_list, user, **kwargs):
}
for item in item_list:
code_mapping = item.repository_project_path_config
repository = (
code_mapping.project_repository.repository if use_fk else code_mapping.repository
)
repository = code_mapping.project_repository.repository

integration = integrations[item.repository_project_path_config.integration_id]
install = integration.get_installation(
Expand Down
32 changes: 10 additions & 22 deletions src/sentry/autopilot/tasks/missing_sdk_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from pydantic import BaseModel, Field

from sentry import features, options
from sentry import options
from sentry.autopilot.tasks.common import AutopilotDetectorName, create_instrumentation_issue
from sentry.constants import INTEGRATION_ID_TO_PLATFORM_DATA, ObjectStatus
from sentry.integrations.models.repository_project_path_config import RepositoryProjectPathConfig
Expand Down Expand Up @@ -88,28 +88,16 @@ def run_missing_sdk_integration_detector() -> None:
continue

# Get repo configs for this project
if features.has("organizations:project-repository-fk-reads", project.organization):
repo_names = (
RepositoryProjectPathConfig.objects.filter(
project_repository__project=project,
project_repository__repository__status=ObjectStatus.ACTIVE,
project_repository__repository__provider="integrations:github",
)
.order_by("project_repository__repository__name")
.distinct("project_repository__repository__name")
.values_list("project_repository__repository__name", flat=True)
)
else:
repo_names = (
RepositoryProjectPathConfig.objects.filter(
project=project,
repository__status=ObjectStatus.ACTIVE,
repository__provider="integrations:github",
)
.order_by("repository__name")
.distinct("repository__name")
.values_list("repository__name", flat=True)
repo_names = (
RepositoryProjectPathConfig.objects.filter(
project_repository__project=project,
project_repository__repository__status=ObjectStatus.ACTIVE,
project_repository__repository__provider="integrations:github",
)
.order_by("project_repository__repository__name")
.distinct("project_repository__repository__name")
.values_list("project_repository__repository__name", flat=True)
)
for repo_name in repo_names:
run_missing_sdk_integration_detector_for_project_task.apply_async(
args=(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from rest_framework.request import Request
from rest_framework.response import Response

from sentry import features
from sentry.api.api_owners import ApiOwner
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import cell_silo_endpoint
Expand All @@ -16,7 +15,7 @@
from sentry.shared_integrations.exceptions import ApiError


def get_codeowner_contents(config, use_project_repository_fk: bool = False):
def get_codeowner_contents(config):
if not config.organization_integration_id:
raise NotFound(detail="No associated integration")

Expand All @@ -25,12 +24,8 @@ def get_codeowner_contents(config, use_project_repository_fk: bool = False):
)
if not integration:
return None
if use_project_repository_fk:
org_id = config.project_repository.project.organization_id
repository = config.project_repository.repository
else:
org_id = config.project.organization_id
repository = config.repository
org_id = config.project_repository.project.organization_id
repository = config.project_repository.repository
install = integration.get_installation(organization_id=org_id)
if isinstance(install, RepositoryIntegration):
return install.get_codeowner_file(repository, ref=config.default_branch)
Expand All @@ -52,8 +47,6 @@ def convert_args(self, request: Request, organization_id_or_slug, config_id, *ar

try:
kwargs["config"] = RepositoryProjectPathConfig.objects.select_related(
"project",
"repository",
"project_repository__project",
"project_repository__repository",
).get(
Expand All @@ -67,8 +60,7 @@ def convert_args(self, request: Request, organization_id_or_slug, config_id, *ar

def get(self, request: Request, config_id, organization, config) -> Response:
try:
use_fk = features.has("organizations:project-repository-fk-reads", organization)
codeowner_contents = get_codeowner_contents(config, use_project_repository_fk=use_fk)
codeowner_contents = get_codeowner_contents(config)
except ApiError as e:
return self.respond({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from rest_framework.request import Request
from rest_framework.response import Response

from sentry import features
from sentry.api.api_owners import ApiOwner
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import cell_silo_endpoint
Expand Down Expand Up @@ -40,7 +39,7 @@ def convert_args(self, request: Request, organization_id_or_slug, config_id, *ar
)
try:
kwargs["config"] = RepositoryProjectPathConfig.objects.select_related(
"project", "project_repository__project"
"project_repository__project"
).get(
id=config_id,
organization_integration_id__in=[oi.id for oi in ois],
Expand Down Expand Up @@ -69,10 +68,7 @@ def put(self, request: Request, config_id, organization, config, new_project) ->
:param string default_branch:
:auth: required
"""
if features.has("organizations:project-repository-fk-reads", organization):
project = config.project_repository.project
else:
project = config.project
project = config.project_repository.project
if not request.access.has_projects_access([project, new_project]):
return self.respond(status=status.HTTP_403_FORBIDDEN)

Expand Down Expand Up @@ -109,10 +105,7 @@ def delete(self, request: Request, config_id, organization, config) -> Response:
:auth: required
"""

if features.has("organizations:project-repository-fk-reads", organization):
project = config.project_repository.project
else:
project = config.project
project = config.project_repository.project
if not request.access.has_project_access(project):
return self.respond(status=status.HTTP_403_FORBIDDEN)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from rest_framework.request import Request
from rest_framework.response import Response

from sentry import features
from sentry.api.api_owners import ApiOwner
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import cell_silo_endpoint
Expand Down Expand Up @@ -72,18 +71,11 @@ def organization(self):
return self.context["organization"]

def validate(self, attrs):
if features.has("organizations:project-repository-fk-reads", self.organization):
query = RepositoryProjectPathConfig.objects.filter(
project_repository__project_id=attrs.get("project_id"),
stack_root=attrs.get("stack_root"),
source_root=attrs.get("source_root"),
)
else:
query = RepositoryProjectPathConfig.objects.filter(
project_id=attrs.get("project_id"),
stack_root=attrs.get("stack_root"),
source_root=attrs.get("source_root"),
)
query = RepositoryProjectPathConfig.objects.filter(
project_repository__project_id=attrs.get("project_id"),
stack_root=attrs.get("stack_root"),
source_root=attrs.get("source_root"),
)
if self.instance:
query = query.exclude(id=self.instance.id)
if query.exists():
Expand Down Expand Up @@ -149,8 +141,12 @@ def update(self, instance, validated_data):
validated_data.pop("id")
if self.instance:
with transaction.atomic(using=router.db_for_write(RepositoryProjectPathConfig)):
project_id = validated_data.get("project_id", self.instance.project_id)
repository_id = validated_data.get("repository_id", self.instance.repository_id)
Comment thread
cursor[bot] marked this conversation as resolved.
project_id = validated_data.get(
"project_id", self.instance.project_repository.project_id
)
repository_id = validated_data.get(
"repository_id", self.instance.project_repository.repository_id
)
project_repo, _ = ProjectRepository.objects.get_or_create(
project_id=project_id,
repository_id=repository_id,
Expand Down Expand Up @@ -211,19 +207,12 @@ def get(self, request: Request, organization: Organization) -> Response:
projects = self.get_projects(
request, organization, include_all_accessible=not has_explicit_projects
)
if features.has("organizations:project-repository-fk-reads", organization):
queryset = RepositoryProjectPathConfig.objects.filter(
project_repository__project__in=projects
).select_related(
"project",
"repository",
"project_repository__project",
"project_repository__repository",
)
else:
queryset = RepositoryProjectPathConfig.objects.filter(
project__in=projects
).select_related("project", "repository")
queryset = RepositoryProjectPathConfig.objects.filter(
project_repository__project__in=projects
).select_related(
"project_repository__project",
"project_repository__repository",
)

if integration_id:
# get_organization_integration will raise a 404 if no org_integration is found
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ def post(self, request: Request, organization: Organization) -> Response:
)

defaults = {
"project": project,
"repository": repo,
"organization_integration_id": org_integration.id,
"organization_id": organization.id,
Expand All @@ -281,7 +282,7 @@ def post(self, request: Request, organization: Organization) -> Response:
with transaction.atomic(using=router.db_for_write(RepositoryProjectPathConfig)):
try:
config = RepositoryProjectPathConfig.objects.select_for_update().get(
project=project,
project_repository__project=project,
stack_root=mapping["stack_root"],
source_root=mapping["source_root"],
)
Comment thread
sentry[bot] marked this conversation as resolved.
Expand All @@ -290,7 +291,6 @@ def post(self, request: Request, organization: Organization) -> Response:
created = False
except RepositoryProjectPathConfig.DoesNotExist:
config = RepositoryProjectPathConfig(
project=project,
stack_root=mapping["stack_root"],
source_root=mapping["source_root"],
**defaults,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from django.db.models import prefetch_related_objects

from sentry import features
from sentry.api.serializers import Serializer, register
from sentry.integrations.api.serializers.models.integration import serialize_provider
from sentry.integrations.models.repository_project_path_config import RepositoryProjectPathConfig
Expand All @@ -13,16 +12,11 @@ def get_attrs(self, item_list, user, **kwargs):
if not item_list:
return {}

organization = item_list[0].project.organization
use_fk = features.has("organizations:project-repository-fk-reads", organization)
if use_fk:
prefetch_related_objects(
item_list, "project_repository__project", "project_repository__repository"
)
else:
prefetch_related_objects(item_list, "project", "repository")
prefetch_related_objects(
item_list, "project_repository__project", "project_repository__repository"
)

return {item: {"use_project_repository_fk": use_fk} for item in item_list}
return {item: {} for item in item_list}

def serialize(self, obj, attrs, user, **kwargs):
integration = None
Expand All @@ -35,12 +29,8 @@ def serialize(self, obj, attrs, user, **kwargs):
serialized_provider = serialize_provider(provider) if provider else None
integration_id = str(integration.id) if integration else None

if attrs.get("use_project_repository_fk"):
project = obj.project_repository.project
repository = obj.project_repository.repository
else:
project = obj.project
repository = obj.repository
project = obj.project_repository.project
repository = obj.project_repository.repository

return {
"id": str(obj.id),
Expand Down
9 changes: 2 additions & 7 deletions src/sentry/integrations/utils/commit_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from django.utils.datastructures import OrderedSet

from sentry import analytics, features, options
from sentry import analytics, options
from sentry.analytics.events.integration_commit_context_all_frames import (
IntegrationsFailedToFetchCommitContextAllFrames,
IntegrationsSuccessfullyFetchedCommitContextAllFrames,
Expand Down Expand Up @@ -199,7 +199,6 @@ def _generate_integration_to_files_mapping(
this function is used to separate files into each integration so that
we can later call get_commit_context_all_frames on each integration.
"""
use_fk = features.has("organizations:project-repository-fk-reads", organization)
integration_to_files_mapping: dict[int, list[SourceLineInfo]] = {}
num_successfully_mapped_frames = 0

Expand Down Expand Up @@ -258,11 +257,7 @@ def _generate_integration_to_files_mapping(
lineno=frame.lineno,
path=src_path,
ref=code_mapping.default_branch or "master",
repo=(
code_mapping.project_repository.repository
if use_fk
else code_mapping.repository
),
repo=code_mapping.project_repository.repository,
code_mapping=code_mapping,
)
)
Expand Down
Loading
Loading