1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright 2005 Canonical Ltd.
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""man.py - create man page from built-in brz help and static text
17
"""man.py - create man page from built-in bzr help and static text
20
* use usage information instead of simple "brz foo" in COMMAND OVERVIEW
20
* use usage information instead of simple "bzr foo" in COMMAND OVERVIEW
21
21
* add command aliases
24
from __future__ import absolute_import
26
PLUGINS_TO_DOCUMENT = ["launchpad"]
32
import breezy.help_topics
33
import breezy.commands
34
from breezy.doc_generate import get_autodoc_datetime
36
from breezy.plugin import load_plugins
31
import bzrlib.commands
40
34
def get_filename(options):
41
35
"""Provides name of manpage"""
42
return "%s.1" % (options.brz_name)
36
return "%s.1" % (options.bzr_name)
45
39
def infogen(options, outfile):
46
40
"""Assembles a man page"""
47
d = get_autodoc_datetime()
49
{"brzcmd": options.brz_name,
50
"datestamp": d.strftime("%Y-%m-%d"),
51
"timestamp": d.strftime("%Y-%m-%d %H:%M:%S +0000"),
52
"version": breezy.__version__,
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__,
54
49
outfile.write(man_preamble % params)
55
50
outfile.write(man_escape(man_head % params))
56
51
outfile.write(man_escape(getcommand_list(params)))
57
52
outfile.write(man_escape(getcommand_help(params)))
58
outfile.write("".join(environment_variables()))
59
53
outfile.write(man_escape(man_foot % params))
62
56
def man_escape(string):
63
57
"""Escapes strings for man page compatibility"""
64
result = string.replace("\\", "\\\\")
65
result = result.replace("`", "\\'")
66
result = result.replace("'", "\\*(Aq")
67
result = result.replace("-", "\\-")
58
result = string.replace("\\","\\\\")
59
result = result.replace("`","\\`")
60
result = result.replace("'","\\'")
61
result = result.replace("-","\\-")
71
65
def command_name_list():
72
"""Builds a list of command names from breezy"""
73
command_names = breezy.commands.builtin_command_names()
74
for cmdname in breezy.commands.plugin_command_names():
75
cmd_object = breezy.commands.get_cmd_object(cmdname)
76
if (PLUGINS_TO_DOCUMENT is None or
77
cmd_object.plugin_name() in PLUGINS_TO_DOCUMENT):
78
command_names.append(cmdname)
66
"""Builds a list of command names from bzrlib"""
67
command_names = bzrlib.commands.builtin_command_names()
79
68
command_names.sort()
80
69
return command_names
83
def getcommand_list(params):
72
def getcommand_list (params):
84
73
"""Builds summary help for command names in manpage format"""
85
brzcmd = params["brzcmd"]
74
bzrcmd = params["bzrcmd"]
86
75
output = '.SH "COMMAND OVERVIEW"\n'
87
76
for cmd_name in command_name_list():
88
cmd_object = breezy.commands.get_cmd_object(cmd_name)
77
cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
89
78
if cmd_object.hidden:
91
80
cmd_help = cmd_object.help()
93
82
firstline = cmd_help.split('\n', 1)[0]
94
usage = cmd_object._usage()
83
usage = bzrlib.help.command_usage(cmd_object)
95
84
tmp = '.TP\n.B "%s"\n%s\n' % (usage, firstline)
96
85
output = output + tmp
98
raise RuntimeError("Command '%s' has no help text" % (cmd_name))
87
raise RuntimeError, "Command '%s' has no help text" % (cmd_name)
102
91
def getcommand_help(params):
103
"""Shows individual options for a brz command"""
104
output = '.SH "COMMAND REFERENCE"\n'
92
"""Shows individual options for a bzr command"""
93
output='.SH "COMMAND REFERENCE"\n'
106
94
for cmd_name in command_name_list():
107
cmd_object = breezy.commands.get_cmd_object(cmd_name)
95
cmd_object = bzrlib.commands.get_cmd_object(cmd_name)
108
96
if cmd_object.hidden:
110
formatted[cmd_name] = format_command(params, cmd_object)
111
for alias in cmd_object.aliases:
112
formatted[alias] = format_alias(params, alias, cmd_name)
113
for cmd_name in sorted(formatted):
114
output += formatted[cmd_name]
98
output = output + format_command(params, cmd_object)
118
def format_command(params, cmd):
102
def format_command (params, cmd):
119
103
"""Provides long help for each public command"""
120
subsection_header = '.SS "%s"\n' % (cmd._usage())
104
subsection_header = '.SS "%s"\n' % (bzrlib.help.command_usage(cmd))
121
105
doc = "%s\n" % (cmd.__doc__)
122
doc = breezy.help_topics.help_as_plain_text(cmd.help())
124
# A dot at the beginning of a line is interpreted as a macro.
125
# Simply join lines that begin with a dot with the previous
126
# line to work around this.
127
doc = doc.replace("\n.", ".")
106
docsplit = cmd.__doc__.split('\n')
107
doc = '\n'.join([docsplit[0]] + [line[4:] for line in docsplit[1:]])
130
109
options = cmd.options()
132
111
option_str = "\nOptions:\n"
133
112
for option_name, option in sorted(options.items()):
134
for name, short_name, argname, help in option.iter_switches():
135
if option.is_hidden(name):
138
if argname is not None:
141
l += ', -' + short_name
142
l += (30 - len(l)) * ' ' + (help or '')
143
wrapped = textwrap.fill(l, initial_indent='',
144
subsequent_indent=30 * ' ',
145
break_long_words=False,
147
option_str += wrapped + '\n'
151
if len(cmd.aliases) > 1:
152
aliases_str += '\nAliases: '
154
aliases_str += '\nAlias: '
155
aliases_str += ', '.join(cmd.aliases)
159
see_also = cmd.get_see_also()
161
see_also_str += '\nSee also: '
162
see_also_str += ', '.join(see_also)
165
return subsection_header + option_str + aliases_str + see_also_str + "\n" + doc + "\n"
168
def format_alias(params, alias, cmd_name):
169
help = '.SS "brz %s"\n' % alias
170
help += 'Alias for "%s", see "brz %s".\n' % (cmd_name, cmd_name)
174
def environment_variables():
175
yield ".SH \"ENVIRONMENT\"\n"
177
from breezy.help_topics import known_env_variables
178
for k, desc in known_env_variables:
180
yield ".I \"%s\"\n" % k
181
yield man_escape(desc) + "\n"
113
l = ' --' + option_name
114
if option.type is not None:
115
l += ' ' + option.argname.upper()
116
short_name = option.short_name()
118
assert len(short_name) == 1
119
l += ', -' + short_name
120
l += (30 - len(l)) * ' ' + option.help
121
# TODO: Split help over multiple lines with
122
# correct indenting and wrapping.
123
wrapped = textwrap.fill(l, initial_indent='',
124
subsequent_indent=30*' ')
125
option_str = option_str + wrapped + '\n'
126
return subsection_header + option_str + "\n" + doc + "\n"
184
129
man_preamble = """\
185
.\\\"Man page for Breezy (%(brzcmd)s)
130
Man page for %(bzrcmd)s (bazaar-ng)
187
132
.\\\" Large parts of this file are autogenerated from the output of
188
.\\\" \"%(brzcmd)s help commands\"
189
.\\\" \"%(brzcmd)s help <cmd>\"
192
.ie \\n(.g .ds Aq \\(aq
133
.\\\" \"%(bzrcmd)s help commands\"
134
.\\\" \"%(bzrcmd)s help <cmd>\"
136
.\\\" Generation time: %(timestamp)s
198
.TH brz 1 "%(datestamp)s" "%(version)s" "Breezy"
142
.TH bzr 1 "%(datestamp)s" "%(version)s" "bazaar-ng"
200
%(brzcmd)s - Breezy next-generation distributed version control
144
%(bzrcmd)s - bazaar-ng next-generation distributed version control
205
149
.I "command_options"
214
158
.SH "DESCRIPTION"
216
Breezy (or %(brzcmd)s) is a distributed version control system that is powerful,
217
friendly, and scalable. Breezy is a fork of the Bazaar version control system.
219
Breezy keeps track of changes to software source code (or similar information);
220
lets you explore who changed it, when, and why; merges concurrent changes; and
221
helps people work together in a team.
161
) 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.
170
is to look for external command.
173
E-Mail address of the user. Overrides default user config.
176
E-Mail address of the user. Overriddes default user config.
227
.I "~/.config/breezy/breezy.conf"
228
Contains the user's default configuration. The section
179
.I "~/.bazaar/bazaar.conf/"
180
Contains the default user config. Only one section, [DEFAULT] is allowed. A
181
typical default config file may be similiar to:
230
is used to define general configuration that will be applied everywhere.
233
can be used to create command aliases for
234
commonly used options.
236
A typical config file might look something like:
241
email=John Doe <jdoe@isp.com>
245
commit = commit --strict
247
log10 = log --short -r -10..-1
186
.B email=John Doe <jdoe@isp.com>
249
.UR https://www.breezy-vcs.org/
250
.BR https://www.breezy-vcs.org/
188
.UR http://www.bazaar-vcs.org/
189
.BR http://www.bazaar-vcs.org/