comparison hgext/bugzilla.py @ 2306:4c67ba93560b

bugzilla: allow to map between committer email and bugzilla user name.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Thu, 18 May 2006 09:23:43 -0700
parents 5e5adc1910ed
children
comparison
equal deleted inserted replaced
2305:e7de4dd43472 2306:4c67ba93560b
19 # [hooks] 19 # [hooks]
20 # # run bugzilla hook on every change pulled or pushed in here 20 # # run bugzilla hook on every change pulled or pushed in here
21 # incoming.bugzilla = python:hgext.bugzilla.hook 21 # incoming.bugzilla = python:hgext.bugzilla.hook
22 # 22 #
23 # config items: 23 # config items:
24 #
25 # section name is 'bugzilla'.
26 # [bugzilla]
24 # 27 #
25 # REQUIRED: 28 # REQUIRED:
26 # host = bugzilla # mysql server where bugzilla database lives 29 # host = bugzilla # mysql server where bugzilla database lives
27 # password = ** # user's password 30 # password = ** # user's password
28 # version = 2.16 # version of bugzilla installed 31 # version = 2.16 # version of bugzilla installed
29 # 32 #
30 # OPTIONAL: 33 # OPTIONAL:
31 # bzuser = ... # bugzilla user id to record comments with 34 # bzuser = ... # fallback bugzilla user name to record comments with
32 # db = bugs # database to connect to 35 # db = bugs # database to connect to
33 # notify = ... # command to run to get bugzilla to send mail 36 # notify = ... # command to run to get bugzilla to send mail
34 # regexp = ... # regexp to match bug ids (must contain one "()" group) 37 # regexp = ... # regexp to match bug ids (must contain one "()" group)
35 # strip = 0 # number of slashes to strip for url paths 38 # strip = 0 # number of slashes to strip for url paths
36 # style = ... # style file to use when formatting comments 39 # style = ... # style file to use when formatting comments
37 # template = ... # template to use when formatting comments 40 # template = ... # template to use when formatting comments
38 # timeout = 5 # database connection timeout (seconds) 41 # timeout = 5 # database connection timeout (seconds)
39 # user = bugs # user to connect to database as 42 # user = bugs # user to connect to database as
40 # [web] 43 # [web]
41 # baseurl = http://hgserver/... # root of hg web site for browsing commits 44 # baseurl = http://hgserver/... # root of hg web site for browsing commits
45 #
46 # if hg committer names are not same as bugzilla user names, use
47 # "usermap" feature to map from committer email to bugzilla user name.
48 # usermap can be in hgrc or separate config file.
49 #
50 # [bugzilla]
51 # usermap = filename # cfg file with "committer"="bugzilla user" info
52 # [usermap]
53 # committer_email = bugzilla_user_name
42 54
43 from mercurial.demandload import * 55 from mercurial.demandload import *
44 from mercurial.i18n import gettext as _ 56 from mercurial.i18n import gettext as _
45 from mercurial.node import * 57 from mercurial.node import *
46 demandload(globals(), 'mercurial:templater,util os re time') 58 demandload(globals(), 'mercurial:templater,util os re time')
58 host = self.ui.config('bugzilla', 'host', 'localhost') 70 host = self.ui.config('bugzilla', 'host', 'localhost')
59 user = self.ui.config('bugzilla', 'user', 'bugs') 71 user = self.ui.config('bugzilla', 'user', 'bugs')
60 passwd = self.ui.config('bugzilla', 'password') 72 passwd = self.ui.config('bugzilla', 'password')
61 db = self.ui.config('bugzilla', 'db', 'bugs') 73 db = self.ui.config('bugzilla', 'db', 'bugs')
62 timeout = int(self.ui.config('bugzilla', 'timeout', 5)) 74 timeout = int(self.ui.config('bugzilla', 'timeout', 5))
75 usermap = self.ui.config('bugzilla', 'usermap')
76 if usermap:
77 self.ui.readconfig(usermap)
63 self.ui.note(_('connecting to %s:%s as %s, password %s\n') % 78 self.ui.note(_('connecting to %s:%s as %s, password %s\n') %
64 (host, db, user, '*' * len(passwd))) 79 (host, db, user, '*' * len(passwd)))
65 self.conn = MySQLdb.connect(host=host, user=user, passwd=passwd, 80 self.conn = MySQLdb.connect(host=host, user=user, passwd=passwd,
66 db=db, connect_timeout=timeout) 81 db=db, connect_timeout=timeout)
67 self.cursor = self.conn.cursor() 82 self.cursor = self.conn.cursor()
137 raise KeyError(user) 152 raise KeyError(user)
138 userid = int(all[0][0]) 153 userid = int(all[0][0])
139 self.user_ids[user] = userid 154 self.user_ids[user] = userid
140 return userid 155 return userid
141 156
142 def add_comment(self, bugid, text, prefuser): 157 def map_committer(self, user):
158 '''map name of committer to bugzilla user name.'''
159 for committer, bzuser in self.ui.configitems('usermap'):
160 if committer.lower() == user.lower():
161 return bzuser
162 return user
163
164 def add_comment(self, bugid, text, committer):
143 '''add comment to bug. try adding comment as committer of 165 '''add comment to bug. try adding comment as committer of
144 changeset, otherwise as default bugzilla user.''' 166 changeset, otherwise as default bugzilla user.'''
167 user = self.map_committer(committer)
145 try: 168 try:
146 userid = self.get_user_id(prefuser) 169 userid = self.get_user_id(user)
147 except KeyError: 170 except KeyError:
148 try: 171 try:
149 defaultuser = self.ui.config('bugzilla', 'bzuser') 172 defaultuser = self.ui.config('bugzilla', 'bzuser')
173 if not defaultuser:
174 raise util.Abort(_('cannot find bugzilla user id for %s') %
175 user)
150 userid = self.get_user_id(defaultuser) 176 userid = self.get_user_id(defaultuser)
151 except KeyError: 177 except KeyError:
152 raise util.Abort(_('cannot find user id for %s or %s') % 178 raise util.Abort(_('cannot find bugzilla user id for %s or %s') %
153 (prefuser, defaultuser)) 179 (user, defaultuser))
154 now = time.strftime('%Y-%m-%d %H:%M:%S') 180 now = time.strftime('%Y-%m-%d %H:%M:%S')
155 self.run('''insert into longdescs 181 self.run('''insert into longdescs
156 (bug_id, who, bug_when, thetext) 182 (bug_id, who, bug_when, thetext)
157 values (%s, %s, %s, %s)''', 183 values (%s, %s, %s, %s)''',
158 (bugid, userid, now, text)) 184 (bugid, userid, now, text))