/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: Andrew Bennetts
  • Date: 2009-10-21 11:13:40 UTC
  • mto: This revision was merged to the branch mainline in revision 4762.
  • Revision ID: andrew.bennetts@canonical.com-20091021111340-w7x4d5yf83qwjncc
Add test that WSGI glue allows request handlers to access paths above that request's. backing transport, so long as it is within the WSGI app's backing transport.

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
24
22
# TODO: `help commands --all` should show hidden commands
25
23
 
26
24
import sys
 
25
import textwrap
27
26
 
28
 
from . import (
 
27
from bzrlib import (
29
28
    commands as _mod_commands,
30
29
    errors,
31
30
    help_topics,
32
31
    osutils,
33
32
    plugin,
34
 
    ui,
35
 
    utextwrap,
 
33
    symbol_versioning,
36
34
    )
37
35
 
38
36
 
39
 
class NoHelpTopic(errors.BzrError):
40
 
 
41
 
    _fmt = ("No help could be found for '%(topic)s'. "
42
 
        "Please use 'brz help topics' to obtain a list of topics.")
43
 
 
44
 
    def __init__(self, topic):
45
 
        self.topic = topic
46
 
 
47
 
 
48
37
def help(topic=None, outfile=None):
49
38
    """Write the help for the specific topic to outfile"""
50
39
    if outfile is None:
51
 
        outfile = ui.ui_factory.make_output_stream()
 
40
        outfile = sys.stdout
52
41
 
53
42
    indices = HelpIndices()
54
43
 
56
45
    try:
57
46
        topics = indices.search(topic)
58
47
        shadowed_terms = []
59
 
        for index, topic_obj in topics[1:]:
 
48
        for index, topic in topics[1:]:
60
49
            shadowed_terms.append('%s%s' % (index.prefix,
61
 
                topic_obj.get_help_topic()))
 
50
                topic.get_help_topic()))
62
51
        source = topics[0][1]
63
52
        outfile.write(source.get_help_text(shadowed_terms))
64
 
    except NoHelpTopic:
 
53
    except errors.NoHelpTopic:
65
54
        if alias is None:
66
55
            raise
67
56
 
68
57
    if alias is not None:
69
 
        outfile.write("'brz %s' is an alias for 'brz %s'.\n" % (topic,
 
58
        outfile.write("'bzr %s' is an alias for 'bzr %s'.\n" % (topic,
70
59
            " ".join(alias)))
71
60
 
72
61
 
73
62
def help_commands(outfile=None):
74
63
    """List all commands"""
75
64
    if outfile is None:
76
 
        outfile = ui.ui_factory.make_output_stream()
 
65
        outfile = sys.stdout
77
66
    outfile.write(_help_commands_to_text('commands'))
78
67
 
79
68
 
89
78
    shown_commands = [(n, o) for n, o in commands if o.hidden == hidden]
90
79
    max_name = max(len(n) for n, o in shown_commands)
91
80
    indent = ' ' * (max_name + 1)
92
 
    width = osutils.terminal_width()
93
 
    if width is None:
94
 
        width = osutils.default_terminal_width
95
 
    # we need one extra space for terminals that wrap on last char
96
 
    width = width - 1
 
81
    width = osutils.terminal_width() - 1
97
82
 
98
83
    for cmd_name, cmd_object in sorted(shown_commands):
99
84
        plugin_name = cmd_object.plugin_name()
108
93
        else:
109
94
            firstline = ''
110
95
        helpstring = '%-*s %s%s' % (max_name, cmd_name, firstline, plugin_name)
111
 
        lines = utextwrap.wrap(
 
96
        lines = textwrap.wrap(
112
97
            helpstring, subsequent_indent=indent,
113
98
            width=width,
114
99
            break_long_words=False)
147
132
            help_topics.HelpTopicIndex(),
148
133
            _mod_commands.HelpCommandIndex(),
149
134
            plugin.PluginsHelpIndex(),
150
 
            help_topics.ConfigOptionHelpIndex(),
151
135
            ]
152
136
 
153
137
    def _check_prefix_uniqueness(self):
154
138
        """Ensure that the index collection is able to differentiate safely."""
155
 
        prefixes = set()
 
139
        prefixes = {}
156
140
        for index in self.search_path:
157
 
            prefix = index.prefix
158
 
            if prefix in prefixes:
 
141
            prefixes.setdefault(index.prefix, []).append(index)
 
142
        for prefix, indices in prefixes.items():
 
143
            if len(indices) > 1:
159
144
                raise errors.DuplicateHelpPrefix(prefix)
160
 
            prefixes.add(prefix)
161
145
 
162
146
    def search(self, topic):
163
147
        """Search for topic across the help search path.
171
155
        for index in self.search_path:
172
156
            result.extend([(index, _topic) for _topic in index.get_topics(topic)])
173
157
        if not result:
174
 
            raise NoHelpTopic(topic)
 
158
            raise errors.NoHelpTopic(topic)
175
159
        else:
176
160
            return result