mod_hgpoll.py

changeset 72
2266d6d73de3
child 73
d67cc4fbc3f1
--- /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

mercurial