comparison mercurial/help.py @ 8863:7b19c3c0172b

help: adding a new help topic about extensions Currently listing non-enabled extensions and a short introductory text. Thanks to Dan Villiom Podlaski Christiansen for the preliminary proof-of-concept code for listing available extensions.
author Cédric Duval <cedricduval@free.fr>
date Sat, 20 Jun 2009 20:55:43 +0200
parents aea3a23151bd
children cad6370a15cb
comparison
equal deleted inserted replaced
8862:cd96f159a2d3 8863:7b19c3c0172b
3 # Copyright 2006 Matt Mackall <mpm@selenic.com> 3 # Copyright 2006 Matt Mackall <mpm@selenic.com>
4 # 4 #
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2, incorporated herein by reference. 6 # GNU General Public License version 2, incorporated herein by reference.
7 7
8 from i18n import _ 8 import os, sys
9 from i18n import _, gettext
10 import extensions
11
12
13 # borrowed from pydoc
14 def pathdirs():
15 '''Convert sys.path into a list of absolute, existing, unique paths.'''
16 dirs = []
17 normdirs = []
18 for dir in sys.path:
19 dir = os.path.abspath(dir or '.')
20 normdir = os.path.normcase(dir)
21 if normdir not in normdirs and os.path.isdir(dir):
22 dirs.append(dir)
23 normdirs.append(normdir)
24 return dirs
25
26 # loosely inspired by pydoc.source_synopsis()
27 # rewritten to handle ''' as well as """
28 # and to return the whole text instead of just the synopsis
29 def moduledoc(file):
30 '''Return the top python documentation for the given file'''
31 result = []
32
33 line = file.readline()
34 while line[:1] == '#' or not line.strip():
35 line = file.readline()
36 if not line: break
37
38 start = line[:3]
39 if start == '"""' or start == "'''":
40 line = line[3:]
41 while line:
42 if line.rstrip().endswith(start):
43 line = line.split(start)[0]
44 if line:
45 result.append(line)
46 break
47 elif not line:
48 return None # unmatched delimiter
49 result.append(line)
50 line = file.readline()
51 else:
52 return None
53
54 return ''.join(result)
55
56 def additionalextensions():
57 '''Find the extensions shipped with Mercurial but not enabled
58
59 Returns extensions names and descriptions, and the max name length
60 '''
61 exts = {}
62 maxlength = 0
63
64 for dir in filter(os.path.isdir,
65 (os.path.join(pd, 'hgext') for pd in pathdirs())):
66 for e in os.listdir(dir):
67 if e.endswith('.py'):
68 name = e.rsplit('.', 1)[0]
69 path = os.path.join(dir, e)
70 else:
71 name = e
72 path = os.path.join(dir, e, '__init__.py')
73
74 if name in exts or name == '__init__' or not os.path.exists(path):
75 continue
76
77 try:
78 extensions.find(name)
79 except KeyError:
80 pass
81 else:
82 continue # enabled extension
83
84 try:
85 file = open(path)
86 except IOError:
87 continue
88 else:
89 doc = moduledoc(file)
90 file.close()
91
92 if doc: # extracting localized synopsis
93 exts[name] = gettext(doc).splitlines()[0]
94 else:
95 exts[name] = _('(no help text available)')
96 if len(name) > maxlength:
97 maxlength = len(name)
98
99 return exts, maxlength
100
101 def topicextensions():
102 doc = _(r'''
103 Mercurial has an extension mechanism for adding new features.
104
105 To enable an extension "foo" bundled with Mercurial, create an
106 entry for it your hgrc, like this:
107
108 [extensions]
109 foo =
110 ''')
111
112 exts, maxlength = additionalextensions()
113 if exts:
114 doc += _('\nnon-enabled extensions:\n\n')
115 for name, desc in sorted(exts.iteritems()):
116 doc += ' %s %s\n' % (name.ljust(maxlength), desc)
117
118 return doc
9 119
10 helptable = ( 120 helptable = (
11 (["dates"], _("Date Formats"), 121 (["dates"], _("Date Formats"),
12 _(r''' 122 _(r'''
13 Some commands allow the user to specify a date, e.g.: 123 Some commands allow the user to specify a date, e.g.:
416 526
417 default-push: 527 default-push:
418 The push command will look for a path named 'default-push', and 528 The push command will look for a path named 'default-push', and
419 prefer it over 'default' if both are defined. 529 prefer it over 'default' if both are defined.
420 ''')), 530 ''')),
531 (["extensions"], _("Using additional features"), topicextensions),
421 ) 532 )