X-Git-Url: https://snippets.scripts.mit.edu/gitweb.cgi/Scripts/git/.git/blobdiff_plain/76e24b1fb7f30bb975b730bb2fafca8f16a0ee02..a7c202e35cf46295abd47908631b8e3669a096e2:/TracZephyrPlugin/ZephyrPlugin.py diff --git a/TracZephyrPlugin/ZephyrPlugin.py b/TracZephyrPlugin/ZephyrPlugin.py index 688749a..673c339 100644 --- a/TracZephyrPlugin/ZephyrPlugin.py +++ b/TracZephyrPlugin/ZephyrPlugin.py @@ -1,32 +1,76 @@ +# -*- coding: utf-8 -*- + from trac.core import * from trac.ticket import ITicketChangeListener -import os +import subprocess +import re import textwrap +import shlex + +quoted_re = re.compile('^(?:> ?\n)*> .+\n(?:>(?: .*)?\n)*', re.MULTILINE) class ZephyrPlugin(Component): - implements(ITicketChangeListener) - - def zwrite(self, id, message): - zclass = self.config.get('ZephyrPlugin', 'class') - if zclass == '': - return - pipe = os.popen('zwrite -q -l -d -c %s -i trac-#%s' % (zclass, id), 'w') - pipe.write("\n".join(textwrap.wrap(message)).encode('utf-8', 'replace')) - pipe.close() - - def ticket_created(self, ticket): - message = "%s filed a new ticket:\n%s\n\n%s" % (ticket['reporter'], ticket['summary'], ticket['description'][:255]) - 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']) - 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']) - self.zwrite(ticket.id, message) - - def ticket_deleted(self, ticket): - pass + implements(ITicketChangeListener) + + def zwrite(self, id, message): + zclass = self.config.get('ZephyrPlugin', 'class') + if zclass == '': + return + command = shlex.split(self.config.get('ZephyrPlugin', 'command').encode('utf-8')) + if not command: + 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.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): + 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): + 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 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): + message = "%s deleted ticket %d" % (author, ticket.id) + self.zwrite(ticket.id, message)