in bugbot/rules/no_assignee.py [0:0]
def find_assignee(self, bz_patchers, hg_patchers, bz_commenters, bz_info):
"""Find a potential assignee.
If an email is common between patchers (people who made patches on bugzilla)
and hg patchers then return this email.
If "Foo Bar [:foobar]" made a patch and his hg name is "Bar Foo" return the
corresponding Bugzilla email.
"""
if not bz_patchers:
# we've no patch in the bug
# so try to find an assignee in the commenters
bz_patchers = set(bz_commenters.keys())
potential = set()
hg_patchers_mail = set(mail for _, mail in hg_patchers)
common = bz_patchers & hg_patchers_mail
if len(common) == 1:
# there is a common email between Bz patchers & Hg email
return list(common)[0]
# here we try to find at least 2 common elements
# in the creator real name and in the hg author name
hg_patchers_name = [self.clean_name(name) for name, _ in hg_patchers]
for bz_patcher in bz_patchers:
if bz_patcher not in bz_info:
continue
real_name = self.clean_name(bz_info[bz_patcher])
for name in hg_patchers_name:
if len(name & real_name) >= 2:
potential.add(bz_patcher)
# try to find similarities between email and name
for name in hg_patchers_name:
possible_mail_parts = self.mk_possible_mails(name)
for bz_patcher in bz_patchers:
_bz_patcher = self.clean_mail(bz_patcher)
for part in possible_mail_parts:
if len(part) >= 5 and part in _bz_patcher:
potential.add(bz_patcher)
# try to find similarities between email in using Jaro-Winkler metric
for b in bz_patchers:
_b = self.clean_mail(b)
for h in hg_patchers_mail:
_h = self.clean_mail(h)
d = 1 - jaro_winkler(_b, _h)
if d <= 0.2:
potential.add(b)
if potential:
potential = list(potential)
if len(potential) == 1:
return potential[0]
return max(
((p, bz_commenters.get(p, 0)) for p in potential), key=lambda x: x[1]
)[0]
return None