Anton Shestakov <av6@dwimlabs.net>, Wed, 21 Nov 2018 18:08:57 +0800
plugin: use a 2-tuple as an argument to string.startswith()
plugin.py
Permissions: -rw-r--r--
# Copyright (c) 2007, 2009 Brendan Cully # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright notice, # this list of conditions, and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions, and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the author of this software nor the name of # contributors to this software may be used to endorse or promote products # derived from this software without specific prior written consent. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. from supybot import utils, plugins, ircutils, callbacks from supybot.commands import * fields = {'issue':'title', def fetch_item(nodeid, kind='issue', tracker='http://mercurial.selenic.com/bts'): """Use Roundup's CSV exports to fetch arbitrary item descriptions Default behavior is to return subject for a new issue: '[issue1201569] allow running multiple instances of IDLE' Can also fetch message contents: >>> fetch_item(108, 'msg') 'Assigned to Guido for obvious reasons.' Multiline messages have spurious quotes, thanks to CSV format: >>> print fetch_item(81362, 'msg') File descriptions work too: >>> fetch_item(102, 'file') 'Example of message from frustrated user on c.l.py' Missing descriptions show as 'None': >>> fetch_item(12227, 'file') # This should be the smallest query able to fetch what we need query_tpl = [('@action', 'export_csv'), ('@filter', 'id'), ('id', nodeid), ('@columns', fields[kind])] item_url = '/%s?%s' % (kind, urllib.urlencode(query_tpl)) content = urllib.urlopen(tracker + item_url).read().split('\r\n') if content[0] == 'title': # Got a single data row CSV, format and return it return '[issue%s] %s' % (nodeid, content[1].strip()) elif content[0] == 'content': return content[1].strip() elif content[0] == 'description': return content[1].strip() def fetch(nodeid, debug=True): ''' Format input for fetch_item, add debug messages ''' if nodeid.startswith('msg'): elif nodeid.startswith('file'): nodeid = nodeid.replace(kind, '') result = fetch_item(int(nodeid), kind) result = 'No item found for %s%s' % (kind, nodeid) logging.info('Fetched "%s: %s"' % (kind, result)) def revparse(irc, msg, args, state): state.errorInvalid('revision', args[0], state.args.append(args.pop(0)) addConverter('revision', revparse) def __init__(self, path): with open(os.devnull) as null: p = subprocess.Popen([self.path] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=null, env={'HGPLAIN': '1', 'HGENCODING': 'UTF-8'}) out, err = p.communicate() return (out.decode('utf-8'), err.decode('utf-8')) class Mercurial(callbacks.Plugin): """Add the help for "@plugin help Mercurial" here This should describe *how* to use this plugin.""" super(Mercurial, self).__init__(irc) self.path = self.registryValue('path') def hghelp(self, irc, msg, args, cmd): """runs hg help with the given args""" lines = text.splitlines() if not line or line.startswith('aliases:'): if line.startswith(('options', 'enabled extensions:')): if out and ' extension - ' in out[0]: out[0] = ircutils.bold(out[0]) out[1] = ircutils.bold(out[1]) out, err = self.hg.run(['help', cmd]) irc.reply(err.splitlines()[0]) hghelp = wrap(hghelp, ['text']) def changelog(self, irc, repo, rev): tmpl = '{rev}:{node|short}\n{date|age}\n{author|person}\n{files}\n{desc}' '-R', repo, 'log', '-r', rev, '-l', '1', '--template', tmpl, '-v' return irc.reply(err.splitlines()[0]) return irc.reply('no changesets found') lines = [x for x in out.strip().splitlines() if x] node, date, user, files = lines[:4] node = ircutils.bold(node) user = ircutils.mircColor(user, fg='green') lines = ['%s %s %s' % (node, user, date)] + lines baseurl, err = self.hg.run(['-R', repo, 'paths', 'default']) url = "%s/rev/%s" % (baseurl.strip("\n/"), rev) irc.replies(lines[:2] + [url]) def crew(self, irc, msg, args, rev): "gets the changelog message for the given revision of the crew repository" self.changelog(irc, '/home/brendan/hg/mirror/mercurial/crew', rev) crew = wrap(crew, ['revision']) def main(self, irc, msg, args, rev): "gets the changelog message for the given revision of the crew repository" self.changelog(irc, '/home/hg/repos/hg', rev) main = wrap(main, ['revision']) def bts(self, irc, msg, args, issue): """usage: bts (url|<issueno>) url gets the url of the bts, <issueno> summarizes that bug url = 'http://mercurial.selenic.com/bts' if title.startswith('[issue'): link = '/'.join([url, title[1:end]]) title = ircutils.bold(title[:end+1]) + title[end+1:] title = title.replace('\n', ' ') bts = wrap(bts, ['text']) def glossary(self, irc, msg, args, term): """usage: glossary <term>""" raw, err = self.hg.run(['help', 'glossary']) for line in raw.splitlines(): if not found and line.lower().startswith(' ' + term.lower()): elif found and not (line.startswith(' ') or not line): if found and not done and line: irc.replies(answer[1:], joiner=' ') irc.reply('no match found') glossary = wrap(glossary, ['text'])