mod_hgpoll.py

Wed, 31 Dec 2014 15:49:11 -0500

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Wed, 31 Dec 2014 15:49:11 -0500
changeset 114
0d1fd111cb22
parent 113
08e9b1c1b324
permissions
-rw-r--r--

- .idgames now works with the page system

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))

mercurial