~bzr-pqm/bzr/bzr.dev

1551.3.11 by Aaron Bentley
Merge from Robert
1
# Copyright 2005 Canonical Ltd.
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
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
1551.3.11 by Aaron Bentley
Merge from Robert
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
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
27
import time
1551.3.11 by Aaron Bentley
Merge from Robert
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))
1185.74.4 by James Blackwell
Give long help with command on man page
54
1185.75.1 by Hans Ulrich Niedermann
Start implementing general doc generation plan:
55
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
56
def man_escape(string):
1551.3.11 by Aaron Bentley
Merge from Robert
57
    """Escapes strings for man page compatibility"""
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
58
    result = string.replace("\\","\\\\")
59
    result = result.replace("`","\\`")
60
    result = result.replace("'","\\'")
61
    result = result.replace("-","\\-")
62
    return result
1185.75.1 by Hans Ulrich Niedermann
Start implementing general doc generation plan:
63
64
1551.3.11 by Aaron Bentley
Merge from Robert
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]
2432.1.33 by Robert Collins
Fix tests broken by deprecation of help.command_usage.
83
            usage = cmd_object._usage()
1551.3.11 by Aaron Bentley
Merge from Robert
84
            tmp = '.TP\n.B "%s"\n%s\n' % (usage, firstline)
85
            output = output + tmp
1185.75.1 by Hans Ulrich Niedermann
Start implementing general doc generation plan:
86
        else:
1551.3.11 by Aaron Bentley
Merge from Robert
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"""
2432.1.33 by Robert Collins
Fix tests broken by deprecation of help.command_usage.
104
    subsection_header = '.SS "%s"\n' % (cmd._usage())
1551.3.11 by Aaron Bentley
Merge from Robert
105
    doc = "%s\n" % (cmd.__doc__)
1861.2.13 by Alexander Belchenko
generate_docs (man/rstx): get help with .help() method, otherwise help for merge incomplete
106
    doc = cmd.help()
1861.3.2 by Alexander Belchenko
bzr.1 man page: show aliases for commands; fixed description of bazaar.conf
107
1551.3.11 by Aaron Bentley
Merge from Robert
108
    option_str = ""
109
    options = cmd.options()
110
    if options:
111
        option_str = "\nOptions:\n"
112
        for option_name, option in sorted(options.items()):
1857.1.14 by Aaron Bentley
Fix man page generation
113
            for name, short_name, argname, help in option.iter_switches():
114
                l = '    --' + name
115
                if argname is not None:
116
                    l += ' ' + argname
117
                if short_name:
118
                    assert len(short_name) == 1
119
                    l += ', -' + short_name
2309.3.1 by bialix at ukr
Fix for selftest of man generator with instaled plugin 'htmllog' (no help for plugin's log formatter)
120
                l += (30 - len(l)) * ' ' + (help or '')
1857.1.14 by Aaron Bentley
Fix man page generation
121
                wrapped = textwrap.fill(l, initial_indent='',
122
                                        subsequent_indent=30*' ')
123
                option_str = option_str + wrapped + '\n'       
1861.3.2 by Alexander Belchenko
bzr.1 man page: show aliases for commands; fixed description of bazaar.conf
124
125
    aliases_str = ""
126
    if cmd.aliases:
127
        if len(cmd.aliases) > 1:
128
            aliases_str += '\nAliases: '
129
        else:
130
            aliases_str += '\nAlias: '
131
        aliases_str += ', '.join(cmd.aliases)
132
        aliases_str += '\n'
133
2425.2.4 by Robert Collins
Update the doc_generate logic to include see-also help topics.
134
    see_also_str = ""
135
    see_also = cmd.get_see_also()
136
    if see_also:
137
        see_also_str += '\nSee also: '
138
        see_also_str += ', '.join(see_also)
139
        see_also_str += '\n'
140
141
    return subsection_header + option_str + aliases_str + see_also_str + "\n" + doc + "\n"
1185.75.1 by Hans Ulrich Niedermann
Start implementing general doc generation plan:
142
143
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
144
man_preamble = """\
1861.2.8 by Alexander Belchenko
More branding: bazaar-ng -> Bazaar; bazaar-ng.org -> bazaar-vcs.org
145
Man page for Bazaar (%(bzrcmd)s)
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
146
.\\\"
147
.\\\" Large parts of this file are autogenerated from the output of
148
.\\\"     \"%(bzrcmd)s help commands\"
149
.\\\"     \"%(bzrcmd)s help <cmd>\"
150
.\\\"
151
.\\\" Generation time: %(timestamp)s
152
.\\\"
153
"""
154
1551.3.11 by Aaron Bentley
Merge from Robert
155
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
156
man_head = """\
1861.2.8 by Alexander Belchenko
More branding: bazaar-ng -> Bazaar; bazaar-ng.org -> bazaar-vcs.org
157
.TH bzr 1 "%(datestamp)s" "%(version)s" "Bazaar"
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
158
.SH "NAME"
1861.2.8 by Alexander Belchenko
More branding: bazaar-ng -> Bazaar; bazaar-ng.org -> bazaar-vcs.org
159
Bazaar (%(bzrcmd)s) - next-generation distributed version control
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
160
.SH "SYNOPSIS"
161
.B "%(bzrcmd)s"
162
.I "command"
163
[
164
.I "command_options"
165
]
166
.br
167
.B "%(bzrcmd)s"
168
.B "help"
169
.br
170
.B "%(bzrcmd)s"
171
.B "help"
172
.I "command"
173
.SH "DESCRIPTION"
1861.2.13 by Alexander Belchenko
generate_docs (man/rstx): get help with .help() method, otherwise help for merge incomplete
174
Bazaar (or %(bzrcmd)s) is a project of Canonical to develop an open source
175
distributed version control system that is powerful, friendly, and scalable.
176
Version control means a system that keeps track of previous revisions
177
of software source code or similar information and helps people work on it in teams.
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
178
"""
179
180
man_foot = """\
181
.SH "ENVIRONMENT"
182
.TP
183
.I "BZRPATH"
184
Path where
185
.B "%(bzrcmd)s"
2374.1.1 by Ian Clatworthy
Help and man page fixes
186
is to look for shell plugin external commands.
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
187
.TP
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
188
.I "BZR_EMAIL"
1551.3.11 by Aaron Bentley
Merge from Robert
189
E-Mail address of the user. Overrides default user config.
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
190
.TP
191
.I "EMAIL"
2221.3.1 by Alexander Belchenko
Bugfix #76603: fix typo in bzr manpage text
192
E-Mail address of the user. Overrides default user config.
1861.3.4 by Alexander Belchenko
more environment variables for man page
193
.TP
194
.I "BZR_EDITOR"
195
Editor for editing commit messages
196
.TP
197
.I "EDITOR"
198
Editor for editing commit messages
199
.TP
200
.I "BZR_PLUGIN_PATH"
201
Paths where bzr should look for plugins
202
.TP
203
.I "BZR_HOME"
204
Home directory for bzr
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
205
.SH "FILES"
206
.TP
1861.3.2 by Alexander Belchenko
bzr.1 man page: show aliases for commands; fixed description of bazaar.conf
207
.I "~/.bazaar/bazaar.conf"
2374.1.1 by Ian Clatworthy
Help and man page fixes
208
Contains the user's default configuration. The section
1551.3.11 by Aaron Bentley
Merge from Robert
209
.B [DEFAULT]
1861.2.14 by Alexander Belchenko
generate_docs (man/rstx): fixed description of configuration file
210
is used to define general configuration that will be applied everywhere.
211
The section
212
.B [ALIASES]
213
can be used to create command aliases for
214
commonly used options.
215
216
A typical config file might look something like:
217
218
.br
219
[DEFAULT]
220
.br
221
email=John Doe <jdoe@isp.com>
222
.br
223
[ALIASES]
224
.br
225
commit = commit --strict
226
.br
227
log10 = log --short -r -10..-1
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
228
.SH "SEE ALSO"
1662.1.18 by Martin Pool
Fix up urls and warnings in auto-generated documentation
229
.UR http://www.bazaar-vcs.org/
230
.BR http://www.bazaar-vcs.org/
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
231
"""
232