comparison hgext/bugzilla.py @ 16224:d52a6b542db1

bugzilla: add xmlrpcemail submission for Bugzilla 3.6 email interface Some of the formatting details required for bug submission via email changed between Bugzilla 3.4 and 3.6. Bugzilla 3.4 requires lines of the form '@fieldname = value', while 3.6 wants '@fieldname value'. Also the field @bug_id in 3.4 becomes @id in 3.6. Bugzilla up to and including 4.0 also recognises the 3.4 format. To save surprises in the future, check the Bugzilla version and use the 3.6 format from all major versions >= 4. At some point we will drop support for Bugzilla prior to 3.6 and support the new format only.
author Jim Hague <jim.hague@acm.org>
date Thu, 01 Mar 2012 14:50:31 +0000
parents ac4fd3238ead
children 7855c522a9cb
comparison
equal deleted inserted replaced
16223:ac4fd3238ead 16224:d52a6b542db1
610 self.fixstatus = self.ui.config('bugzilla', 'fixstatus', 'RESOLVED') 610 self.fixstatus = self.ui.config('bugzilla', 'fixstatus', 'RESOLVED')
611 self.fixresolution = self.ui.config('bugzilla', 'fixresolution', 611 self.fixresolution = self.ui.config('bugzilla', 'fixresolution',
612 'FIXED') 612 'FIXED')
613 613
614 self.bzproxy = xmlrpclib.ServerProxy(bzweb, self.transport(bzweb)) 614 self.bzproxy = xmlrpclib.ServerProxy(bzweb, self.transport(bzweb))
615 ver = self.bzproxy.Bugzilla.version()['version'].split('.')
616 self.bzvermajor = int(ver[0])
617 self.bzverminor = int(ver[1])
615 self.bzproxy.User.login(dict(login=user, password=passwd)) 618 self.bzproxy.User.login(dict(login=user, password=passwd))
616 619
617 def transport(self, uri): 620 def transport(self, uri):
618 if urlparse.urlparse(uri, "http")[0] == "https": 621 if urlparse.urlparse(uri, "http")[0] == "https":
619 return cookiesafetransport() 622 return cookiesafetransport()
671 There is no XMLRPC function to change bug status before Bugzilla 674 There is no XMLRPC function to change bug status before Bugzilla
672 4.0, so bugs cannot be marked fixed via XMLRPC before Bugzilla 4.0. 675 4.0, so bugs cannot be marked fixed via XMLRPC before Bugzilla 4.0.
673 But bugs can be marked fixed via email from 3.4 onwards. 676 But bugs can be marked fixed via email from 3.4 onwards.
674 """ 677 """
675 678
679 # The email interface changes subtly between 3.4 and 3.6. In 3.4,
680 # in-email fields are specified as '@<fieldname> = <value>'. In
681 # 3.6 this becomes '@<fieldname> <value>'. And fieldname @bug_id
682 # in 3.4 becomes @id in 3.6. 3.6 and 4.0 both maintain backwards
683 # compatibility, but rather than rely on this use the new format for
684 # 4.0 onwards.
685
676 def __init__(self, ui): 686 def __init__(self, ui):
677 bzxmlrpc.__init__(self, ui) 687 bzxmlrpc.__init__(self, ui)
678 688
679 self.bzemail = self.ui.config('bugzilla', 'bzemail') 689 self.bzemail = self.ui.config('bugzilla', 'bzemail')
680 if not self.bzemail: 690 if not self.bzemail:
681 raise util.Abort(_("configuration 'bzemail' missing")) 691 raise util.Abort(_("configuration 'bzemail' missing"))
682 mail.validateconfig(self.ui) 692 mail.validateconfig(self.ui)
693
694 def makecommandline(self, fieldname, value):
695 if self.bzvermajor >= 4:
696 return "@%s %s" % (fieldname, str(value))
697 else:
698 if fieldname == "id":
699 fieldname = "bug_id"
700 return "@%s = %s" % (fieldname, str(value))
683 701
684 def send_bug_modify_email(self, bugid, commands, comment, committer): 702 def send_bug_modify_email(self, bugid, commands, comment, committer):
685 '''send modification message to Bugzilla bug via email. 703 '''send modification message to Bugzilla bug via email.
686 704
687 The message format is documented in the Bugzilla email_in.pl 705 The message format is documented in the Bugzilla email_in.pl
699 matches = self.bzproxy.User.get(dict(match=[user])) 717 matches = self.bzproxy.User.get(dict(match=[user]))
700 if not matches['users']: 718 if not matches['users']:
701 raise util.Abort(_("default bugzilla user %s email not found") % 719 raise util.Abort(_("default bugzilla user %s email not found") %
702 user) 720 user)
703 user = matches['users'][0]['email'] 721 user = matches['users'][0]['email']
704 722 commands.append(self.makecommandline("id", bugid))
705 text = "\n".join(commands) + "\n@bug_id = %d\n\n" % bugid + comment 723
724 text = "\n".join(commands) + "\n\n" + comment
706 725
707 _charsets = mail._charsets(self.ui) 726 _charsets = mail._charsets(self.ui)
708 user = mail.addressencode(self.ui, user, _charsets) 727 user = mail.addressencode(self.ui, user, _charsets)
709 bzemail = mail.addressencode(self.ui, self.bzemail, _charsets) 728 bzemail = mail.addressencode(self.ui, self.bzemail, _charsets)
710 msg = mail.mimeencode(self.ui, text, _charsets) 729 msg = mail.mimeencode(self.ui, text, _charsets)