~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/doc_generate/autodoc_man.py

  • Committer: Martin Pool
  • Date: 2005-05-03 07:48:54 UTC
  • Revision ID: mbp@sourcefrog.net-20050503074854-adb6f9d6382e27a9
- sketchy experiments in bash and zsh completion

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2005 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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
 
import os
25
 
import sys
26
 
import textwrap
27
 
import time
28
 
 
29
 
import bzrlib
30
 
import bzrlib.help
31
 
import bzrlib.commands
32
 
 
33
 
 
34
 
def get_filename(options):
35
 
    """Provides name of manpage"""
36
 
    return "%s.1" % (options.bzr_name)
37
 
 
38
 
 
39
 
def infogen(options, outfile):
40
 
    """Assembles a man page"""
41
 
    t = time.time()
42
 
    tt = time.gmtime(t)
43
 
    params = \
44
 
           { "bzrcmd": options.bzr_name,
45
 
             "datestamp": time.strftime("%Y-%m-%d",tt),
46
 
             "timestamp": time.strftime("%Y-%m-%d %H:%M:%S +0000",tt),
47
 
             "version": bzrlib.__version__,
48
 
             }
49
 
    outfile.write(man_preamble % params)
50
 
    outfile.write(man_escape(man_head % params))
51
 
    outfile.write(man_escape(getcommand_list(params)))
52
 
    outfile.write(man_escape(getcommand_help(params)))
53
 
    outfile.write(man_escape(man_foot % params))
54
 
 
55
 
 
56
 
def man_escape(string):
57
 
    """Escapes strings for man page compatibility"""
58
 
    result = string.replace("\\","\\\\")
59
 
    result = result.replace("`","\\`")
60
 
    result = result.replace("'","\\'")
61
 
    result = result.replace("-","\\-")
62
 
    return result
63
 
 
64
 
 
65
 
def command_name_list():
66
 
    """Builds a list of command names from bzrlib"""
67
 
    command_names = bzrlib.commands.builtin_command_names()
68
 
    command_names.sort()
69
 
    return command_names
70
 
 
71
 
 
72
 
def getcommand_list (params):
73
 
    """Builds summary help for command names in manpage format"""
74
 
    bzrcmd = params["bzrcmd"]
75
 
    output = '.SH "COMMAND OVERVIEW"\n'
76
 
    for cmd_name in command_name_list():
77
 
        cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
78
 
        if cmd_object.hidden:
79
 
            continue
80
 
        cmd_help = cmd_object.help()
81
 
        if cmd_help:
82
 
            firstline = cmd_help.split('\n', 1)[0]
83
 
            usage = bzrlib.help.command_usage(cmd_object)
84
 
            tmp = '.TP\n.B "%s"\n%s\n' % (usage, firstline)
85
 
            output = output + tmp
86
 
        else:
87
 
            raise RuntimeError, "Command '%s' has no help text" % (cmd_name)
88
 
    return output
89
 
 
90
 
 
91
 
def getcommand_help(params):
92
 
    """Shows individual options for a bzr command"""
93
 
    output='.SH "COMMAND REFERENCE"\n'
94
 
    for cmd_name in command_name_list():
95
 
        cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
96
 
        if cmd_object.hidden:
97
 
            continue
98
 
        output = output + format_command(params, cmd_object)
99
 
    return output
100
 
 
101
 
 
102
 
def format_command (params, cmd):
103
 
    """Provides long help for each public command"""
104
 
    subsection_header = '.SS "%s"\n' % (bzrlib.help.command_usage(cmd))
105
 
    doc = "%s\n" % (cmd.__doc__)
106
 
    docsplit = cmd.__doc__.split('\n')
107
 
    doc = '\n'.join([docsplit[0]] + [line[4:] for line in docsplit[1:]])
108
 
 
109
 
    option_str = ""
110
 
    options = cmd.options()
111
 
    if options:
112
 
        option_str = "\nOptions:\n"
113
 
        for option_name, option in sorted(options.items()):
114
 
            l = '    --' + option_name
115
 
            if option.type is not None:
116
 
                l += ' ' + option.argname.upper()
117
 
            short_name = option.short_name()
118
 
            if short_name:
119
 
                assert len(short_name) == 1
120
 
                l += ', -' + short_name
121
 
            l += (30 - len(l)) * ' ' + option.help
122
 
            # TODO: Split help over multiple lines with
123
 
            # correct indenting and wrapping.
124
 
            wrapped = textwrap.fill(l, initial_indent='',
125
 
                                    subsequent_indent=30*' ')
126
 
            option_str = option_str + wrapped + '\n'       
127
 
 
128
 
    aliases_str = ""
129
 
    if cmd.aliases:
130
 
        if len(cmd.aliases) > 1:
131
 
            aliases_str += '\nAliases: '
132
 
        else:
133
 
            aliases_str += '\nAlias: '
134
 
        aliases_str += ', '.join(cmd.aliases)
135
 
        aliases_str += '\n'
136
 
 
137
 
    return subsection_header + option_str + aliases_str + "\n" + doc + "\n"
138
 
 
139
 
 
140
 
man_preamble = """\
141
 
Man page for %(bzrcmd)s (bazaar-ng)
142
 
.\\\"
143
 
.\\\" Large parts of this file are autogenerated from the output of
144
 
.\\\"     \"%(bzrcmd)s help commands\"
145
 
.\\\"     \"%(bzrcmd)s help <cmd>\"
146
 
.\\\"
147
 
.\\\" Generation time: %(timestamp)s
148
 
.\\\"
149
 
"""
150
 
 
151
 
 
152
 
man_head = """\
153
 
.TH bzr 1 "%(datestamp)s" "%(version)s" "bazaar-ng"
154
 
.SH "NAME"
155
 
%(bzrcmd)s - bazaar-ng next-generation distributed version control
156
 
.SH "SYNOPSIS"
157
 
.B "%(bzrcmd)s"
158
 
.I "command"
159
 
[
160
 
.I "command_options"
161
 
]
162
 
.br
163
 
.B "%(bzrcmd)s"
164
 
.B "help"
165
 
.br
166
 
.B "%(bzrcmd)s"
167
 
.B "help"
168
 
.I "command"
169
 
.SH "DESCRIPTION"
170
 
bazaar-ng (or
171
 
.B "%(bzrcmd)s"
172
 
) is a project of Canonical to develop an open source distributed version control system that is powerful, friendly, and scalable. Version control means a system that keeps track of previous revisions of software source code or similar information and helps people work on it in teams.
173
 
"""
174
 
 
175
 
man_foot = """\
176
 
.SH "ENVIRONMENT"
177
 
.TP
178
 
.I "BZRPATH"
179
 
Path where
180
 
.B "%(bzrcmd)s"
181
 
is to look for external command.
182
 
.TP
183
 
.I "BZREMAIL"
184
 
E-Mail address of the user. Overrides default user config.
185
 
.TP
186
 
.I "EMAIL"
187
 
E-Mail address of the user. Overriddes default user config.
188
 
.TP
189
 
.I "BZR_EDITOR"
190
 
Editor for editing commit messages
191
 
.TP
192
 
.I "EDITOR"
193
 
Editor for editing commit messages
194
 
.TP
195
 
.I "BZR_PLUGIN_PATH"
196
 
Paths where bzr should look for plugins
197
 
.TP
198
 
.I "BZR_HOME"
199
 
Home directory for bzr
200
 
.SH "FILES"
201
 
.TP
202
 
.I "~/.bazaar/bazaar.conf"
203
 
Contains the default user config. At least one section, [DEFAULT] is required.
204
 
A typical default config file may be similiar to:
205
 
.br
206
 
.br
207
 
.B [DEFAULT]
208
 
.br
209
 
.B email=John Doe <jdoe@isp.com>
210
 
.SH "SEE ALSO"
211
 
.UR http://www.bazaar-vcs.org/
212
 
.BR http://www.bazaar-vcs.org/
213
 
"""
214