Bugtracker: Add support for commits.

This commit is contained in:
Krytarik Raido
2020-06-21 09:04:04 +02:00
parent 7473bf6fa7
commit e0926a9a3c
4 changed files with 178 additions and 90 deletions

View File

@ -71,7 +71,7 @@ class Bugtracker(callbacks.PluginRegexp):
"""Show a link to a bug report with a brief description"""
threaded = True
callBefore = ('URL')
regexps = ('turlSnarfer', 'bugSnarfer', 'cveSnarfer', 'oopsSnarfer')
regexps = ('bugSnarfer', 'bugUrlSnarfer', 'commitSnarfer', 'commitUrlSnarfer', 'cveSnarfer', 'oopsSnarfer')
def __init__(self, irc):
self.__parent = super(Bugtracker, self)
@ -97,14 +97,14 @@ class Bugtracker(callbacks.PluginRegexp):
supylog.warning("Bugtracker: Unknown trackertype '%s' (%s)" % (trackers[name].trackertype(), name))
self.shorthand = utils.abbrev(list(self.db.keys()))
def is_ok(self, channel, tracker, bug):
def is_ok(self, channel, tracker, bugid):
"""Flood/repeat protection"""
now = time.time()
for k in list(self.shown.keys()):
if self.shown[k] < now - self.registryValue('repeatdelay', channel):
self.shown.pop(k)
if (channel, tracker, bug) not in self.shown:
self.shown[(channel, tracker, bug)] = now
if (channel, tracker, bugid) not in self.shown:
self.shown[(channel, tracker, bugid)] = now
return True
return False
@ -308,26 +308,39 @@ class Bugtracker(callbacks.PluginRegexp):
def bugSnarfer(self, irc, msg, match):
r"(?P<bt>[a-z][^\s:]*(\s+(bug|ticket|issue|pull|pr|merge|mr)('?s)?)?):*\s+#?(?P<bug>\d+(?!\d*[-.]\d+)(\s*([,\s]+|[,\s]*(and|und|en|et|ir|[&+]+))\s*#?\d+(?!\d*[-.]\d+))*)"
self.termSnarfer(irc, msg, match, 'bug')
def commitSnarfer(self, irc, msg, match):
r"(?P<bt>[a-z][^\s:]*(\s+(commit)('?s)?)?):*\s+#?(?P<bug>[a-f0-9]{7,}(?![a-f0-9]*[-.][a-f0-9]{7,})(\s*([,\s]+|[,\s]*(and|und|en|et|ir|[&+]+))\s*#?[a-f0-9]{7,}(?![a-f0-9]*[-.][a-f0-9]{7,}))*)"
self.termSnarfer(irc, msg, match, 'commit')
def termSnarfer(self, irc, msg, match, termtype):
channel = msg.args[0] if ircutils.isChannel(msg.args[0]) else None
if checkAddressed(msg.args[1].strip(), channel):
return
if not self.registryValue('bugSnarfer', channel):
if not self.registryValue('{}Snarfer'.format(termtype), channel):
return
nbugs = msg.tagged('nbugs') or 0
if nbugs >= 5:
return
bugids = re.split(r'[^\d]+', match.group('bug'))[:5-nbugs]
if termtype != 'commit':
bugids = re.findall(r'[0-9]+', match.group('bug'))[:5-nbugs]
else:
bugids = re.findall(r'[a-f0-9]{7,}', match.group('bug'))[:5-nbugs]
# Begin HACK
# Strings like "Ubuntu 1004" and "Ubuntu 1610" are false triggers for us
if match.group('bt').lower() == 'ubuntu':
if match.group('bt').lower() == 'ubuntu' and termtype == 'bug':
bugids = [x for x in bugids if not re.match(r'^([4-9]|[12][0-9])(04|10)$', x)]
# End HACK
# Get tracker name
bt = [x.lower() for x in match.group('bt').split()]
sure_bug = re.match(r"^(?P<type>bug|ticket|issue|pull|pr|merge|mr)('?s)?$", bt[-1])
if termtype != 'commit':
sure_bug = re.match(r"^(?P<type>bug|ticket|issue|pull|pr|merge|mr)('?s)?$", bt[-1])
else:
sure_bug = re.match(r"^(?P<type>commit)('?s)?$", bt[-1])
# Get bug type
if sure_bug:
@ -337,7 +350,7 @@ class Bugtracker(callbacks.PluginRegexp):
bugids = list(set(bugids)) # remove dupes
if not sure_bug:
if not sure_bug and termtype == 'bug':
bugids = [x for x in bugids if int(x) > 100]
msg.tag('nbugs', nbugs + len(bugids))
@ -376,13 +389,12 @@ class Bugtracker(callbacks.PluginRegexp):
return
for bugid in bugids:
bugid = int(bugid)
try:
report = self.get_bug(channel or msg.nick, tracker, bugtype, bugid, self.registryValue('showassignee', channel),
self.registryValue('extended', channel), do_tracker=showTracker)
except trackers.BugNotFoundError:
if self.registryValue('replyWhenNotFound'):
irc.error("Could not find %s bug %d" % (tracker.description, bugid))
irc.error("Could not find %s %s %s" % (tracker.description, termtype, bugid))
except trackers.BugtrackerError as e:
if self.registryValue('replyWhenError') and sure_bug:
irc.error(str(e))
@ -390,19 +402,26 @@ class Bugtracker(callbacks.PluginRegexp):
if report:
irc.reply(report)
def turlSnarfer(self, irc, msg, match):
r"(https?://)?((bugs\.debian\.org|pad\.lv)/|\S+/(show_bug\.cgi\?id=|bugreport\.cgi\?bug=|view\.php\?id=|bug=|bugs/|\+bug/|ticket/|feature-requests/|patches/|todo/|issues/|pulls?/|merge_requests/))(?P<bug>\d+)/?"
def bugUrlSnarfer(self, irc, msg, match):
r"(https?://)?((bugs\.debian\.org|pad\.lv)/|\S+/(show_bug\.cgi\?id=|bugreport\.cgi\?bug=|view\.php\?id=|bug=|bugs/|\+bug/|ticket/|feature-requests/|patches/|todo/|issues/|pulls?/|merge_requests/))(?P<bug>\d+)"
self.urlSnarfer(irc, msg, match, 'bug')
def commitUrlSnarfer(self, irc, msg, match):
r"(https?://)?\S+/commits?/(?P<bug>[a-f0-9]{7,})"
self.urlSnarfer(irc, msg, match, 'commit')
def urlSnarfer(self, irc, msg, match, urltype):
channel = msg.args[0] if ircutils.isChannel(msg.args[0]) else None
if checkAddressed(msg.args[1].strip(), channel):
return
if not self.registryValue('bugSnarfer', channel):
if not self.registryValue('{}Snarfer'.format(urltype), channel):
return
nbugs = msg.tagged('nbugs') or 0
if nbugs >= 5:
return
msg.tag('nbugs', nbugs+1)
url = match.group(0)
bugid = int(match.group('bug'))
bugid = match.group('bug')
if '://' in url:
url = url[url.rfind('://')+3:]
try:
@ -413,7 +432,7 @@ class Bugtracker(callbacks.PluginRegexp):
self.registryValue('extended', channel), do_url=False)
except trackers.BugNotFoundError:
if self.registryValue('replyWhenNotFound'):
irc.error("Could not find %s bug %s" % (tracker.description, match.group('bug')))
irc.error("Could not find %s %s %s" % (tracker.description, urltype, match.group('bug')))
except trackers.BugtrackerError as e:
if self.registryValue('replyWhenError'):
irc.error(str(e))
@ -423,7 +442,7 @@ class Bugtracker(callbacks.PluginRegexp):
# Only useful to Launchpad developers
def oopsSnarfer(self, irc, msg, match):
r"(https?://\S+[=/])?OOPS-(?P<oopsid>[\dA-Za-z]{6,})"
r"(https?://\S+[=/])?OOPS-(?P<oopsid>[a-f0-9]{6,})"
channel = msg.args[0] if ircutils.isChannel(msg.args[0]) else None
if checkAddressed(msg.args[1].strip(), channel):
return
@ -482,11 +501,11 @@ class Bugtracker(callbacks.PluginRegexp):
tracker = trackers.SourceForge().get_tracker(snarfurl)
elif 'github.com' in snarfurl:
tracker = trackers.GitHub().get_tracker(snarfurl)
elif re.match(r'[^\s/]+/[^\s/]+(/[^\s/]+)+/-/(issues|merge_requests)', snarfurl) \
elif re.match(r'[^\s/]+/[^\s/]+(/[^\s/]+)+/-/(issues|merge_requests|commits?)', snarfurl) \
or re.match(r'[^\s/]+/[^\s/]+(/[^\s/]+)+/merge_requests', snarfurl) \
or re.match(r'[^\s/]+/[^\s/]+(/[^\s/]+){2,}/issues', snarfurl):
or re.match(r'[^\s/]+/[^\s/]+(/[^\s/]+){2,}/(issues|commits?)', snarfurl):
tracker = trackers.GitLab().get_tracker(snarfurl, bugid)
elif re.match(r'[^\s/]+/[^\s/]+/[^\s/]+/issues', snarfurl):
elif re.match(r'[^\s/]+/[^\s/]+/[^\s/]+/(issues|commits?)', snarfurl):
tracker = trackers.GitLab().get_tracker(snarfurl, bugid)
if not tracker:
tracker = trackers.Gitea().get_tracker(snarfurl, bugid)
@ -519,20 +538,20 @@ class Bugtracker(callbacks.PluginRegexp):
if duplicate and not self.is_ok(channel, tracker, bugid):
return
bugtype = re.match(r'.*/(feature-)?(?P<type>request|patch|todo|issue|pull|merge|ticket)(_requests)?(e?s)?/[0-9]+/?$', url)
bugtype = re.match(r'.*/(feature-)?(?P<type>request|patch|todo|issue|pull|merge|ticket|commit)(_requests)?(e?s)?/[a-f0-9]+$', url)
if do_tracker and tracker.trackertype not in ('github', 'gitlab', 'gitea'):
if re.match(r'.*/(bugs|feature-requests|patches|todo|issues|pulls?|merge_requests|ticket)/?$', tracker.description):
report = '%s %d' % (tracker.description, bugid)
if re.match(r'.*/(bugs|feature-requests|patches|todo|issues|pulls?|merge_requests|ticket|commits?)$', tracker.description):
report = '%s %s' % (tracker.description, bugid)
else:
if bugtype:
report = '%s %s %d' % (tracker.description, bugtype.group('type'), bugid)
report = '%s %s %s' % (tracker.description, bugtype.group('type'), bugid)
else:
report = '%s bug %d' % (tracker.description, bugid)
report = '%s bug %s' % (tracker.description, bugid)
else:
if bugtype:
report = '%s %d' % (bugtype.group('type').title(), bugid)
report = '%s %s' % (bugtype.group('type').title(), bugid)
else:
report = 'Bug %d' % bugid
report = 'Bug %s' % bugid
if product:
report += ' in %s' % product
@ -548,8 +567,10 @@ class Bugtracker(callbacks.PluginRegexp):
severity_status = []
if severity:
severity_status.append(' '.join(word[0].upper() + word[1:].lower() for word in severity.split()))
severity_status.append(' '.join(word[0].upper() + word[1:].lower() for word in status.split()))
report += ' [%s]' % ', '.join(severity_status)
if status:
severity_status.append(' '.join(word[0].upper() + word[1:].lower() for word in status.split()))
if severity_status:
report += ' [%s]' % ', '.join(severity_status)
if duplicate:
report += ' [duplicate: %s]' % duplicate[0]