diff --git a/src/sentry/lang/javascript/processor.py b/src/sentry/lang/javascript/processor.py index 1570cc5dbfcbf2..1f381e704d441f 100644 --- a/src/sentry/lang/javascript/processor.py +++ b/src/sentry/lang/javascript/processor.py @@ -23,7 +23,7 @@ class ZeroReturnError(Exception): from sentry import http from sentry.interfaces.stacktrace import Stacktrace -from sentry.models import EventError, Release, ReleaseFile +from sentry.models import EventError, ReleaseFile from sentry.utils.cache import cache from sentry.utils.files import compress_file from sentry.utils.hashlib import md5_text @@ -491,13 +491,10 @@ def preprocess_step(self, processing_task): 'fetch remote source', self.data['event_id']) return False - if self.data.get('release'): - self.release = Release.get( - project=self.project, - version=self.data['release'], - ) - if self.data.get('dist'): - self.dist = self.release.get_dist(self.data['dist']) + self.release = self.get_release(create=True) + if self.data.get('dist') and self.release: + self.dist = self.release.get_dist(self.data['dist']) + self.populate_source_cache(frames) return True diff --git a/src/sentry/stacktraces.py b/src/sentry/stacktraces.py index 632708529d06c1..24f4c4abe43603 100644 --- a/src/sentry/stacktraces.py +++ b/src/sentry/stacktraces.py @@ -2,10 +2,11 @@ import logging import hashlib +from datetime import datetime from collections import namedtuple -from sentry.models import Project +from sentry.models import Project, Release from sentry.utils.safe import safe_execute from sentry.utils.cache import cache @@ -120,6 +121,30 @@ def __init__(self, data, stacktrace_infos, project=None): def close(self): pass + def get_release(self, create=False): + """Convenient helper to return the release for the current data + and optionally creates the release if it's missing. In case there + is no release info it will return `None`. + """ + release = self.data.get('release') + if not release: + return None + if not create: + return Release.get( + project=self.project, + version=self.data['release'] + ) + timestamp = self.data.get('timestamp') + if timestamp is not None: + date = datetime.fromtimestamp(timestamp) + else: + date = None + return Release.get_or_create( + project=self.project, + version=self.data['release'], + date_added=date, + ) + def handles_frame(self, frame, stacktrace_info): """Returns true if this processor can handle this frame. This is the earliest check and operates on a raw frame and stacktrace info. If