X-Git-Url: https://snippets.scripts.mit.edu/gitweb.cgi/Scripts/git/.git/blobdiff_plain/da9785cf7270af56d3f66410e7f895ea353f220a..a7c202e35cf46295abd47908631b8e3669a096e2:/TracZephyrPlugin/ZephyrPlugin.py diff --git a/TracZephyrPlugin/ZephyrPlugin.py b/TracZephyrPlugin/ZephyrPlugin.py index ad91865..673c339 100644 --- a/TracZephyrPlugin/ZephyrPlugin.py +++ b/TracZephyrPlugin/ZephyrPlugin.py @@ -1,7 +1,13 @@ +# -*- coding: utf-8 -*- + from trac.core import * from trac.ticket import ITicketChangeListener import subprocess +import re import textwrap +import shlex + +quoted_re = re.compile('^(?:> ?\n)*> .+\n(?:>(?: .*)?\n)*', re.MULTILINE) class ZephyrPlugin(Component): implements(ITicketChangeListener) @@ -10,32 +16,61 @@ class ZephyrPlugin(Component): zclass = self.config.get('ZephyrPlugin', 'class') if zclass == '': return - command = self.config.get('ZephyrPlugin', 'command') + command = shlex.split(self.config.get('ZephyrPlugin', 'command').encode('utf-8')) if not command: - command = 'zwrite' - p = subprocess.Popen([command, '-q', '-l', '-d', - '-c', zclass, + command = ['zwrite', '-q', '-l', '-d'] + opcode = self.config.get('ZephyrPlugin', 'opcode') + if opcode: + command += ['-O', opcode] + signature = self.config.get('ZephyrPlugin', 'signature') + if signature: + command += ['-s', signature] + p = subprocess.Popen(command + + ['-c', zclass, '-i', 'trac-#%s' % id], stdin=subprocess.PIPE) - p.stdin.write(message.encode('utf-8', 'replace')) + p.stdin.write(message.replace('@', '@@').encode('utf-8', 'replace')) p.stdin.close() p.wait() + + def format_text(self, text): + text = re.sub(quoted_re, u'> […]\n', text) + lines = textwrap.fill(text).split('\n') + if len(lines) > 5: + lines = lines[:5] + [u'[…]'] + return '\n'.join(lines) def ticket_created(self, ticket): - message = "%s filed a new ticket:\n%s\n\n%s" % (ticket['reporter'], - ticket['summary'], - textwrap.fill(ticket['description'][:255])) + ttype='ticket' + if ticket['type'] != 'defect': + ttype=ticket['type'] + message = "%s filed a new %s %s:\n%s\n\n%s" % (ticket['reporter'], + ticket['priority'], + ttype, + ticket['summary'], + self.format_text(ticket['description'])) self.zwrite(ticket.id, message) def ticket_changed(self, ticket, comment, author, old_values): - if old_values.has_key('status'): - if ticket['status'] == 'closed': - message = "%s closed ticket as %s\n(%s)" % (author, ticket['resolution'], ticket['summary']) + message = "(%s)\n" % ticket['summary'] + for field in ticket.fields: + name = field['name'] + if name not in old_values: + pass + elif field['type'] == 'textarea': + message += "%s changed %s to:\n%s\n" % (author, name, self.format_text(ticket[name])) + elif ticket[name] and old_values[name]: + message += "%s changed %s from %s to %s.\n" % (author, name, old_values[name], ticket[name]) + elif ticket[name]: + message += "%s set %s to %s.\n" % (author, name, ticket[name]) + elif old_values[name]: + message += "%s deleted %s.\n" % (author, name) else: - message = "%s set status to %s\n(%s)" % (author, ticket['status'], ticket['summary']) - else: - message = "%s updated this ticket\n(%s)" % (author, ticket['summary']) + message += "%s changed %s.\n" % (author, name) + if comment: + message += "%s commented:\n%s\n" % (author, self.format_text(comment)) self.zwrite(ticket.id, message) def ticket_deleted(self, ticket): - pass + message = "%s deleted ticket %d" % (author, ticket.id) + self.zwrite(ticket.id, message)