Changeset 2977

Show
Ignore:
Timestamp:
01/04/08 14:28:20 (11 months ago)
Author:
mitsuhiko
Message:

beefed up the plugin a bit

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ircannouncerplugin/Trac/plugin.py

    r2976 r2977  
    9090class Trac(callbacks.PrivmsgCommandAndRegexp): 
    9191    threaded = True 
    92     regexps = ['ticketRegexp'] 
    93     commands = ['ticket', 'add', 'announce'] 
     92    regexps = ['ticketRegexp', 'changesetRegexp'] 
     93    commands = ['ticket', 'changeset', 'add', 'remove', 'announce', 
     94                'denounce'] 
    9495 
    9596    def __init__(self, irc): 
     
    115116 
    116117    def listCommands(self): 
    117         commands = self.commands + self.tracs.keys(
    118         commands.sort(
    119         return commands 
     118        commands = set(self.commands
     119        commands.update(self.tracs.keys()
     120        return sorted(commands) 
    120121 
    121122    def isCommandMethod(self, name): 
     
    148149 
    149150    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]+)" 
    151152        for idx in xrange(1, 4, 2): 
    152153            trac_name, ticket_id = match.group(idx, idx + 1) 
     
    155156                                 silent=True) 
    156157 
     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 
    157168    # Regular Callbacks 
    158169 
     
    161172 
    162173        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. 
    164175        """ 
    165176        self._ticketLink(irc, msg, trac_name, ticket_id, silent=False) 
    166177    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')]) 
    167188 
    168189    def add(self, irc, msg, args, trac_name, trac_url): 
     
    173194        etc.) or one letter if you want to use the short forms.""" 
    174195        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)) 
    176197    add = wrap(add, ['commandName', 'httpUrl']) 
    177198 
     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 
    178210    def announce(self, irc, msg, args, channel, trac_name): 
    179         """<channel> <trac name> 
     211        """[<channel>] <trac name> 
    180212 
    181213        Announce the trac in the channel.""" 
    182214        url = self._getTracURL(irc, msg, trac_name, silent=False) 
    183         self._announceTrac(trac_name, channel
     215        self.registryValue('announce', channel).add(trac_name
    184216        irc.reply('The trac %s at %s will now be announced in %s' % ( 
    185217                  trac_name, url, channel)) 
    186218    announce = wrap(announce, ['channel', 'commandName']) 
    187219 
     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 
    188237    # Helper methods 
    189238 
    190239    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') 
    194256 
    195257    def _onRemoteNotify(self, type, values): 
     
    218280 
    219281    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', 
    226290            bold('Ticket'), 
    227291            values['id'], 
    228292            values['summary'], 
    229             action 
     293            action or '' 
    230294        ) 
    231295        yield '<%s>' % values['url'] 
     
    281345        group.register(name, registry.String(url, '')) 
    282346 
    283     def _announceTrac(self, name, channel): 
    284         self.registryValue('announce', channel).add(name) 
    285  
    286347    def _removeTrac(self, name): 
    287348        self.tracs.pop(name, None)