Changeset 2977
- Timestamp:
- 01/04/08 14:28:20 (11 months ago)
- Files:
-
- ircannouncerplugin/Trac/plugin.py (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
ircannouncerplugin/Trac/plugin.py
r2976 r2977 90 90 class Trac(callbacks.PrivmsgCommandAndRegexp): 91 91 threaded = True 92 regexps = ['ticketRegexp'] 93 commands = ['ticket', 'add', 'announce'] 92 regexps = ['ticketRegexp', 'changesetRegexp'] 93 commands = ['ticket', 'changeset', 'add', 'remove', 'announce', 94 'denounce'] 94 95 95 96 def __init__(self, irc): … … 115 116 116 117 def listCommands(self): 117 commands = se lf.commands + self.tracs.keys()118 commands. sort()119 return commands118 commands = set(self.commands) 119 commands.update(self.tracs.keys()) 120 return sorted(commands) 120 121 121 122 def isCommandMethod(self, name): … … 148 149 149 150 def ticketRegexp(self, irc, msg, match): 150 r"(?: ([a-zA-Z_]+):)?(?:\bticket:|#)([0-9]+)|#([a-zA-Z])([0-9]+)"151 r"(?:\b([a-zA-Z_]+):)?(?:\bticket:|#)([0-9]+)|#([a-zA-Z]+)([0-9]+)" 151 152 for idx in xrange(1, 4, 2): 152 153 trac_name, ticket_id = match.group(idx, idx + 1) … … 155 156 silent=True) 156 157 158 def changesetRegexp(self, irc, msg, match): 159 r"""(?x) 160 (?:\b([a-zA-Z_]+):)?\bchangeset:([0-9a-fA-F]+(?::[0-9a-fA-F]*)?) | 161 \B\[([a-zA-Z]+)?([0-9]+)\]""" 162 for idx in xrange(1, 4, 2): 163 trac_name, changeset_id = match.group(idx, idx + 1) 164 if changeset_id: 165 self._changesetLink(irc, msg, trac_name, changeset_id, 166 silent=True) 167 157 168 # Regular Callbacks 158 169 … … 161 172 162 173 Gets the summary of the ticket provided and the link to it. If the 163 trac is not provided, the channel's default trac is used.174 trac is not given, the channel's default trac is used. 164 175 """ 165 176 self._ticketLink(irc, msg, trac_name, ticket_id, silent=False) 166 177 ticket = wrap(ticket, ['int', optional('commandName')]) 178 179 def changeset(self, irc, msg, args, ticket_id, trac_name): 180 """<changeset id> [<trac>] 181 182 Gets the summary of the changeset provided and the link to it. If the 183 trac is not given, the channel's default trac is used. 184 """ 185 self._changesetLink(irc, msg, trac_name, changeset_id, silent=False) 186 changeset = wrap(changeset, [('regexpMatcher', '/^[a-fA-F0-9:]+$/'), 187 optional('commandName')]) 167 188 168 189 def add(self, irc, msg, args, trac_name, trac_url): … … 173 194 etc.) or one letter if you want to use the short forms.""" 174 195 self._addTrac(trac_name, trac_url) 175 irc.reply('Added trac at %s as %s' % (trac_url, trac_name))196 irc.reply('Added trac at %s as "%s"' % (trac_url, trac_name)) 176 197 add = wrap(add, ['commandName', 'httpUrl']) 177 198 199 def remove(self, irc, msg, args, trac_name): 200 """<trac name> 201 202 Remove a new trac to the database.""" 203 if trac_name not in self.tracs: 204 irc.error('Unknown trac "%s".' % trac_name) 205 else: 206 self._removeTrac(trac_name) 207 irc.reply('Removed "%s".' % trac_name) 208 remove = wrap(remove, ['commandName']) 209 178 210 def announce(self, irc, msg, args, channel, trac_name): 179 """ <channel><trac name>211 """[<channel>] <trac name> 180 212 181 213 Announce the trac in the channel.""" 182 214 url = self._getTracURL(irc, msg, trac_name, silent=False) 183 self. _announceTrac(trac_name, channel)215 self.registryValue('announce', channel).add(trac_name) 184 216 irc.reply('The trac %s at %s will now be announced in %s' % ( 185 217 trac_name, url, channel)) 186 218 announce = wrap(announce, ['channel', 'commandName']) 187 219 220 def denounce(self, irc, msg, args, channel, trac_name): 221 """[<channel>] <trac name> 222 223 Stop announcing a trac in a channel.""" 224 if trac_name in self.tracs: 225 announced_tracs = self.registryValue('announce', channel) 226 if trac_name in announced_tracs: 227 announced_tracs.discard(trac_name) 228 irc.reply('I\'m not announcing "%s" in %s any longer' % ( 229 trac_name, channel)) 230 else: 231 irc.error('I\'m not annoucing "%s" in %s!' % ( 232 trac_name, channel)) 233 else: 234 irc.error('Sorry, I don\'t know "%s" yet' % trac_name) 235 denounce = wrap(denounce, ['channel', 'commandName']) 236 188 237 # Helper methods 189 238 190 239 def _ticketLink(self, irc, msg, trac_name, ticket_id, silent=False): 191 trac = self._openTrac(irc, msg, trac_name, silent) 192 detail = trac.getTicket(ticket_id) 193 irc.reply(str(detail)) 240 try: 241 trac = self._openTrac(irc, msg, trac_name, silent) 242 for line in self._printTicket(trac.getTicket(ticket_id)): 243 irc.reply(line, prefixNick=False) 244 except ResourceNotFound: 245 if not silent: 246 irc.error('No such ticket') 247 248 def _changesetLink(self, irc, msg, trac_name, changeset_id, silent=False): 249 try: 250 trac = self._openTrac(irc, msg, trac_name, silent) 251 for line in self._printChangeset(trac.getChangeset(changeset_id)): 252 irc.reply(line, prefixNick=False) 253 except ResourceNotFound: 254 if not silent: 255 irc.error('No such ticket') 194 256 195 257 def _onRemoteNotify(self, type, values): … … 218 280 219 281 def _printTicket(self, values, detailed=False): 220 action = values['action'] 221 if action == 'created': 222 action = 'created by %s' % underline(values['reporter']) 223 elif action == 'changed': 224 action = 'changed by %s' % underline(values['author']) 225 yield format('%s #%s: %s (%s)', 282 action = values.get('action') 283 if action is not None: 284 if action == 'created': 285 action = 'created by %s' % underline(values['reporter']) 286 elif action == 'changed': 287 action = 'changed by %s' % underline(values['author']) 288 action = ' (%s)' % action 289 yield format('%s #%s: %s%s', 226 290 bold('Ticket'), 227 291 values['id'], 228 292 values['summary'], 229 action 293 action or '' 230 294 ) 231 295 yield '<%s>' % values['url'] … … 281 345 group.register(name, registry.String(url, '')) 282 346 283 def _announceTrac(self, name, channel):284 self.registryValue('announce', channel).add(name)285 286 347 def _removeTrac(self, name): 287 348 self.tracs.pop(name, None)
