Changeset 2978
- Timestamp:
- 01/04/08 15:32:54 (1 year ago)
- Files:
-
- ircannouncerplugin/0.11/tracext/ircannouncer/listener.py (modified) (4 diffs)
- ircannouncerplugin/0.11/tracext/ircannouncer/service.py (modified) (3 diffs)
- ircannouncerplugin/0.11/tracext/ircannouncer/utils.py (modified) (1 diff)
- ircannouncerplugin/Trac/plugin.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
ircannouncerplugin/0.11/tracext/ircannouncer/listener.py
r2976 r2978 17 17 from trac.ticket.api import ITicketChangeListener 18 18 from trac.versioncontrol.api import IRepositoryListener 19 from trac.wiki.api import IWikiChangeListener 19 20 from tracext.ircannouncer.utils import prepare_ticket_values, \ 20 prepare_changeset_values 21 prepare_changeset_values, prepare_wiki_page_values 21 22 22 23 23 24 class ChangeListener(Component): 24 implements(ITicketChangeListener, IRepositoryListener) 25 implements(ITicketChangeListener, IRepositoryListener, 26 IWikiChangeListener) 25 27 26 28 host = Option('ircannouncer', 'bot_host', '127.0.0.1', … … 37 39 self.bot.ircannouncer.notify(type, values) 38 40 except (IOError, SocketError, Fault): 39 raise40 41 return False 41 42 return True … … 50 51 values = prepare_ticket_values(ticket, 'changed') 51 52 values.update({ 52 'comment': comment ,53 'author': author ,53 'comment': comment or '', 54 'author': author or '', 54 55 'old_values': old_values 55 56 }) … … 66 67 def changeset_commited(self, chgset): 67 68 self.notify('changeset', prepare_changeset_values(self.env, chgset)) 69 70 # -- IWikiChangeListener 71 72 def wiki_page_added(self, page): 73 self.notify('wiki_page', prepare_wiki_page_values(page, 'added')) 74 75 def wiki_page_changed(self, page, version, t, comment, author, ipnr): 76 values = prepare_wiki_page_values(page, 'changed') 77 values['comment'] = comment or '' 78 values['last_author'] = author or '' 79 self.notify('wiki_page', values) 80 81 def wiki_page_deleted(self, page): 82 pass 83 84 def wiki_page_version_deleted(self, page): 85 pass ircannouncerplugin/0.11/tracext/ircannouncer/service.py
r2976 r2978 15 15 from trac.resource import ResourceNotFound 16 16 from trac.versioncontrol.api import NoSuchChangeset 17 from trac.wiki.model import WikiPage 17 18 18 19 from tracext.ircannouncer.utils import TracXMLRPCRequestHandler, \ 19 NotFound, prepare_ticket_values, prepare_changeset_values 20 NotFound, prepare_ticket_values, prepare_changeset_values, \ 21 prepare_wiki_page_values 20 22 21 23 … … 26 28 self.dispatcher = TracXMLRPCRequestHandler({ 27 29 'ircannouncer.getTicket': self.get_ticket, 28 'ircannouncer.getChangeset': self.get_changeset 30 'ircannouncer.getChangeset': self.get_changeset, 31 'ircannouncer.getWikiPage': self.get_wiki_page 29 32 }) 30 33 … … 47 50 return prepare_changeset_values(self.env, chgset) 48 51 52 def get_wiki_page(self, req, page_name): 53 page = WikiPage(self.env, page_name) 54 if not page.exists: 55 raise NotFound() 56 return prepare_wiki_page_values(page) 57 49 58 # -- IRequestHandler methods 50 59 ircannouncerplugin/0.11/tracext/ircannouncer/utils.py
r2976 r2978 86 86 'url': env.abs_href.changeset(chgset.rev) 87 87 }) 88 89 90 def prepare_wiki_page_values(page, action=None): 91 """Converts a wiki page object into a dict.""" 92 values = add_environment_info(page.env, { 93 'name': page.name, 94 'version': page.version, 95 'readonly': page.readonly, 96 'exists': page.exists, 97 'author': page.author or '', 98 'comment': page.comment or '', 99 'url': page.env.abs_href.wiki(page.name) 100 }) 101 if action is not None: 102 values['action'] = action 103 return values ircannouncerplugin/Trac/plugin.py
r2977 r2978 57 57 def _dispatch(self, name, args): 58 58 if name not in self.connector.rpcMethods: 59 raise TypeError('no such method ')59 raise TypeError('no such method (%s)' % name) 60 60 try: 61 61 return self.connector.rpcMethods[name](*args) … … 90 90 class Trac(callbacks.PrivmsgCommandAndRegexp): 91 91 threaded = True 92 regexps = ['ticketRegexp', 'changesetRegexp' ]92 regexps = ['ticketRegexp', 'changesetRegexp', 'wikipageRegexp'] 93 93 commands = ['ticket', 'changeset', 'add', 'remove', 'announce', 94 'denounce' ]94 'denounce', 'wikipage'] 95 95 96 96 def __init__(self, irc): … … 166 166 silent=True) 167 167 168 def wikipageRegexp(self, irc, msg, match): 169 r"(?:\b([a-zA-Z_]+):)?\bwiki:(\w[\w_]*)" 170 trac_name, wiki_page = match.groups() 171 self._wikipageLink(irc, msg, trac_name, wiki_page, silent=True) 172 168 173 # Regular Callbacks 169 174 … … 186 191 changeset = wrap(changeset, [('regexpMatcher', '/^[a-fA-F0-9:]+$/'), 187 192 optional('commandName')]) 193 194 def wikipage(self, irc, msg, args, wiki_page, trac_name): 195 """<wiki page> [<trac>] 196 197 Get a link to that wiki page. If the trac is not provided, the 198 channel's default trac is used. 199 """ 200 wiki_page = '_'.join(wiki_page.split()) 201 self._wikipageLink(irc, msg, trac_name, wiki_page, silent=False) 202 wikipage = wrap(wikipage, ['something', optional('commandName')]) 188 203 189 204 def add(self, irc, msg, args, trac_name, trac_url): … … 255 270 irc.error('No such ticket') 256 271 272 def _wikipageLink(self, irc, msg, trac_name, wiki_page, silent=False): 273 try: 274 trac = self._openTrac(irc, msg, trac_name, silent) 275 for line in self._printWikiPage(trac.getWikiPage(wiki_page)): 276 irc.reply(line, prefixNick=False) 277 except ResourceNotFound: 278 if not silent: 279 irc.error('No such wiki page') 280 257 281 def _onRemoteNotify(self, type, values): 258 282 trac = self._findTracByURL(values['trac']['url']) … … 261 285 handler = { 262 286 'changeset': self._printChangeset, 263 'ticket': self._printTicket 287 'ticket': self._printTicket, 288 'wiki_page': self._printWikiPage 264 289 }[type] 265 290 for irc, channel in self._findAnnouncementChannels(trac): 266 for line in handler(values , detailed=True):291 for line in handler(values): 267 292 irc.sendMsg(ircmsgs.privmsg(channel, line)) 268 293 return 0 269 294 270 def _printChangeset(self, values , detailed=False):295 def _printChangeset(self, values): 271 296 yield format('%s [%s] by %s in %s (%n): %s', 272 297 bold('Changeset'), … … 279 304 yield '<%s>' % values['url'] 280 305 281 def _printTicket(self, values , detailed=False):306 def _printTicket(self, values): 282 307 action = values.get('action') 283 308 if action is not None: … … 286 311 elif action == 'changed': 287 312 action = 'changed by %s' % underline(values['author']) 288 action = ' (%s)' % action 313 comment = values['comment'] 314 if comment: 315 comment = ', ' + comment 316 action = ' (%s%s)' % (action, comment) 289 317 yield format('%s #%s: %s%s', 290 318 bold('Ticket'), … … 294 322 ) 295 323 yield '<%s>' % values['url'] 324 325 def _printWikiPage(self, values): 326 action = values.get('action') 327 if action is not None: 328 if action == 'created': 329 action = 'created by %s' % underline(values['author']) 330 elif action == 'changed': 331 action = 'changed by %s' % underline(values['author']) 332 action = ' (%s)' % action 333 yield format('%s%s %u', 334 bold(values['name']), 335 action or '', 336 values['url'] 337 ) 296 338 297 339 def _findTracByURL(self, trac_url):
