~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/doc_generate/autodoc_man.py

  • Committer: Martin Pool
  • Date: 2005-03-14 07:07:24 UTC
  • Revision ID: mbp@sourcefrog.net-20050314070724-ba6c85db7d96c508
- add setup.py and install instructions
- rename main script to just bzr

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
2
 
 
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
"""man.py - create man page from built-in bzr help and static text
18
 
 
19
 
TODO:
20
 
  * use usage information instead of simple "bzr foo" in COMMAND OVERVIEW
21
 
  * add command aliases
22
 
"""
23
 
 
24
 
from __future__ import absolute_import
25
 
 
26
 
PLUGINS_TO_DOCUMENT = ["launchpad"]
27
 
 
28
 
import textwrap
29
 
import time
30
 
 
31
 
import bzrlib
32
 
import bzrlib.help
33
 
import bzrlib.help_topics
34
 
import bzrlib.commands
35
 
 
36
 
from bzrlib.plugin import load_plugins
37
 
load_plugins()
38
 
 
39
 
 
40
 
def get_filename(options):
41
 
    """Provides name of manpage"""
42
 
    return "%s.1" % (options.bzr_name)
43
 
 
44
 
 
45
 
def infogen(options, outfile):
46
 
    """Assembles a man page"""
47
 
    t = time.time()
48
 
    tt = time.gmtime(t)
49
 
    params = \
50
 
           { "bzrcmd": options.bzr_name,
51
 
             "datestamp": time.strftime("%Y-%m-%d",tt),
52
 
             "timestamp": time.strftime("%Y-%m-%d %H:%M:%S +0000",tt),
53
 
             "version": bzrlib.__version__,
54
 
             }
55
 
    outfile.write(man_preamble % params)
56
 
    outfile.write(man_escape(man_head % params))
57
 
    outfile.write(man_escape(getcommand_list(params)))
58
 
    outfile.write(man_escape(getcommand_help(params)))
59
 
    outfile.write("".join(environment_variables()))
60
 
    outfile.write(man_escape(man_foot % params))
61
 
 
62
 
 
63
 
def man_escape(string):
64
 
    """Escapes strings for man page compatibility"""
65
 
    result = string.replace("\\","\\\\")
66
 
    result = result.replace("`","\\'")
67
 
    result = result.replace("'","\\*(Aq")
68
 
    result = result.replace("-","\\-")
69
 
    return result
70
 
 
71
 
 
72
 
def command_name_list():
73
 
    """Builds a list of command names from bzrlib"""
74
 
    command_names = bzrlib.commands.builtin_command_names()
75
 
    for cmdname in bzrlib.commands.plugin_command_names():
76
 
        cmd_object = bzrlib.commands.get_cmd_object(cmdname)
77
 
        if (PLUGINS_TO_DOCUMENT is None or
78
 
            cmd_object.plugin_name() in PLUGINS_TO_DOCUMENT):
79
 
            command_names.append(cmdname)
80
 
    command_names.sort()
81
 
    return command_names
82
 
 
83
 
 
84
 
def getcommand_list (params):
85
 
    """Builds summary help for command names in manpage format"""
86
 
    bzrcmd = params["bzrcmd"]
87
 
    output = '.SH "COMMAND OVERVIEW"\n'
88
 
    for cmd_name in command_name_list():
89
 
        cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
90
 
        if cmd_object.hidden:
91
 
            continue
92
 
        cmd_help = cmd_object.help()
93
 
        if cmd_help:
94
 
            firstline = cmd_help.split('\n', 1)[0]
95
 
            usage = cmd_object._usage()
96
 
            tmp = '.TP\n.B "%s"\n%s\n' % (usage, firstline)
97
 
            output = output + tmp
98
 
        else:
99
 
            raise RuntimeError, "Command '%s' has no help text" % (cmd_name)
100
 
    return output
101
 
 
102
 
 
103
 
def getcommand_help(params):
104
 
    """Shows individual options for a bzr command"""
105
 
    output='.SH "COMMAND REFERENCE"\n'
106
 
    formatted = {}
107
 
    for cmd_name in command_name_list():
108
 
        cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
109
 
        if cmd_object.hidden:
110
 
            continue
111
 
        formatted[cmd_name] = format_command(params, cmd_object)
112
 
        for alias in cmd_object.aliases:
113
 
            formatted[alias] = format_alias(params, alias, cmd_name)
114
 
    for cmd_name in sorted(formatted):
115
 
        output += formatted[cmd_name]
116
 
    return output
117
 
 
118
 
 
119
 
def format_command(params, cmd):
120
 
    """Provides long help for each public command"""
121
 
    subsection_header = '.SS "%s"\n' % (cmd._usage())
122
 
    doc = "%s\n" % (cmd.__doc__)
123
 
    doc = bzrlib.help_topics.help_as_plain_text(cmd.help())
124
 
 
125
 
    # A dot at the beginning of a line is interpreted as a macro.
126
 
    # Simply join lines that begin with a dot with the previous
127
 
    # line to work around this.
128
 
    doc = doc.replace("\n.", ".")
129
 
 
130
 
    option_str = ""
131
 
    options = cmd.options()
132
 
    if options:
133
 
        option_str = "\nOptions:\n"
134
 
        for option_name, option in sorted(options.items()):
135
 
            for name, short_name, argname, help in option.iter_switches():
136
 
                if option.is_hidden(name):
137
 
                    continue
138
 
                l = '    --' + name
139
 
                if argname is not None:
140
 
                    l += ' ' + argname
141
 
                if short_name:
142
 
                    l += ', -' + short_name
143
 
                l += (30 - len(l)) * ' ' + (help or '')
144
 
                wrapped = textwrap.fill(l, initial_indent='',
145
 
                    subsequent_indent=30*' ',
146
 
                    break_long_words=False,
147
 
                    )
148
 
                option_str += wrapped + '\n'
149
 
 
150
 
    aliases_str = ""
151
 
    if cmd.aliases:
152
 
        if len(cmd.aliases) > 1:
153
 
            aliases_str += '\nAliases: '
154
 
        else:
155
 
            aliases_str += '\nAlias: '
156
 
        aliases_str += ', '.join(cmd.aliases)
157
 
        aliases_str += '\n'
158
 
 
159
 
    see_also_str = ""
160
 
    see_also = cmd.get_see_also()
161
 
    if see_also:
162
 
        see_also_str += '\nSee also: '
163
 
        see_also_str += ', '.join(see_also)
164
 
        see_also_str += '\n'
165
 
 
166
 
    return subsection_header + option_str + aliases_str + see_also_str + "\n" + doc + "\n"
167
 
 
168
 
 
169
 
def format_alias(params, alias, cmd_name):
170
 
    help = '.SS "bzr %s"\n' % alias
171
 
    help += 'Alias for "%s", see "bzr %s".\n' % (cmd_name, cmd_name)
172
 
    return help
173
 
 
174
 
 
175
 
def environment_variables():
176
 
    yield ".SH \"ENVIRONMENT\"\n"
177
 
 
178
 
    from bzrlib.help_topics import known_env_variables
179
 
    for k, desc in known_env_variables:
180
 
        yield ".TP\n"
181
 
        yield ".I \"%s\"\n" % k
182
 
        yield man_escape(desc) + "\n"
183
 
 
184
 
 
185
 
man_preamble = """\
186
 
.\\\"Man page for Bazaar (%(bzrcmd)s)
187
 
.\\\"
188
 
.\\\" Large parts of this file are autogenerated from the output of
189
 
.\\\"     \"%(bzrcmd)s help commands\"
190
 
.\\\"     \"%(bzrcmd)s help <cmd>\"
191
 
.\\\"
192
 
 
193
 
.ie \\n(.g .ds Aq \\(aq
194
 
.el .ds Aq '
195
 
"""
196
 
 
197
 
 
198
 
man_head = """\
199
 
.TH bzr 1 "%(datestamp)s" "%(version)s" "Bazaar"
200
 
.SH "NAME"
201
 
%(bzrcmd)s - Bazaar next-generation distributed version control
202
 
.SH "SYNOPSIS"
203
 
.B "%(bzrcmd)s"
204
 
.I "command"
205
 
[
206
 
.I "command_options"
207
 
]
208
 
.br
209
 
.B "%(bzrcmd)s"
210
 
.B "help"
211
 
.br
212
 
.B "%(bzrcmd)s"
213
 
.B "help"
214
 
.I "command"
215
 
.SH "DESCRIPTION"
216
 
 
217
 
Bazaar (or %(bzrcmd)s) is a distributed version control system that is powerful, 
218
 
friendly, and scalable.  Bazaar is a project of Canonical Ltd and part of 
219
 
the GNU Project to develop a free operating system.
220
 
 
221
 
Bazaar keeps track of changes to software source code (or similar information);
222
 
lets you explore who changed it, when, and why; merges concurrent changes; and
223
 
helps people work together in a team.
224
 
"""
225
 
 
226
 
man_foot = """\
227
 
.SH "FILES"
228
 
.TP
229
 
.I "~/.bazaar/bazaar.conf"
230
 
Contains the user's default configuration. The section
231
 
.B [DEFAULT]
232
 
is used to define general configuration that will be applied everywhere.
233
 
The section
234
 
.B [ALIASES]
235
 
can be used to create command aliases for
236
 
commonly used options.
237
 
 
238
 
A typical config file might look something like:
239
 
 
240
 
.br
241
 
[DEFAULT]
242
 
.br
243
 
email=John Doe <jdoe@isp.com>
244
 
.br
245
 
[ALIASES]
246
 
.br
247
 
commit = commit --strict
248
 
.br
249
 
log10 = log --short -r -10..-1
250
 
.SH "SEE ALSO"
251
 
.UR http://bazaar.canonical.com/
252
 
.BR http://bazaar.canonical.com/
253
 
"""
254