Changeset 2978

Show
Ignore:
Timestamp:
01/04/08 15:32:54 (1 year ago)
Author:
mitsuhiko
Message:

again some small improvements, this time added wiki page support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ircannouncerplugin/0.11/tracext/ircannouncer/listener.py

    r2976 r2978  
    1717from trac.ticket.api import ITicketChangeListener 
    1818from trac.versioncontrol.api import IRepositoryListener 
     19from trac.wiki.api import IWikiChangeListener 
    1920from tracext.ircannouncer.utils import prepare_ticket_values, \ 
    20      prepare_changeset_values 
     21     prepare_changeset_values, prepare_wiki_page_values 
    2122 
    2223 
    2324class ChangeListener(Component): 
    24     implements(ITicketChangeListener, IRepositoryListener) 
     25    implements(ITicketChangeListener, IRepositoryListener, 
     26               IWikiChangeListener) 
    2527 
    2628    host = Option('ircannouncer', 'bot_host', '127.0.0.1', 
     
    3739            self.bot.ircannouncer.notify(type, values) 
    3840        except (IOError, SocketError, Fault): 
    39             raise 
    4041            return False 
    4142        return True 
     
    5051        values = prepare_ticket_values(ticket, 'changed') 
    5152        values.update({ 
    52             'comment':      comment
    53             'author':       author
     53            'comment':      comment or ''
     54            'author':       author or ''
    5455            'old_values':   old_values 
    5556        }) 
     
    6667    def changeset_commited(self, chgset): 
    6768        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  
    1515from trac.resource import ResourceNotFound 
    1616from trac.versioncontrol.api import NoSuchChangeset 
     17from trac.wiki.model import WikiPage 
    1718 
    1819from 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 
    2022 
    2123 
     
    2628        self.dispatcher = TracXMLRPCRequestHandler({ 
    2729            'ircannouncer.getTicket':       self.get_ticket, 
    28             'ircannouncer.getChangeset':    self.get_changeset 
     30            'ircannouncer.getChangeset':    self.get_changeset, 
     31            'ircannouncer.getWikiPage':     self.get_wiki_page 
    2932        }) 
    3033 
     
    4750        return prepare_changeset_values(self.env, chgset) 
    4851 
     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 
    4958    # -- IRequestHandler methods 
    5059 
  • ircannouncerplugin/0.11/tracext/ircannouncer/utils.py

    r2976 r2978  
    8686        'url':          env.abs_href.changeset(chgset.rev) 
    8787    }) 
     88 
     89 
     90def 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  
    5757    def _dispatch(self, name, args): 
    5858        if name not in self.connector.rpcMethods: 
    59             raise TypeError('no such method'
     59            raise TypeError('no such method (%s)' % name
    6060        try: 
    6161            return self.connector.rpcMethods[name](*args) 
     
    9090class Trac(callbacks.PrivmsgCommandAndRegexp): 
    9191    threaded = True 
    92     regexps = ['ticketRegexp', 'changesetRegexp'
     92    regexps = ['ticketRegexp', 'changesetRegexp', 'wikipageRegexp'
    9393    commands = ['ticket', 'changeset', 'add', 'remove', 'announce', 
    94                 'denounce'
     94                'denounce', 'wikipage'
    9595 
    9696    def __init__(self, irc): 
     
    166166                                    silent=True) 
    167167 
     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 
    168173    # Regular Callbacks 
    169174 
     
    186191    changeset = wrap(changeset, [('regexpMatcher', '/^[a-fA-F0-9:]+$/'), 
    187192                                 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')]) 
    188203 
    189204    def add(self, irc, msg, args, trac_name, trac_url): 
     
    255270                irc.error('No such ticket') 
    256271 
     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 
    257281    def _onRemoteNotify(self, type, values): 
    258282        trac = self._findTracByURL(values['trac']['url']) 
     
    261285        handler = { 
    262286            'changeset':        self._printChangeset, 
    263             'ticket':           self._printTicket 
     287            'ticket':           self._printTicket, 
     288            'wiki_page':        self._printWikiPage 
    264289        }[type] 
    265290        for irc, channel in self._findAnnouncementChannels(trac): 
    266             for line in handler(values, detailed=True): 
     291            for line in handler(values): 
    267292                irc.sendMsg(ircmsgs.privmsg(channel, line)) 
    268293        return 0 
    269294 
    270     def _printChangeset(self, values, detailed=False): 
     295    def _printChangeset(self, values): 
    271296        yield format('%s [%s] by %s in %s (%n): %s', 
    272297            bold('Changeset'), 
     
    279304        yield '<%s>' % values['url'] 
    280305 
    281     def _printTicket(self, values, detailed=False): 
     306    def _printTicket(self, values): 
    282307        action = values.get('action') 
    283308        if action is not None: 
     
    286311            elif action == 'changed': 
    287312                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) 
    289317        yield format('%s #%s: %s%s', 
    290318            bold('Ticket'), 
     
    294322        ) 
    295323        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        ) 
    296338 
    297339    def _findTracByURL(self, trac_url):