17
14
# along with this program; if not, write to the Free Software
18
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
#<<< code taken from bzr (C) Canonical
24
import bzrlib, bzrlib.help
26
#>>> code taken from bzr (C) Canonical
17
"""man.py - create man page from built-in bzr help and static text
20
* use usage information instead of simple "bzr foo" in COMMAND OVERVIEW
31
import bzrlib.commands
34
def get_filename(options):
35
"""Provides name of manpage"""
36
return "%s.1" % (options.bzr_name)
39
def infogen(options, outfile):
40
"""Assembles a man page"""
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__,
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))
34
56
def man_escape(string):
57
"""Escapes strings for man page compatibility"""
35
58
result = string.replace("\\","\\\\")
36
59
result = result.replace("`","\\`")
37
60
result = result.replace("'","\\'")
44
def parse_line(self, line):
48
class CommandListParser(Parser):
50
"""Parser for output of "bzr help commands".
52
The parsed content can then be used to
53
- write a "COMMAND OVERVIEW" section into a man page
54
- provide a list of all commands
57
def __init__(self,params):
59
self.command_usage = []
60
self.all_commands = []
61
self.usage_exp = re.compile("([a-z0-9-]+).*")
62
self.descr_exp = re.compile(" ([A-Z].*)\s*")
68
def parse_line(self, line):
69
m = self.usage_exp.match(line)
75
self.command_usage.append((self.command,self.usage,self.descr))
76
self.all_commands.append(self.command)
77
self.usage = " ".join(line.split(" ")[1:])
78
self.command = m.groups()[0]
80
raise RuntimeError, "matching usage line in state %d" % state
83
m = self.descr_exp.match(line)
86
self.descr = m.groups()[0]
88
raise RuntimeError, "matching descr line in state %d" % state
91
raise RuntimeError, "Cannot parse this line ('%s')." % line
96
self.command_usage.append((self.command,self.usage,self.descr))
97
self.all_commands.append(self.command)
65
def command_name_list():
66
"""Builds a list of command names from bzrlib"""
67
command_names = bzrlib.commands.builtin_command_names()
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)
80
cmd_help = cmd_object.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)
99
raise RuntimeError, "ending parse in state %d" % state
101
def write_to_manpage(self, outfile):
102
bzrcmd = self.params["bzrcmd"]
103
outfile.write('.SH "COMMAND OVERVIEW"\n')
104
for (command,usage,descr) in self.command_usage:
105
outfile.write('.TP\n.B "%s %s"\n%s\n' % (bzrcmd, usage, descr))
110
def __init__(self, parser):
113
def write(self, data):
116
for line in data.split('\n'):
117
self.parser.parse_line(line)
120
def write_command_details(params, command, usage, descr, outfile):
121
x = ('.SS "%s %s"\n.B "%s"\n.PP\n.B "Usage:"\n%s %s\n\n' %
127
outfile.write(man_escape(x))
87
raise RuntimeError, "Command '%s' has no help text" % (cmd_name)
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)
98
output = output + format_command(params, cmd_object)
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:]])
109
options = cmd.options()
111
option_str = "\nOptions:\n"
112
for option_name, option in sorted(options.items()):
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"
130
129
man_preamble = """\
131
.\\\" Man page for %(bzrcmd)s (bazaar-ng)
130
Man page for %(bzrcmd)s (bazaar-ng)
133
132
.\\\" Large parts of this file are autogenerated from the output of
134
133
.\\\" \"%(bzrcmd)s help commands\"
174
172
is to look for external command.
177
E-Mail address of the user. Overrides
178
.I "~/.bzr.conf/email" and
181
.I "John Doe <john@example.com>"
175
E-Mail address of the user. Overrides default user config.
184
E-Mail address of the user. Overridden by the content of the file
185
.I "~/.bzr.conf/email"
186
and of the environment variable
178
E-Mail address of the user. Overriddes default user config.
191
Directory where all the user\'s settings are stored.
193
.I "~/.bzr.conf/email"
194
Stores name and email address of the user. Overrides content of
196
environment variable. Example content:
197
.I "John Doe <john@example.com>"
181
.I "~/.bazaar/bazaar.conf/"
182
Contains the default user config. Only one section, [DEFAULT] is allowed. A
183
typical default config file may be similiar to:
188
.B email=John Doe <jdoe@isp.com>
190
.UR http://bazaar.canonical.com/
191
.BR http://bazaar.canonical.com/,
199
192
.UR http://www.bazaar-ng.org/
200
.BR http://www.bazaar-ng.org/,
201
.UR http://www.bazaar-ng.org/doc/
202
.BR http://www.bazaar-ng.org/doc/
193
.BR http://www.bazaar-ng.org/
207
:param args: command-line arguments (sys.argv[1:])
214
"datestamp": time.strftime("%Y-%m-%d",tt),
215
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S +0000",tt),
216
"version": bzrlib.__version__,
219
clp = CommandListParser(params)
220
bzrlib.help.help("commands", outfile=HelpReader(clp))
229
outfile = open(filename,"w")
231
outfile.write(man_preamble % params)
232
outfile.write(man_escape(man_head % params))
233
clp.write_to_manpage(outfile)
236
# This doesn't do more than the summary so far.
237
#outfile.write('.SH "DETAILED COMMAND DESCRIPTION"\n')
238
#for (command,usage,descr) in clp.command_usage:
239
# write_command_details(params, command, usage, descr, outfile = outfile)
241
outfile.write(man_escape(man_foot % params))
244
if __name__ == '__main__':