/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/help.py

  • Committer: Sabin Iacob
  • Date: 2009-03-23 14:59:43 UTC
  • mto: (4189.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4193.
  • Revision ID: iacobs@m0n5t3r.info-20090323145943-3s3p1px5q1rkh2e5
update FSF mailing address

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2004, 2005, 2006 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
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
from __future__ import absolute_import
18
 
 
19
17
# TODO: Some way to get a list of external commands (defined by shell
20
18
# scripts) so that they can be included in the help listing as well.
21
19
# It should be enough to just list the plugin directory and look for
23
21
 
24
22
# TODO: `help commands --all` should show hidden commands
25
23
 
26
 
from . import (
 
24
import sys
 
25
import textwrap
 
26
 
 
27
from bzrlib import (
27
28
    commands as _mod_commands,
28
29
    errors,
29
30
    help_topics,
30
31
    osutils,
31
32
    plugin,
32
 
    ui,
33
 
    utextwrap,
 
33
    symbol_versioning,
34
34
    )
35
35
 
36
36
 
37
 
class NoHelpTopic(errors.BzrError):
38
 
 
39
 
    _fmt = ("No help could be found for '%(topic)s'. "
40
 
            "Please use 'brz help topics' to obtain a list of topics.")
41
 
 
42
 
    def __init__(self, topic):
43
 
        self.topic = topic
44
 
 
45
 
 
46
37
def help(topic=None, outfile=None):
47
38
    """Write the help for the specific topic to outfile"""
48
39
    if outfile is None:
49
 
        outfile = ui.ui_factory.make_output_stream()
 
40
        outfile = sys.stdout
50
41
 
51
42
    indices = HelpIndices()
52
43
 
54
45
    try:
55
46
        topics = indices.search(topic)
56
47
        shadowed_terms = []
57
 
        for index, topic_obj in topics[1:]:
 
48
        for index, topic in topics[1:]:
58
49
            shadowed_terms.append('%s%s' % (index.prefix,
59
 
                                            topic_obj.get_help_topic()))
 
50
                topic.get_help_topic()))
60
51
        source = topics[0][1]
61
52
        outfile.write(source.get_help_text(shadowed_terms))
62
 
    except NoHelpTopic:
 
53
    except errors.NoHelpTopic:
63
54
        if alias is None:
64
55
            raise
65
56
 
66
57
    if alias is not None:
67
 
        outfile.write("'brz %s' is an alias for 'brz %s'.\n" % (topic,
68
 
                                                                " ".join(alias)))
 
58
        outfile.write("'bzr %s' is an alias for 'bzr %s'.\n" % (topic,
 
59
            " ".join(alias)))
69
60
 
70
61
 
71
62
def help_commands(outfile=None):
72
63
    """List all commands"""
73
64
    if outfile is None:
74
 
        outfile = ui.ui_factory.make_output_stream()
 
65
        outfile = sys.stdout
75
66
    outfile.write(_help_commands_to_text('commands'))
76
67
 
77
68
 
82
73
        hidden = True
83
74
    else:
84
75
        hidden = False
85
 
    names = list(_mod_commands.all_command_names())
 
76
    names = set(_mod_commands.builtin_command_names()) # to eliminate duplicates
 
77
    names.update(_mod_commands.plugin_command_names())
86
78
    commands = ((n, _mod_commands.get_cmd_object(n)) for n in names)
87
79
    shown_commands = [(n, o) for n, o in commands if o.hidden == hidden]
88
80
    max_name = max(len(n) for n, o in shown_commands)
89
81
    indent = ' ' * (max_name + 1)
90
 
    width = osutils.terminal_width()
91
 
    if width is None:
92
 
        width = osutils.default_terminal_width
93
 
    # we need one extra space for terminals that wrap on last char
94
 
    width = width - 1
 
82
    width = osutils.terminal_width() - 1
95
83
 
96
84
    for cmd_name, cmd_object in sorted(shown_commands):
97
85
        plugin_name = cmd_object.plugin_name()
106
94
        else:
107
95
            firstline = ''
108
96
        helpstring = '%-*s %s%s' % (max_name, cmd_name, firstline, plugin_name)
109
 
        lines = utextwrap.wrap(
110
 
            helpstring, subsequent_indent=indent,
111
 
            width=width,
112
 
            break_long_words=False)
 
97
        lines = textwrap.wrap(helpstring, subsequent_indent=indent,
 
98
                              width=width)
113
99
        for line in lines:
114
100
            out.append(line + '\n')
115
101
    return ''.join(out)
145
131
            help_topics.HelpTopicIndex(),
146
132
            _mod_commands.HelpCommandIndex(),
147
133
            plugin.PluginsHelpIndex(),
148
 
            help_topics.ConfigOptionHelpIndex(),
149
134
            ]
150
135
 
151
136
    def _check_prefix_uniqueness(self):
152
137
        """Ensure that the index collection is able to differentiate safely."""
153
 
        prefixes = set()
 
138
        prefixes = {}
154
139
        for index in self.search_path:
155
 
            prefix = index.prefix
156
 
            if prefix in prefixes:
 
140
            prefixes.setdefault(index.prefix, []).append(index)
 
141
        for prefix, indices in prefixes.items():
 
142
            if len(indices) > 1:
157
143
                raise errors.DuplicateHelpPrefix(prefix)
158
 
            prefixes.add(prefix)
159
144
 
160
145
    def search(self, topic):
161
146
        """Search for topic across the help search path.
167
152
        self._check_prefix_uniqueness()
168
153
        result = []
169
154
        for index in self.search_path:
170
 
            result.extend([(index, _topic)
171
 
                           for _topic in index.get_topics(topic)])
 
155
            result.extend([(index, _topic) for _topic in index.get_topics(topic)])
172
156
        if not result:
173
 
            raise NoHelpTopic(topic)
 
157
            raise errors.NoHelpTopic(topic)
174
158
        else:
175
159
            return result