Browse Source

Merge pull request #5472 from getsentry/bugfix/create-releases-in-js

Create releases if missing in JS code path.
Armin Ronacher 7 years ago
parent
commit
a198e5bca3
2 changed files with 31 additions and 9 deletions
  1. 5 8
      src/sentry/lang/javascript/processor.py
  2. 26 1
      src/sentry/stacktraces.py

+ 5 - 8
src/sentry/lang/javascript/processor.py

@@ -23,7 +23,7 @@ except ImportError:
 
 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 @@ class JavaScriptStacktraceProcessor(StacktraceProcessor):
                          '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
 

+ 26 - 1
src/sentry/stacktraces.py

@@ -2,10 +2,11 @@ from __future__ import absolute_import
 
 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 @@ class StacktraceProcessor(object):
     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