~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]
83
            usage = bzrlib.help.command_usage(cmd_object)
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"""
104
    subsection_header = '.SS "%s"\n' % (bzrlib.help.command_usage(cmd))
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
134
    return subsection_header + option_str + aliases_str + "\n" + doc + "\n"
1185.75.1 by Hans Ulrich Niedermann
Start implementing general doc generation plan:
135
136
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
137
man_preamble = """\
1861.2.8 by Alexander Belchenko
More branding: bazaar-ng -> Bazaar; bazaar-ng.org -> bazaar-vcs.org
138
Man page for Bazaar (%(bzrcmd)s)
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
139
.\\\"
140
.\\\" Large parts of this file are autogenerated from the output of
141
.\\\"     \"%(bzrcmd)s help commands\"
142
.\\\"     \"%(bzrcmd)s help <cmd>\"
143
.\\\"
144
.\\\" Generation time: %(timestamp)s
145
.\\\"
146
"""
147
1551.3.11 by Aaron Bentley
Merge from Robert
148
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
149
man_head = """\
1861.2.8 by Alexander Belchenko
More branding: bazaar-ng -> Bazaar; bazaar-ng.org -> bazaar-vcs.org
150
.TH bzr 1 "%(datestamp)s" "%(version)s" "Bazaar"
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
151
.SH "NAME"
1861.2.8 by Alexander Belchenko
More branding: bazaar-ng -> Bazaar; bazaar-ng.org -> bazaar-vcs.org
152
Bazaar (%(bzrcmd)s) - next-generation distributed version control
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
153
.SH "SYNOPSIS"
154
.B "%(bzrcmd)s"
155
.I "command"
156
[
157
.I "command_options"
158
]
159
.br
160
.B "%(bzrcmd)s"
161
.B "help"
162
.br
163
.B "%(bzrcmd)s"
164
.B "help"
165
.I "command"
166
.SH "DESCRIPTION"
1861.2.13 by Alexander Belchenko
generate_docs (man/rstx): get help with .help() method, otherwise help for merge incomplete
167
Bazaar (or %(bzrcmd)s) is a project of Canonical to develop an open source
168
distributed version control system that is powerful, friendly, and scalable.
169
Version control means a system that keeps track of previous revisions
170
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
171
"""
172
173
man_foot = """\
174
.SH "ENVIRONMENT"
175
.TP
176
.I "BZRPATH"
177
Path where
178
.B "%(bzrcmd)s"
2374.1.1 by Ian Clatworthy
Help and man page fixes
179
is to look for shell plugin external commands.
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
180
.TP
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
181
.I "BZR_EMAIL"
1551.3.11 by Aaron Bentley
Merge from Robert
182
E-Mail address of the user. Overrides default user config.
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
183
.TP
184
.I "EMAIL"
2221.3.1 by Alexander Belchenko
Bugfix #76603: fix typo in bzr manpage text
185
E-Mail address of the user. Overrides default user config.
1861.3.4 by Alexander Belchenko
more environment variables for man page
186
.TP
187
.I "BZR_EDITOR"
188
Editor for editing commit messages
189
.TP
190
.I "EDITOR"
191
Editor for editing commit messages
192
.TP
193
.I "BZR_PLUGIN_PATH"
194
Paths where bzr should look for plugins
195
.TP
196
.I "BZR_HOME"
197
Home directory for bzr
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
198
.SH "FILES"
199
.TP
1861.3.2 by Alexander Belchenko
bzr.1 man page: show aliases for commands; fixed description of bazaar.conf
200
.I "~/.bazaar/bazaar.conf"
2374.1.1 by Ian Clatworthy
Help and man page fixes
201
Contains the user's default configuration. The section
1551.3.11 by Aaron Bentley
Merge from Robert
202
.B [DEFAULT]
1861.2.14 by Alexander Belchenko
generate_docs (man/rstx): fixed description of configuration file
203
is used to define general configuration that will be applied everywhere.
204
The section
205
.B [ALIASES]
206
can be used to create command aliases for
207
commonly used options.
208
209
A typical config file might look something like:
210
211
.br
212
[DEFAULT]
213
.br
214
email=John Doe <jdoe@isp.com>
215
.br
216
[ALIASES]
217
.br
218
commit = commit --strict
219
.br
220
log10 = log --short -r -10..-1
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
221
.SH "SEE ALSO"
1662.1.18 by Martin Pool
Fix up urls and warnings in auto-generated documentation
222
.UR http://www.bazaar-vcs.org/
223
.BR http://www.bazaar-vcs.org/
635 by Martin Pool
- manpage generator by Hans Ulrich Niedermann
224
"""
225