[PATCH 2 of 2] help: move helprst function from commands.py to help.py

Olav Reinert seroton10 at gmail.com
Wed Jun 27 11:48:31 CDT 2012


That's exactly what I'm preparing for. I just wasn't sure what is the preferred way to submit this type of change, hence it is submitted on its own.

On 27.06.2012, at 02:35, Augie Fackler <raf at durin42.com> wrote:

> FWIW, this looks like a worthwhile cleanup to me so we can start using this same rendering code for the web UI.
> 
> On Jun 26, 2012, at 2:23 PM, Olav Reinert wrote:
> 
>> # HG changeset patch
>> # User Olav Reinert <seroton10 at gmail.com>
>> # Date 1340745489 -7200
>> # Node ID e53837e4d815f3dc106ac957c704b10b6c542930
>> # Parent  77d124b770d077179d3e55c48eadc141d2fc7740
>> help: move helprst function from commands.py to help.py
>> 
>> The only other changes made by this patch, apart from the move itself, are
>> trivial adjustments to import statements, and the addition of a name space
>> prefix.
>> 
>> diff -r 77d124b770d0 -r e53837e4d815 mercurial/commands.py
>> --- a/mercurial/commands.py    Tue Jun 26 23:18:09 2012 +0200
>> +++ b/mercurial/commands.py    Tue Jun 26 23:18:09 2012 +0200
>> @@ -3077,296 +3077,6 @@
>>        displayer.show(ctx)
>>    displayer.close()
>> 
>> -from mercurial.help import *
>> -
>> -def helprst(ui, textwidth, name=None, unknowncmd=False, full=True, **opts):
>> -    """generate RST-formatted help for a given topic or a help overview
>> -
>> -    With no arguments, generate a list of commands with short help messages.
>> -
>> -    Given a topic, extension, or command name, generate help for that
>> -    topic.
>> -
>> -    Returns a list of strings which, when joined, forms the complete RST
>> -    help document.
>> -    """
>> -
>> -    def helpcmd(name):
>> -        import commands # avoid cycle
>> -        try:
>> -            aliases, entry = cmdutil.findcmd(name, commands.table,
>> -                    strict=unknowncmd)
>> -        except error.AmbiguousCommand, inst:
>> -            # py3k fix: except vars can't be used outside the scope of the
>> -            # except block, nor can be used inside a lambda. python issue4617
>> -            prefix = inst.args[0]
>> -            select = lambda c: c.lstrip('^').startswith(prefix)
>> -            rst = helplist(select)
>> -            return rst
>> -
>> -        rst = []
>> -
>> -        # check if it's an invalid alias and display its error if it is
>> -        if getattr(entry[0], 'badalias', False):
>> -            if not unknowncmd:
>> -                ui.pushbuffer()
>> -                entry[0](ui)
>> -                rst.append(ui.popbuffer())
>> -            return rst
>> -
>> -        # synopsis
>> -        if len(entry) > 2:
>> -            if entry[2].startswith('hg'):
>> -                rst.append("%s\n" % entry[2])
>> -            else:
>> -                rst.append('hg %s %s\n' % (aliases[0], entry[2]))
>> -        else:
>> -            rst.append('hg %s\n' % aliases[0])
>> -        # aliases
>> -        if full and not ui.quiet and len(aliases) > 1:
>> -            rst.append(_("\naliases: %s\n") % ', '.join(aliases[1:]))
>> -        rst.append('\n')
>> -
>> -        # description
>> -        doc = gettext(entry[0].__doc__)
>> -        if not doc:
>> -            doc = _("(no help text available)")
>> -        if util.safehasattr(entry[0], 'definition'):  # aliased command
>> -            if entry[0].definition.startswith('!'):  # shell alias
>> -                doc = _('shell alias for::\n\n    %s') % entry[0].definition[1:]
>> -            else:
>> -                doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
>> -        doc = doc.splitlines(True)
>> -        if ui.quiet or not full:
>> -            rst.append(doc[0])
>> -        else:
>> -            rst.extend(doc)
>> -        rst.append('\n')
>> -
>> -        # check if this command shadows a non-trivial (multi-line)
>> -        # extension help text
>> -        try:
>> -            mod = extensions.find(name)
>> -            doc = gettext(mod.__doc__) or ''
>> -            if '\n' in doc.strip():
>> -                msg = _('use "hg help -e %s" to show help for '
>> -                        'the %s extension') % (name, name)
>> -                rst.append('\n%s\n' % msg)
>> -        except KeyError:
>> -            pass
>> -
>> -        # options
>> -        if not ui.quiet and entry[1]:
>> -            rst.append('\n%s\n\n' % _("options:"))
>> -            rst.append(optrst(entry[1], ui.verbose))
>> -
>> -        if ui.verbose:
>> -            rst.append('\n%s\n\n' % _("global options:"))
>> -            rst.append(optrst(commands.globalopts, ui.verbose))
>> -
>> -        if not ui.verbose:
>> -            if not full:
>> -                rst.append(_('\nuse "hg help %s" to show the full help text\n')
>> -                           % name)
>> -            elif not ui.quiet:
>> -                rst.append(_('\nuse "hg -v help %s" to show more info\n')
>> -                           % name)
>> -        return rst
>> -
>> -
>> -    def helplist(select=None):
>> -        # list of commands
>> -        if name == "shortlist":
>> -            header = _('basic commands:\n\n')
>> -        else:
>> -            header = _('list of commands:\n\n')
>> -
>> -        h = {}
>> -        cmds = {}
>> -        import commands # avoid cycle
>> -        for c, e in commands.table.iteritems():
>> -            f = c.split("|", 1)[0]
>> -            if select and not select(f):
>> -                continue
>> -            if (not select and name != 'shortlist' and
>> -                e[0].__module__ != commands.__name__):
>> -                continue
>> -            if name == "shortlist" and not f.startswith("^"):
>> -                continue
>> -            f = f.lstrip("^")
>> -            if not ui.debugflag and f.startswith("debug"):
>> -                continue
>> -            doc = e[0].__doc__
>> -            if doc and 'DEPRECATED' in doc and not ui.verbose:
>> -                continue
>> -            doc = gettext(doc)
>> -            if not doc:
>> -                doc = _("(no help text available)")
>> -            h[f] = doc.splitlines()[0].rstrip()
>> -            cmds[f] = c.lstrip("^")
>> -
>> -        rst = []
>> -        if not h:
>> -            if not ui.quiet:
>> -                rst.append(_('no commands defined\n'))
>> -            return rst
>> -
>> -        if not ui.quiet:
>> -            rst.append(header)
>> -        fns = sorted(h)
>> -        for f in fns:
>> -            if ui.verbose:
>> -                commands = cmds[f].replace("|",", ")
>> -                rst.append(" :%s: %s\n" % (commands, h[f]))
>> -            else:
>> -                rst.append(' :%s: %s\n' % (f, h[f]))
>> -
>> -        if not name:
>> -            exts = listexts(_('enabled extensions:'), extensions.enabled())
>> -            if exts:
>> -                rst.append('\n')
>> -                rst.extend(exts)
>> -
>> -            rst.append(_("\nadditional help topics:\n\n"))
>> -            topics = []
>> -            for names, header, doc in helptable:
>> -                topics.append((sorted(names, key=len, reverse=True)[0], header))
>> -            for t, desc in topics:
>> -                rst.append(" :%s: %s\n" % (t, desc))
>> -
>> -        optlist = []
>> -        if not ui.quiet:
>> -            if ui.verbose:
>> -                import commands # avoid cycle
>> -                optlist.append((_("global options:"), commands.globalopts))
>> -                if name == 'shortlist':
>> -                    optlist.append((_('use "hg help" for the full list '
>> -                                           'of commands'), ()))
>> -            else:
>> -                if name == 'shortlist':
>> -                    msg = _('use "hg help" for the full list of commands '
>> -                            'or "hg -v" for details')
>> -                elif name and not full:
>> -                    msg = _('use "hg help %s" to show the full help '
>> -                            'text') % name
>> -                else:
>> -                    msg = _('use "hg -v help%s" to show builtin aliases and '
>> -                            'global options') % (name and " " + name or "")
>> -                optlist.append((msg, ()))
>> -
>> -        if optlist:
>> -            for title, options in optlist:
>> -                rst.append('\n%s\n' % title)
>> -                if options:
>> -                    rst.append('\n%s\n' % optrst(options, ui.verbose))
>> -        return rst
>> -
>> -    def helptopic(name):
>> -        for names, header, doc in helptable:
>> -            if name in names:
>> -                break
>> -        else:
>> -            raise error.UnknownCommand(name)
>> -
>> -        rst = ["%s\n\n" % header]
>> -        # description
>> -        if not doc:
>> -            rst.append("    %s\n" % _("(no help text available)"))
>> -        if util.safehasattr(doc, '__call__'):
>> -            rst += ["    %s\n" % l for l in doc().splitlines()]
>> -
>> -        try:
>> -            import commands # avoid cycle
>> -            cmdutil.findcmd(name, commands.table)
>> -            rst.append(_('\nuse "hg help -c %s" to see help for '
>> -                       'the %s command\n') % (name, name))
>> -        except error.UnknownCommand:
>> -            pass
>> -        return rst
>> -
>> -    def helpext(name):
>> -        try:
>> -            mod = extensions.find(name)
>> -            doc = gettext(mod.__doc__) or _('no help text available')
>> -        except KeyError:
>> -            mod = None
>> -            doc = extensions.disabledext(name)
>> -            if not doc:
>> -                raise error.UnknownCommand(name)
>> -
>> -        if '\n' not in doc:
>> -            head, tail = doc, ""
>> -        else:
>> -            head, tail = doc.split('\n', 1)
>> -        rst = [_('%s extension - %s\n\n') % (name.split('.')[-1], head)]
>> -        if tail:
>> -            rst.extend(tail.splitlines(True))
>> -            rst.append('\n')
>> -
>> -        if mod:
>> -            try:
>> -                ct = mod.cmdtable
>> -            except AttributeError:
>> -                ct = {}
>> -            modcmds = set([c.split('|', 1)[0] for c in ct])
>> -            rst.extend(helplist(modcmds.__contains__))
>> -        else:
>> -            rst.append(_('use "hg help extensions" for information on enabling '
>> -                       'extensions\n'))
>> -        return rst
>> -
>> -    def helpextcmd(name):
>> -        cmd, ext, mod = extensions.disabledcmd(ui, name,
>> -                                               ui.configbool('ui', 'strict'))
>> -        doc = gettext(mod.__doc__).splitlines()[0]
>> -
>> -        rst = listexts(_("'%s' is provided by the following "
>> -                              "extension:") % cmd, {ext: doc}, indent=4)
>> -        rst.append('\n')
>> -        rst.append(_('use "hg help extensions" for information on enabling '
>> -                   'extensions\n'))
>> -        return rst
>> -
>> -
>> -    rst = []
>> -    kw = opts.get('keyword')
>> -    if kw:
>> -        matches = topicmatch(kw)
>> -        for t, title in (('topics', _('Topics')),
>> -                         ('commands', _('Commands')),
>> -                         ('extensions', _('Extensions')),
>> -                         ('extensioncommands', _('Extension Commands'))):
>> -            if matches[t]:
>> -                rst.append('%s:\n\n' % title)
>> -                rst.extend(minirst.maketable(sorted(matches[t]), 1))
>> -                rst.append('\n')
>> -    elif name and name != 'shortlist':
>> -        i = None
>> -        if unknowncmd:
>> -            queries = (helpextcmd,)
>> -        elif opts.get('extension'):
>> -            queries = (helpext,)
>> -        elif opts.get('command'):
>> -            queries = (helpcmd,)
>> -        else:
>> -            queries = (helptopic, helpcmd, helpext, helpextcmd)
>> -        for f in queries:
>> -            try:
>> -                rst = f(name)
>> -                i = None
>> -                break
>> -            except error.UnknownCommand, inst:
>> -                i = inst
>> -        if i:
>> -            raise i
>> -    else:
>> -        # program name
>> -        if not ui.quiet:
>> -            rst = [_("Mercurial Distributed SCM\n"), '\n']
>> -        rst.extend(helplist())
>> -
>> -    return rst
>> -
>> @command('help',
>>    [('e', 'extension', None, _('show only help for extensions')),
>>     ('c', 'command', None, _('show only help for commands')),
>> @@ -3385,7 +3095,7 @@
>>    """
>> 
>>    textwidth = min(ui.termwidth(), 80) - 2
>> -    rst = helprst(ui, textwidth, name, unknowncmd, full, **opts)
>> +    rst = help.helprst(ui, textwidth, name, unknowncmd, full, **opts)
>>    keep = ui.verbose and ['verbose'] or []
>>    formatted, pruned = minirst.format(''.join(rst), textwidth, keep=keep)
>>    ui.write(formatted)
>> diff -r 77d124b770d0 -r e53837e4d815 mercurial/help.py
>> --- a/mercurial/help.py    Tue Jun 26 23:18:09 2012 +0200
>> +++ b/mercurial/help.py    Tue Jun 26 23:18:09 2012 +0200
>> @@ -8,7 +8,7 @@
>> from i18n import gettext, _
>> import itertools, sys, os
>> import extensions, revset, fileset, templatekw, templatefilters, filemerge
>> -import encoding, util, minirst
>> +import encoding, util, minirst, error, cmdutil
>> 
>> def listexts(header, exts, indent=1):
>>    '''return a text listing of the given extensions'''
>> @@ -201,3 +201,293 @@
>> addtopicsymbols('revsets', '.. predicatesmarker', revset.symbols)
>> addtopicsymbols('templates', '.. keywordsmarker', templatekw.keywords)
>> addtopicsymbols('templates', '.. filtersmarker', templatefilters.filters)
>> +
>> +def helprst(ui, textwidth, name=None, unknowncmd=False, full=True, **opts):
>> +    """generate RST-formatted help for a given topic or a help overview
>> +
>> +    With no arguments, generate a list of commands with short help messages.
>> +
>> +    Given a topic, extension, or command name, generate help for that
>> +    topic.
>> +
>> +    Returns a list of strings which, when joined, forms the complete RST
>> +    help document.
>> +    """
>> +
>> +    def helpcmd(name):
>> +        import commands # avoid cycle
>> +        try:
>> +            aliases, entry = cmdutil.findcmd(name, commands.table,
>> +                    strict=unknowncmd)
>> +        except error.AmbiguousCommand, inst:
>> +            # py3k fix: except vars can't be used outside the scope of the
>> +            # except block, nor can be used inside a lambda. python issue4617
>> +            prefix = inst.args[0]
>> +            select = lambda c: c.lstrip('^').startswith(prefix)
>> +            rst = helplist(select)
>> +            return rst
>> +
>> +        rst = []
>> +
>> +        # check if it's an invalid alias and display its error if it is
>> +        if getattr(entry[0], 'badalias', False):
>> +            if not unknowncmd:
>> +                ui.pushbuffer()
>> +                entry[0](ui)
>> +                rst.append(ui.popbuffer())
>> +            return rst
>> +
>> +        # synopsis
>> +        if len(entry) > 2:
>> +            if entry[2].startswith('hg'):
>> +                rst.append("%s\n" % entry[2])
>> +            else:
>> +                rst.append('hg %s %s\n' % (aliases[0], entry[2]))
>> +        else:
>> +            rst.append('hg %s\n' % aliases[0])
>> +        # aliases
>> +        if full and not ui.quiet and len(aliases) > 1:
>> +            rst.append(_("\naliases: %s\n") % ', '.join(aliases[1:]))
>> +        rst.append('\n')
>> +
>> +        # description
>> +        doc = gettext(entry[0].__doc__)
>> +        if not doc:
>> +            doc = _("(no help text available)")
>> +        if util.safehasattr(entry[0], 'definition'):  # aliased command
>> +            if entry[0].definition.startswith('!'):  # shell alias
>> +                doc = _('shell alias for::\n\n    %s') % entry[0].definition[1:]
>> +            else:
>> +                doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
>> +        doc = doc.splitlines(True)
>> +        if ui.quiet or not full:
>> +            rst.append(doc[0])
>> +        else:
>> +            rst.extend(doc)
>> +        rst.append('\n')
>> +
>> +        # check if this command shadows a non-trivial (multi-line)
>> +        # extension


More information about the Mercurial-devel mailing list