~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/help.py

  • Committer: Tarmac
  • Author(s): Vincent Ladeuil
  • Date: 2017-01-30 14:42:05 UTC
  • mfrom: (6620.1.1 trunk)
  • Revision ID: tarmac-20170130144205-r8fh2xpmiuxyozpv
Merge  2.7 into trunk including fix for bug #1657238 [r=vila]

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
from __future__ import absolute_import
16
18
 
17
19
# TODO: Some way to get a list of external commands (defined by shell
18
20
# scripts) so that they can be included in the help listing as well.
22
24
# TODO: `help commands --all` should show hidden commands
23
25
 
24
26
import sys
25
 
import textwrap
26
27
 
27
28
from bzrlib import (
28
29
    commands as _mod_commands,
30
31
    help_topics,
31
32
    osutils,
32
33
    plugin,
33
 
    symbol_versioning,
 
34
    ui,
 
35
    utextwrap,
34
36
    )
35
37
 
36
38
 
37
39
def help(topic=None, outfile=None):
38
40
    """Write the help for the specific topic to outfile"""
39
41
    if outfile is None:
40
 
        outfile = sys.stdout
 
42
        outfile = ui.ui_factory.make_output_stream()
41
43
 
42
44
    indices = HelpIndices()
43
 
    topics = indices.search(topic)
44
 
    shadowed_terms = []
45
 
    for index, topic in topics[1:]:
46
 
        shadowed_terms.append('%s%s' % (index.prefix, topic.get_help_topic()))
47
 
    outfile.write(topics[0][1].get_help_text(shadowed_terms))
 
45
 
 
46
    alias = _mod_commands.get_alias(topic)
 
47
    try:
 
48
        topics = indices.search(topic)
 
49
        shadowed_terms = []
 
50
        for index, topic_obj in topics[1:]:
 
51
            shadowed_terms.append('%s%s' % (index.prefix,
 
52
                topic_obj.get_help_topic()))
 
53
        source = topics[0][1]
 
54
        outfile.write(source.get_help_text(shadowed_terms))
 
55
    except errors.NoHelpTopic:
 
56
        if alias is None:
 
57
            raise
 
58
 
 
59
    if alias is not None:
 
60
        outfile.write("'bzr %s' is an alias for 'bzr %s'.\n" % (topic,
 
61
            " ".join(alias)))
48
62
 
49
63
 
50
64
def help_commands(outfile=None):
51
65
    """List all commands"""
52
66
    if outfile is None:
53
 
        outfile = sys.stdout
 
67
        outfile = ui.ui_factory.make_output_stream()
54
68
    outfile.write(_help_commands_to_text('commands'))
55
69
 
56
70
 
57
 
@symbol_versioning.deprecated_function(symbol_versioning.zero_sixteen)
58
 
def command_usage(cmd):
59
 
    return cmd._usage()
60
 
 
61
 
 
62
71
def _help_commands_to_text(topic):
63
72
    """Generate the help text for the list of commands"""
64
73
    out = []
66
75
        hidden = True
67
76
    else:
68
77
        hidden = False
69
 
    names = set(_mod_commands.builtin_command_names()) # to eliminate duplicates
70
 
    names.update(_mod_commands.plugin_command_names())
 
78
    names = list(_mod_commands.all_command_names())
71
79
    commands = ((n, _mod_commands.get_cmd_object(n)) for n in names)
72
80
    shown_commands = [(n, o) for n, o in commands if o.hidden == hidden]
73
81
    max_name = max(len(n) for n, o in shown_commands)
74
82
    indent = ' ' * (max_name + 1)
75
 
    width = osutils.terminal_width() - 1
 
83
    width = osutils.terminal_width()
 
84
    if width is None:
 
85
        width = osutils.default_terminal_width
 
86
    # we need one extra space for terminals that wrap on last char
 
87
    width = width - 1
76
88
 
77
89
    for cmd_name, cmd_object in sorted(shown_commands):
78
90
        plugin_name = cmd_object.plugin_name()
87
99
        else:
88
100
            firstline = ''
89
101
        helpstring = '%-*s %s%s' % (max_name, cmd_name, firstline, plugin_name)
90
 
        lines = textwrap.wrap(helpstring, subsequent_indent=indent,
91
 
                              width=width)
 
102
        lines = utextwrap.wrap(
 
103
            helpstring, subsequent_indent=indent,
 
104
            width=width,
 
105
            break_long_words=False)
92
106
        for line in lines:
93
107
            out.append(line + '\n')
94
108
    return ''.join(out)
96
110
 
97
111
help_topics.topic_registry.register("commands",
98
112
                                    _help_commands_to_text,
99
 
                                    "Basic help for all commands")
 
113
                                    "Basic help for all commands",
 
114
                                    help_topics.SECT_HIDDEN)
100
115
help_topics.topic_registry.register("hidden-commands",
101
116
                                    _help_commands_to_text,
102
 
                                    "All hidden commands")
 
117
                                    "All hidden commands",
 
118
                                    help_topics.SECT_HIDDEN)
103
119
 
104
120
 
105
121
class HelpIndices(object):
106
122
    """Maintainer of help topics across multiple indices.
107
 
    
 
123
 
108
124
    It is currently separate to the HelpTopicRegistry because of its ordered
109
125
    nature, but possibly we should instead structure it as a search within the
110
126
    registry and add ordering and searching facilities to the registry. The
122
138
            help_topics.HelpTopicIndex(),
123
139
            _mod_commands.HelpCommandIndex(),
124
140
            plugin.PluginsHelpIndex(),
 
141
            help_topics.ConfigOptionHelpIndex(),
125
142
            ]
126
143
 
127
144
    def _check_prefix_uniqueness(self):
135
152
 
136
153
    def search(self, topic):
137
154
        """Search for topic across the help search path.
138
 
        
 
155
 
139
156
        :param topic: A string naming the help topic to search for.
140
157
        :raises: NoHelpTopic if none of the indexs in search_path have topic.
141
158
        :return: A list of HelpTopics which matched 'topic'.