comparison hgext/bugzilla.py @ 26587:56b2bcea2529

error: get Abort from 'error' instead of 'util' The home of 'Abort' is 'error' not 'util' however, a lot of code seems to be confused about that and gives all the credit to 'util' instead of the hardworking 'error'. In a spirit of equity, we break the cycle of injustice and give back to 'error' the respect it deserves. And screw that 'util' poser. For great justice.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Thu, 08 Oct 2015 12:55:45 -0700
parents 328739ea70c3
children 2f0384242b35
comparison
equal deleted inserted replaced
26586:d51c658d3f04 26587:56b2bcea2529
277 Changeset commit comment. Bug 1234. 277 Changeset commit comment. Bug 1234.
278 ''' 278 '''
279 279
280 from mercurial.i18n import _ 280 from mercurial.i18n import _
281 from mercurial.node import short 281 from mercurial.node import short
282 from mercurial import cmdutil, mail, util 282 from mercurial import cmdutil, mail, util, error
283 import re, time, urlparse, xmlrpclib 283 import re, time, urlparse, xmlrpclib
284 284
285 # Note for extension authors: ONLY specify testedwith = 'internal' for 285 # Note for extension authors: ONLY specify testedwith = 'internal' for
286 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should 286 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
287 # be specifying the version(s) of Mercurial they are tested with, or 287 # be specifying the version(s) of Mercurial they are tested with, or
356 def __init__(self, ui): 356 def __init__(self, ui):
357 try: 357 try:
358 import MySQLdb as mysql 358 import MySQLdb as mysql
359 bzmysql._MySQLdb = mysql 359 bzmysql._MySQLdb = mysql
360 except ImportError as err: 360 except ImportError as err:
361 raise util.Abort(_('python mysql support not available: %s') % err) 361 raise error.Abort(_('python mysql support not available: %s') % err)
362 362
363 bzaccess.__init__(self, ui) 363 bzaccess.__init__(self, ui)
364 364
365 host = self.ui.config('bugzilla', 'host', 'localhost') 365 host = self.ui.config('bugzilla', 'host', 'localhost')
366 user = self.ui.config('bugzilla', 'user', 'bugs') 366 user = self.ui.config('bugzilla', 'user', 'bugs')
390 def get_longdesc_id(self): 390 def get_longdesc_id(self):
391 '''get identity of longdesc field''' 391 '''get identity of longdesc field'''
392 self.run('select fieldid from fielddefs where name = "longdesc"') 392 self.run('select fieldid from fielddefs where name = "longdesc"')
393 ids = self.cursor.fetchall() 393 ids = self.cursor.fetchall()
394 if len(ids) != 1: 394 if len(ids) != 1:
395 raise util.Abort(_('unknown database schema')) 395 raise error.Abort(_('unknown database schema'))
396 return ids[0][0] 396 return ids[0][0]
397 397
398 def filter_real_bug_ids(self, bugs): 398 def filter_real_bug_ids(self, bugs):
399 '''filter not-existing bugs from set.''' 399 '''filter not-existing bugs from set.'''
400 self.run('select bug_id from bugs where bug_id in %s' % 400 self.run('select bug_id from bugs where bug_id in %s' %
435 fp = util.popen('(%s) 2>&1' % cmd) 435 fp = util.popen('(%s) 2>&1' % cmd)
436 out = fp.read() 436 out = fp.read()
437 ret = fp.close() 437 ret = fp.close()
438 if ret: 438 if ret:
439 self.ui.warn(out) 439 self.ui.warn(out)
440 raise util.Abort(_('bugzilla notify command %s') % 440 raise error.Abort(_('bugzilla notify command %s') %
441 util.explainexit(ret)[0]) 441 util.explainexit(ret)[0])
442 self.ui.status(_('done\n')) 442 self.ui.status(_('done\n'))
443 443
444 def get_user_id(self, user): 444 def get_user_id(self, user):
445 '''look up numeric bugzilla user id.''' 445 '''look up numeric bugzilla user id.'''
468 userid = self.get_user_id(user) 468 userid = self.get_user_id(user)
469 except KeyError: 469 except KeyError:
470 try: 470 try:
471 defaultuser = self.ui.config('bugzilla', 'bzuser') 471 defaultuser = self.ui.config('bugzilla', 'bzuser')
472 if not defaultuser: 472 if not defaultuser:
473 raise util.Abort(_('cannot find bugzilla user id for %s') % 473 raise error.Abort(_('cannot find bugzilla user id for %s') %
474 user) 474 user)
475 userid = self.get_user_id(defaultuser) 475 userid = self.get_user_id(defaultuser)
476 user = defaultuser 476 user = defaultuser
477 except KeyError: 477 except KeyError:
478 raise util.Abort(_('cannot find bugzilla user id for %s or %s') 478 raise error.Abort(_('cannot find bugzilla user id for %s or %s')
479 % (user, defaultuser)) 479 % (user, defaultuser))
480 return (user, userid) 480 return (user, userid)
481 481
482 def updatebug(self, bugid, newstate, text, committer): 482 def updatebug(self, bugid, newstate, text, committer):
483 '''update bug state with comment text. 483 '''update bug state with comment text.
515 def get_longdesc_id(self): 515 def get_longdesc_id(self):
516 '''get identity of longdesc field''' 516 '''get identity of longdesc field'''
517 self.run('select id from fielddefs where name = "longdesc"') 517 self.run('select id from fielddefs where name = "longdesc"')
518 ids = self.cursor.fetchall() 518 ids = self.cursor.fetchall()
519 if len(ids) != 1: 519 if len(ids) != 1:
520 raise util.Abort(_('unknown database schema')) 520 raise error.Abort(_('unknown database schema'))
521 return ids[0][0] 521 return ids[0][0]
522 522
523 # Bugzilla via XMLRPC interface. 523 # Bugzilla via XMLRPC interface.
524 524
525 class cookietransportrequest(object): 525 class cookietransportrequest(object):
703 def __init__(self, ui): 703 def __init__(self, ui):
704 bzxmlrpc.__init__(self, ui) 704 bzxmlrpc.__init__(self, ui)
705 705
706 self.bzemail = self.ui.config('bugzilla', 'bzemail') 706 self.bzemail = self.ui.config('bugzilla', 'bzemail')
707 if not self.bzemail: 707 if not self.bzemail:
708 raise util.Abort(_("configuration 'bzemail' missing")) 708 raise error.Abort(_("configuration 'bzemail' missing"))
709 mail.validateconfig(self.ui) 709 mail.validateconfig(self.ui)
710 710
711 def makecommandline(self, fieldname, value): 711 def makecommandline(self, fieldname, value):
712 if self.bzvermajor >= 4: 712 if self.bzvermajor >= 4:
713 return "@%s %s" % (fieldname, str(value)) 713 return "@%s %s" % (fieldname, str(value))
733 if not matches['users']: 733 if not matches['users']:
734 user = self.ui.config('bugzilla', 'user', 'bugs') 734 user = self.ui.config('bugzilla', 'user', 'bugs')
735 matches = self.bzproxy.User.get({'match': [user], 735 matches = self.bzproxy.User.get({'match': [user],
736 'token': self.bztoken}) 736 'token': self.bztoken})
737 if not matches['users']: 737 if not matches['users']:
738 raise util.Abort(_("default bugzilla user %s email not found") % 738 raise error.Abort(_("default bugzilla user %s email not found")
739 user) 739 % user)
740 user = matches['users'][0]['email'] 740 user = matches['users'][0]['email']
741 commands.append(self.makecommandline("id", bugid)) 741 commands.append(self.makecommandline("id", bugid))
742 742
743 text = "\n".join(commands) + "\n\n" + comment 743 text = "\n".join(commands) + "\n\n" + comment
744 744
787 787
788 bzversion = self.ui.config('bugzilla', 'version') 788 bzversion = self.ui.config('bugzilla', 'version')
789 try: 789 try:
790 bzclass = bugzilla._versions[bzversion] 790 bzclass = bugzilla._versions[bzversion]
791 except KeyError: 791 except KeyError:
792 raise util.Abort(_('bugzilla version %s not supported') % 792 raise error.Abort(_('bugzilla version %s not supported') %
793 bzversion) 793 bzversion)
794 self.bzdriver = bzclass(self.ui) 794 self.bzdriver = bzclass(self.ui)
795 795
796 self.bug_re = re.compile( 796 self.bug_re = re.compile(
797 self.ui.config('bugzilla', 'regexp', 797 self.ui.config('bugzilla', 'regexp',
898 def hook(ui, repo, hooktype, node=None, **kwargs): 898 def hook(ui, repo, hooktype, node=None, **kwargs):
899 '''add comment to bugzilla for each changeset that refers to a 899 '''add comment to bugzilla for each changeset that refers to a
900 bugzilla bug id. only add a comment once per bug, so same change 900 bugzilla bug id. only add a comment once per bug, so same change
901 seen multiple times does not fill bug with duplicate data.''' 901 seen multiple times does not fill bug with duplicate data.'''
902 if node is None: 902 if node is None:
903 raise util.Abort(_('hook type %s does not pass a changeset id') % 903 raise error.Abort(_('hook type %s does not pass a changeset id') %
904 hooktype) 904 hooktype)
905 try: 905 try:
906 bz = bugzilla(ui, repo) 906 bz = bugzilla(ui, repo)
907 ctx = repo[node] 907 ctx = repo[node]
908 bugs = bz.find_bugs(ctx) 908 bugs = bz.find_bugs(ctx)
909 if bugs: 909 if bugs:
910 for bug in bugs: 910 for bug in bugs:
911 bz.update(bug, bugs[bug], ctx) 911 bz.update(bug, bugs[bug], ctx)
912 bz.notify(bugs, util.email(ctx.user())) 912 bz.notify(bugs, util.email(ctx.user()))
913 except Exception as e: 913 except Exception as e:
914 raise util.Abort(_('Bugzilla error: %s') % e) 914 raise error.Abort(_('Bugzilla error: %s') % e)