Wed, 31 Dec 2014 11:40:46 -0500
- added page system to prevent commands from printing too much output
from hgapi import hgapi, Repo from datetime import datetime import hgpoll as HgPoll import re import bt as Bt from configfile import Config from modulecore import command_error ModuleData = { 'commands': [ { 'name': 'checkhg', 'description': 'Polls the zandronum repositories for updates', 'args': None, 'level': 'admin', }, { 'name': 'cset', 'description': 'Yields changeset information (use a hash or date as key)', 'args': '<key>', 'level': 'normal', }, { 'name': 'hg', 'description': 'Executes a hg command', 'args': '<repo> <command...>', 'level': 'admin', }, { 'name': 'resolves', 'description': 'Manually cause a ticket to be resolved by a changeset', 'args': '<ticket> <changeset>', 'level': 'admin', }, ] } def plural (a): return '' if a == 1 else 's' def cmd_checkhg (bot, **rest): HgPoll.force_poll() def cmd_cset (bot, args, reply, **rest): repo = Repo ('zandronum-everything') data = "" node = args['key'] # Possibly we're passed a date version instead. Try find the node for this. try: datetime.strptime (args['key'], '%y%m%d-%H%M') HgPoll.make_commits_txt() commits_txt = open ('commits.txt', 'r') for line in commits_txt: data = line.replace ('\n', '').split (' ') if data[1] == args['key']: node = data[0] break else: command_error ('couldn\'t find changeset for date %s' % args['key']) return except ValueError: pass # zandronum-everything contains all zandronum changesets, so look for changesets in that. try: data = repo.hg_command ("log", "-l1", "-r", node, "--template", "{node|short}@@@@@@@" + "{desc}@@@@@@@" + "{author}@@@@@@@" + "{diffstat}@@@@@@@" + "{date|hgdate}@@@@@@@" + "{bookmarks}@@@@@@@" + "{latesttagdistance}@@@@@@@" + "{latesttag}") except hgapi.HgException: command_error ('couldn\'t find changeset %s' % (node)) return try: data = data.split ('@@@@@@@') node = data[0] message = data[1] author = data[2] diffstat = data[3] date = datetime.utcfromtimestamp (int (data[4].split (' ')[0])) bookmarks = data[5] latesttagdistance = int (data[6]) latesttag = data[7] delta = datetime.utcnow() - date datestring = '' if bookmarks: bookmarks = HgPoll.prettify_bookmarks (bookmarks) # Find out the Zandronum version of this changeset repo.hg_command ('revert', '-r', node, 'src/version.h') zanversion = '<unknown zandronum version>' with open ('zandronum-everything/src/version.h') as version_file: regexps = [ \ re.compile (r'#define\s+GAMEVER_STRING\s+"([^"]+)"'), \ re.compile (r'#define\s+DOTVERSIONSTR_NOREV\s+"([^"]+)"'), \ re.compile (r'#define\s+DOTVERSIONSTR\s+"([^"]+)"')] for line in version_file: for rex in regexps: match = rex.match (line) if match != None: zanversion = match.group (1) break if match != None: break repo.hg_command ('revert', '--all') # Remove the email address from the author if possible match = re.compile (r'^(.+) <([^>]+)>$.*').match (author) if match: author = match.group (1) email = match.group (2) username = Config.find_developer_by_email (email) if username != '': author = username # Try prettify the diffstat rex = re.compile (r'^([0-9]+): \+([0-9]+)/-([0-9]+)$') match = rex.match (diffstat) if match: diffstat = "%s\003:\0033 +%s\003/\0034-%s\003" % (match.group (1), match.group (2), match.group (3)) if delta.days < 4: if delta.days == 0: if delta.seconds < 60: datestring = 'just now' elif delta.seconds < 3600: minutes = delta.seconds / 60 datestring = '%d minute%s ago' % (minutes, plural (minutes)) else: hours = delta.seconds / 3600 datestring = '%d hour%s ago' % (hours, plural (hours)) else: datestring = '%d day%s ago' % (delta.days, plural (delta.days)) else: datestring = 'on %s' % (str (date)) versionstring = "" if latesttagdistance != 0: versionstring = '%s %s, %d hops from %s' % (zanversion, date.strftime ('%y%m%d-%H%M'), latesttagdistance, latesttag) else: versionstring = latesttag reply ('changeset\0035 %s%s\003 (%s)\003: committed by\0032 %s\003 %s,\0032 %s' % \ (node, bookmarks, versionstring, author, datestring, diffstat)) for line in message.split ('\n'): reply (' ' + line) except hgapi.HgException as e: result = HgPoll.decipher_hgapi_error (e) if result[0]: command_error (result[1]) else: command_error (`e`) def cmd_hg (bot, args, **rest): try: repo = hgapi.Repo (args['repo']) result = repo.hg_command (*args['command']) reply (replyto, result) except hgapi.hgapi.HgException as e: result = HgPoll.decipher_hgapi_error (e) if result[0]: command_error (result[1]) else: command_error (`e`) def cmd_resolves (bot, args, replyto, **rest): try: HgPoll.announce_ticket_resolved (args['ticket'], args['changeset']) except Exception as e: command_error (str (e))