# HG changeset patch # User Teemu Piippo # Date 1421048696 18000 # Node ID 9e483447654be50deb96c09c2897e7a97117d796 # Parent 2bb5c4578ee1c97bcaf1055a13fa17e8df4e9640 - moved mod_hgpoll to mod_hg diff -r 2bb5c4578ee1 -r 9e483447654b mod_hg.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_hg.py Mon Jan 12 02:44:56 2015 -0500 @@ -0,0 +1,190 @@ +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': '', + 'level': 'normal', + }, + { + 'name': 'hg', + 'description': 'Executes a hg command', + 'args': ' ', + 'level': 'admin', + }, + { + 'name': 'resolves', + 'description': 'Manually cause a ticket to be resolved by a changeset', + 'args': ' ', + '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 = '' + + 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)) diff -r 2bb5c4578ee1 -r 9e483447654b mod_hgpoll.py --- a/mod_hgpoll.py Mon Jan 12 02:44:25 2015 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -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': '', - 'level': 'normal', - }, - { - 'name': 'hg', - 'description': 'Executes a hg command', - 'args': ' ', - 'level': 'admin', - }, - { - 'name': 'resolves', - 'description': 'Manually cause a ticket to be resolved by a changeset', - 'args': ' ', - '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 = '' - - 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))