def set_refs(self, refs, user, fetch=False): from sentry.api.exceptions import InvalidRepository from sentry.models import Commit, ReleaseHeadCommit, Repository from sentry.tasks.commits import fetch_commits # TODO: this does the wrong thing unless you are on the most # recent release. Add a timestamp compare? prev_release = type(self).objects.filter( organization_id=self.organization_id, projects__in=self.projects.all(), ).extra(select={ 'sort': 'COALESCE(date_released, date_added)', }).exclude(version=self.version).order_by('-sort').first() names = {r['repository'] for r in refs} repos = list( Repository.objects.filter( organization_id=self.organization_id, name__in=names, ) ) repos_by_name = {r.name: r for r in repos} invalid_repos = names - set(repos_by_name.keys()) if invalid_repos: raise InvalidRepository('Invalid repository names: %s' % ','.join(invalid_repos)) self.handle_commit_ranges(refs) for ref in refs: repo = repos_by_name[ref['repository']] commit = Commit.objects.get_or_create( organization_id=self.organization_id, repository_id=repo.id, key=ref['commit'], )[0] # update head commit for repo/release if exists ReleaseHeadCommit.objects.create_or_update( organization_id=self.organization_id, repository_id=repo.id, release=self, values={ 'commit': commit, } ) if fetch: fetch_commits.apply_async( kwargs={ 'release_id': self.id, 'user_id': user.id, 'refs': refs, 'prev_release_id': prev_release and prev_release.id, } )
def set_refs(self, refs, user, fetch=False): with sentry_sdk.start_span(op="set_refs"): from sentry.api.exceptions import InvalidRepository from sentry.models import Commit, ReleaseHeadCommit, Repository from sentry.tasks.commits import fetch_commits # TODO: this does the wrong thing unless you are on the most # recent release. Add a timestamp compare? prev_release = ( type(self) .objects.filter( organization_id=self.organization_id, projects__in=self.projects.all() ) .extra(select={"sort": "COALESCE(date_released, date_added)"}) .exclude(version=self.version) .order_by("-sort") .first() ) names = {r["repository"] for r in refs} repos = list( Repository.objects.filter(organization_id=self.organization_id, name__in=names) ) repos_by_name = {r.name: r for r in repos} invalid_repos = names - set(repos_by_name.keys()) if invalid_repos: raise InvalidRepository("Invalid repository names: %s" % ",".join(invalid_repos)) self.handle_commit_ranges(refs) for ref in refs: repo = repos_by_name[ref["repository"]] commit = Commit.objects.get_or_create( organization_id=self.organization_id, repository_id=repo.id, key=ref["commit"] )[0] # update head commit for repo/release if exists ReleaseHeadCommit.objects.create_or_update( organization_id=self.organization_id, repository_id=repo.id, release=self, values={"commit": commit}, ) if fetch: fetch_commits.apply_async( kwargs={ "release_id": self.id, "user_id": user.id, "refs": refs, "prev_release_id": prev_release and prev_release.id, } )
def set_refs(self, refs, user, fetch=False): from sentry.models import Commit, ReleaseHeadCommit, Repository from sentry.tasks.commits import fetch_commits # TODO: this does the wrong thing unless you are on the most # recent release. Add a timestamp compare? prev_release = type(self).objects.filter( organization_id=self.organization_id, projects__in=self.projects.all(), ).exclude(version=self.version).order_by('-date_added').first() for ref in refs: try: repo = Repository.objects.get( organization_id=self.organization_id, name=ref['repository'], ) except Repository.DoesNotExist: continue commit = Commit.objects.get_or_create( organization_id=self.organization_id, repository_id=repo.id, key=ref['commit'], )[0] # update head commit for repo/release if exists ReleaseHeadCommit.objects.create_or_update( organization_id=self.organization_id, repository_id=repo.id, release=self, values={ 'commit': commit, } ) if fetch: fetch_commits.apply_async( kwargs={ 'release_id': self.id, 'user_id': user.id, 'refs': refs, 'prev_release_id': prev_release and prev_release.id, } )