--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_hgpoll.py Sun Nov 09 19:59:10 2014 +0200 @@ -0,0 +1,131 @@ +from hgapi import hgapi, Repo +import hgpoll as HgPoll + +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', + } + ] +} + +def cmd_checkhg (bot, **rest): + HgPoll.force_poll() + +def cmd_cset (bot, args, **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') + 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: + bot.privmsg (replyto, 'couldn\'t find changset for date %s' % args['key']) + return + #done + except ValueError: + pass + #tried + + # The sandboxes contain all revisions in zandronum and zandronum-stable. + # Thus we only need to try find the revision in the sandbox repos. + try: + repo.hg_command ("log", "-r", node, "--template", " ") + except hgapi.HgException: + bot.privmsg (replyto, 'couldn\'t find changeset %s' % (node)) + return + #tried + + try: + data = repo.hg_command ("log", "-r", node, "--template", + "{node|short}@@@@@@@{desc}@@@@@@@{author}@@@@@@@{diffstat}@@@@@@@{date|hgdate}") + data = data.split ('@@@@@@@') + + node = data[0] + message = data[1] + author = data[2] + diffstat = data[3] + date = datetime.utcfromtimestamp (int (data[4].split (' ')[0])) + delta = datetime.now() - date + datestring = '' + + # 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 = find_developer_by_email (email) + + if username != '': + author = username + + 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)) + #fi + + bot.privmsg (replyto, 'changeset %s (%s): committed by %s %s (%s)' % \ + (node, date.strftime ('%y%m%d-%H%M'), author, datestring, diffstat)) + + for line in message.split ('\n'): + bot.privmsg (replyto, ' ' + line) + except hgapi.HgException as e: + result = HgPoll.decipher_hgapi_error (e) + + if result[0]: + bot.privmsg (replyto, 'error: %s' % result[1]) + else: + bot.privmsg (replyto, 'error: %s' % `e`) + #tried + +def cmd_hg (bot, args, **rest): + try: + repo = hgapi.Repo (args['repo']) + result = repo.hg_command (*args['command']) + self.privmsg (replyto, result) + except hgapi.hgapi.HgException as e: + result = HgPoll.decipher_hgapi_error (e) + + if result[0]: + self.privmsg (replyto, 'error: %s' % result[1]) + else: + self.privmsg (replyto, 'error: %s' % `e`) + #fi + #tried \ No newline at end of file