bugbot/rules/missed_landing_comment.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 libmozdata.hgmozilla import Mercurial
from bugbot import utils
from bugbot.bzcleaner import BzCleaner
def get_csets_from_pushlog(log):
csets = []
for push in log["pushes"].values():
for cset in push["changesets"]:
if any(cset["node"][:12] in c["desc"] for c in push["changesets"]):
# if a changeset is mentioned in another in the same central
# push, assume it's a backout, and ignore it
continue
bugs = utils.get_bugs_from_desc(cset["desc"])
if not bugs:
continue
csets.append((cset["node"], bugs[0]))
return csets
class MissedLandingComment(BzCleaner):
def __init__(self):
super().__init__()
self.bugs = []
self.repourl = Mercurial.get_repo_url("nightly")
def description(self):
return "Changesets in mozilla-central without a bugzilla comment"
def get_bz_params(self, date):
start, end = self.get_dates(date)
log = utils.get_pushlog(start, end)
# get a list of (changeset, bugid) from the mozilla-central pushlog
csets = get_csets_from_pushlog(log)
self.bugs = {}
for cset, bug in csets:
self.bugs.setdefault(str(bug), []).append(cset)
params = {
"include_fields": ["id", "comments"],
"bug_id_type": "anyexact",
"bug_id": ",".join(self.bugs),
}
return params
def filter_no_nag_keyword(self):
return False
def handle_bug(self, bug, data):
bugid = str(bug["id"])
assert bugid in self.bugs
for cset in self.bugs[bugid]:
short = cset[:12]
cseturl = "%s/rev/%s" % (self.repourl, short)
if any(cseturl in comment["text"] for comment in bug["comments"]):
continue
if bugid not in data:
data[bugid] = {"id": bugid, "missing_csets": []}
data[bugid]["missing_csets"].append((cset, cseturl))
def columns(self):
return ["id", "missing_csets"]
if __name__ == "__main__":
MissedLandingComment().run()