crashclouseau/buginfo.py (51 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
from datetime import datetime
from dateutil.relativedelta import relativedelta
from libmozdata import socorro
from libmozdata.bugzilla import Bugzilla
import pytz
from . import utils
from .logger import logger
BZ_FIELDS = ["id", "summary", "status", "dupe_of", "cf_crash_signature"]
def get_bz_search(signature, start_date):
params = {
"include_fields": BZ_FIELDS,
"f1": "cf_crash_signature",
"o1": "substring",
"v1": signature,
"f2": "creation_ts",
"o2": "greaterthan",
"v2": start_date,
}
return params
def get_bugs(signature, wait=True):
# return a dict: bugid => buginfo
# if buginfo is None => security bug
if not signature:
return {}
logger.info("Get bugs for signature {}: started.".format(signature))
def bug_handler(bug, data):
if "cf_crash_signature" in bug:
if signature in utils.get_signatures([bug["cf_crash_signature"]]):
data[bug["id"]] = bug
del bug["cf_crash_signature"]
start_date = pytz.utc.localize(datetime.utcnow())
start_date -= relativedelta(hours=2)
data = {}
bz = Bugzilla(
get_bz_search(signature, start_date), bughandler=bug_handler, bugdata=data
).get_data()
bugs = socorro.Bugs.get_bugs([signature])[signature]
bz.wait()
bz_bugs = set(data.keys())
old_bugs = []
for bug in bugs:
if bug not in bz_bugs:
old_bugs.append(bug)
# the bug is in Socorro and not in search query
data[bug] = None
bz = Bugzilla(
bugids=old_bugs, include_fields=BZ_FIELDS, bughandler=bug_handler, bugdata=data
)
if wait:
bz.wait()
logger.info("Get bugs: finished.")
return data
logger.info("Get bugs: finished.")
return bz, data