-
Notifications
You must be signed in to change notification settings - Fork 47
/
export_signatures.py
52 lines (42 loc) · 1.99 KB
/
export_signatures.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import json
from zipfile import ZipFile
from django.core.management.base import BaseCommand
from django.db.models.aggregates import Count, Min
from crashmanager.models import Bucket, CrashEntry
class Command(BaseCommand):
help = "Export signatures and their metadata."
def add_arguments(self, parser):
parser.add_argument(
"filename", help="output filename to write signatures zip to"
)
def handle(self, filename, **options):
with ZipFile(filename, "w") as zipFile:
for bucket in Bucket.objects.annotate(
size=Count("crashentry"), quality=Min("crashentry__testcase__quality")
):
bestEntryQuery = (
CrashEntry.objects.filter(bucket_id=bucket.pk)
.filter(testcase__quality=bucket.quality)
.defer("rawCrashData", "rawStderr", "rawStdout")
.order_by("testcase__size", "-id")
)
if bestEntryQuery.count():
bucket.bestEntry = bestEntryQuery[0]
else:
bucket.bestEntry = None
metadata = {}
metadata["size"] = bucket.size
metadata["shortDescription"] = bucket.shortDescription
metadata["frequent"] = bucket.frequent
if bucket.bug is not None:
metadata["bug__id"] = bucket.bug.externalId
if (
bucket.bestEntry is not None
and bucket.bestEntry.testcase is not None
):
metadata["testcase__quality"] = bucket.bestEntry.testcase.quality
metadata["testcase__size"] = bucket.bestEntry.testcase.size
sigFileName = "%d.signature" % bucket.pk
metaFileName = "%d.metadata" % bucket.pk
zipFile.writestr(sigFileName, bucket.signature)
zipFile.writestr(metaFileName, json.dumps(metadata, indent=4))