[PATCH] help: 'hg help' supports subtopics (issue2804)

yun lee yun.lee.bj at gmail.com
Wed May 11 11:40:12 CDT 2011


2011/5/12 Yun Lee <yun.lee.bj at gmail.com>:
> # HG changeset patch
> # User Yun Lee <yun.lee.bj at gmail.com>
> # Date 1305131621 -28800
> # Branch stable
> # Node ID fb82249e4ef665eb2b23ff2a593a68d9b2c79947
> # Parent  89e7d35e0ef09ed3d9c9f6bbd2803c9c8639fcca
> help: 'hg help' supports subtopics (issue2804)
>
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 doc/gendoc.py
> --- a/doc/gendoc.py     Sun May 01 13:07:00 2011 +0200
> +++ b/doc/gendoc.py     Thu May 12 00:33:41 2011 +0800
> @@ -86,7 +86,7 @@
>     commandprinter(ui, table, subsection)
>
>     # print topics
> -    for names, sec, doc in helptable:
> +    for names, sec, doc, subtopics in helptable:
>         for name in names:
>             ui.write(".. _%s:\n" % name)
>         ui.write("\n")
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 mercurial/commands.py
> --- a/mercurial/commands.py     Sun May 01 13:07:00 2011 +0200
> +++ b/mercurial/commands.py     Thu May 12 00:33:41 2011 +0800
> @@ -2083,12 +2083,25 @@
>             addglobalopts(True)
>
>     def helptopic(name):
> -        for names, header, doc in help.helptable:
> -            if name in names:
> +        topic, subtopic = (name, None)
> +
> +        if '.' in name:
> +            topic, subtopic = name.split('.')
> +
> +        for topics, header, doc, subtopics in help.helptable:
> +            if topic in topics:
>                 break
> +            print topics
>         else:
>             raise error.UnknownCommand(name)
>
> +        if subtopic:
> +            for names, header, doc in subtopics:
> +                if subtopic in names:
> +                    break
> +            else:
> +                raise error.UnknownCommand(name)
> +
>         # description
>         if not doc:
>             doc = _("(no help text available)")
> @@ -2097,6 +2110,13 @@
>
>         ui.write("%s\n\n" % header)
>         ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
> +
> +        if not subtopic and subtopics:
> +            ui.write("\n\nsubtopics:\n\n")
> +
> +            for subtopicitem in subtopics:
> +                ui.write('  %-10s : %s\n' % (subtopicitem[0][0], subtopicitem[1]))
> +
>
>     def helpext(name):
>         try:
> @@ -2218,7 +2238,7 @@
>     if not name:
>         ui.write(_("\nadditional help topics:\n\n"))
>         topics = []
> -        for names, header, doc in help.helptable:
> +        for names, header, doc, subtopics in help.helptable:
>             topics.append((sorted(names, key=len, reverse=True)[0], header))
>         topics_len = max([len(s[0]) for s in topics])
>         for t, desc in topics:
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 mercurial/help.py
> --- a/mercurial/help.py Sun May 01 13:07:00 2011 +0200
> +++ b/mercurial/help.py Thu May 12 00:33:41 2011 +0800
> @@ -86,26 +86,53 @@
>
>     return loader
>
> +def loadsubdoc(topic, subtopic):
> +    def loader():
> +        if hasattr(sys, 'frozen'):
> +            module = sys.executable
> +        else:
> +            module = __file__
> +        base = os.path.dirname(module)
> +
> +        for dir in ('', '..', '.'):
> +            docdir = os.path.join(base, dir, 'help')
> +            if os.path.isdir(docdir):
> +                break
> +
> +        path = os.path.join(docdir, topic, subtopic + ".txt")
> +
> +        doc = gettext(open(path).read())
> +        for rewriter in helphooks.get(topic, []):
> +            doc = rewriter(topic, doc)
> +        return doc
> +
> +    return loader
> +
> +
>  helptable = [
> -    (["config", "hgrc"], _("Configuration Files"), loaddoc('config')),
> -    (["dates"], _("Date Formats"), loaddoc('dates')),
> -    (["patterns"], _("File Name Patterns"), loaddoc('patterns')),
> +    (["config", "hgrc"], _("Configuration Files"), loaddoc('config')
> +     , [(["alias"], _("Defines command aliases"), loadsubdoc('config', 'alias')),
> +        (["auth"], _("Defines  Authentication credentials"), loadsubdoc('config', 'auth')),
> +        (["defaults"], _("Defines command defaults"), loadsubdoc('config', 'defaults')),
> +        ]),
> +    (["dates"], _("Date Formats"), loaddoc('dates'), []),
> +    (["patterns"], _("File Name Patterns"), loaddoc('patterns'), []),
>     (['environment', 'env'], _('Environment Variables'),
> -     loaddoc('environment')),
> +     loaddoc('environment'), []),
>     (['revs', 'revisions'], _('Specifying Single Revisions'),
> -     loaddoc('revisions')),
> +     loaddoc('revisions'), []),
>     (['mrevs', 'multirevs'], _('Specifying Multiple Revisions'),
> -     loaddoc('multirevs')),
> -    (['revset', 'revsets'], _("Specifying Revision Sets"), loaddoc('revsets')),
> -    (['diffs'], _('Diff Formats'), loaddoc('diffs')),
> -    (['merge-tools'], _('Merge Tools'), loaddoc('merge-tools')),
> +     loaddoc('multirevs'), []),
> +    (['revset', 'revsets'], _("Specifying Revision Sets"), loaddoc('revsets'), []),
> +    (['diffs'], _('Diff Formats'), loaddoc('diffs'), []),
> +    (['merge-tools'], _('Merge Tools'), loaddoc('merge-tools'), []),
>     (['templating', 'templates'], _('Template Usage'),
> -     loaddoc('templates')),
> -    (['urls'], _('URL Paths'), loaddoc('urls')),
> -    (["extensions"], _("Using additional features"), extshelp),
> -    (["subrepo", "subrepos"], _("Subrepositories"), loaddoc('subrepos')),
> -    (["hgweb"], _("Configuring hgweb"), loaddoc('hgweb')),
> -    (["glossary"], _("Glossary"), loaddoc('glossary')),
> +     loaddoc('templates'), []),
> +    (['urls'], _('URL Paths'), loaddoc('urls'), []),
> +    (["extensions"], _("Using additional features"), extshelp, []),
> +    (["subrepo", "subrepos"], _("Subrepositories"), loaddoc('subrepos'), []),
> +    (["hgweb"], _("Configuring hgweb"), loaddoc('hgweb'), []),
> +    (["glossary"], _("Glossary"), loaddoc('glossary'), []),
>  ]
>
>  # Map topics to lists of callable taking the current topic help and
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 mercurial/help/config/alias.txt
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/mercurial/help/config/alias.txt   Thu May 12 00:33:41 2011 +0800
> @@ -0,0 +1,19 @@
> +Aliases allow you to define your own commands in terms of other
> +commands (or aliases), optionally including arguments.
> +
> +Alias definitions consist of lines of the form::
> +
> +    <alias> = <command> [<argument]...
> +
> +For example, this definition::
> +
> +    latest = log --limit 5
> +
> +creates a new command ``latest`` that shows only the five most recent
> +changesets. You can define subsequent aliases using earlier ones::
> +
> +    stable5 = latest -b stable
> +
> +.. note:: It is possible to create aliases with the same names as
> +   existing commands, which will then override the original
> +   definitions. This is almost always a bad idea!
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 mercurial/help/config/auth.txt
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/mercurial/help/config/auth.txt    Thu May 12 00:33:41 2011 +0800
> @@ -0,0 +1,55 @@
> +Authentication credentials for HTTP authentication. This section
> +allows you to store usernames and passwords for use when logging
> +*into* HTTP servers. See the web_ configuration section if you want to
> +configure *who* can login to your HTTP server.
> +
> +Each line has the following format::
> +
> +    <name>.<argument> = <value>
> +
> +where ``<name>`` is used to group arguments into authentication
> +entries. Example::
> +
> +    foo.prefix = hg.intevation.org/mercurial
> +    foo.username = foo
> +    foo.password = bar
> +    foo.schemes = http https
> +
> +    bar.prefix = secure.example.org
> +    bar.key = path/to/file.key
> +    bar.cert = path/to/file.cert
> +    bar.schemes = https
> +
> +Supported arguments:
> +
> +``prefix``
> +    Either ``*`` or a URI prefix with or without the scheme part.
> +    The authentication entry with the longest matching prefix is used
> +    (where ``*`` matches everything and counts as a match of length
> +    1). If the prefix doesn't include a scheme, the match is performed
> +    against the URI with its scheme stripped as well, and the schemes
> +    argument, q.v., is then subsequently consulted.
> +``username``
> +    Optional. Username to authenticate with. If not given, and the
> +    remote site requires basic or digest authentication, the user will
> +    be prompted for it. Environment variables are expanded in the
> +    username letting you do ``foo.username = $USER``.
> +``password``
> +    Optional. Password to authenticate with. If not given, and the
> +    remote site requires basic or digest authentication, the user
> +    will be prompted for it.
> +``key``
> +    Optional. PEM encoded client certificate key file. Environment
> +    variables are expanded in the filename.
> +``cert``
> +    Optional. PEM encoded client certificate chain file. Environment
> +    variables are expanded in the filename.
> +``schemes``
> +    Optional. Space separated list of URI schemes to use this
> +    authentication entry with. Only used if the prefix doesn't include
> +    a scheme. Supported schemes are http and https. They will match
> +    static-http and static-https respectively, as well.
> +    Default: https.
> +
> +If no suitable authentication entry is found, the user is prompted
> +for credentials as usual if required by the remote.
> \ No newline at end of file
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 mercurial/help/config/defaults.txt
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/mercurial/help/config/defaults.txt        Thu May 12 00:33:41 2011 +0800
> @@ -0,0 +1,15 @@
> +(defaults are deprecated. Don't use them. Use aliases instead)
> +
> +Use the ``[defaults]`` section to define command defaults, i.e. the
> +default options/arguments to pass to the specified commands.
> +
> +The following example makes :hg:`log` run in verbose mode, and
> +:hg:`status` show only the modified files, by default::
> +
> +  [defaults]
> +  log = -v
> +  status = -m
> +
> +The actual commands, instead of their aliases, must be used when
> +defining command defaults. The command defaults will also be applied
> +to the aliases of the commands defined.
> diff -r 89e7d35e0ef0 -r fb82249e4ef6 setup.py
> --- a/setup.py  Sun May 01 13:07:00 2011 +0200
> +++ b/setup.py  Thu May 12 00:33:41 2011 +0800
> @@ -350,7 +350,7 @@
>         packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
>
>  packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
> -                             'help/*.txt']}
> +                             'help/*.txt', 'help/*/*.txt']}
>
>  def ordinarypath(p):
>     return p and p[0] != '.' and p[-1] != '~'
>

This new patch can run well, and wish for your comments on it.

-- 
Yun Lee


More information about the Mercurial-devel mailing list