##// END OF EJS Templates
help: move the majority of the help command to the help module...
Dan Villiom Podlaski Christiansen -
r18746:c0087d48 default
parent child Browse files
Show More
@@ -7,9 +7,9 b''
7
7
8 from node import hex, bin, nullid, nullrev, short
8 from node import hex, bin, nullid, nullrev, short
9 from lock import release
9 from lock import release
10 from i18n import _, gettext
10 from i18n import _
11 import os, re, difflib, time, tempfile, errno
11 import os, re, difflib, time, tempfile, errno
12 import hg, scmutil, util, revlog, extensions, copies, error, bookmarks
12 import hg, scmutil, util, revlog, copies, error, bookmarks
13 import patch, help, encoding, templatekw, discovery
13 import patch, help, encoding, templatekw, discovery
14 import archival, changegroup, cmdutil, hbisect
14 import archival, changegroup, cmdutil, hbisect
15 import sshserver, hgweb, hgweb.server, commandserver
15 import sshserver, hgweb, hgweb.server, commandserver
@@ -3214,7 +3214,7 b' def heads(ui, repo, *branchrevs, **opts)'
3214 ('k', 'keyword', '', _('show topics matching keyword')),
3214 ('k', 'keyword', '', _('show topics matching keyword')),
3215 ],
3215 ],
3216 _('[-ec] [TOPIC]'))
3216 _('[-ec] [TOPIC]'))
3217 def help_(ui, name=None, unknowncmd=False, full=True, **opts):
3217 def help_(ui, name=None, **opts):
3218 """show help for a given topic or a help overview
3218 """show help for a given topic or a help overview
3219
3219
3220 With no arguments, print a list of commands with short help messages.
3220 With no arguments, print a list of commands with short help messages.
@@ -3227,291 +3227,9 b' def help_(ui, name=None, unknowncmd=Fals'
3227
3227
3228 textwidth = min(ui.termwidth(), 80) - 2
3228 textwidth = min(ui.termwidth(), 80) - 2
3229
3229
3230 def helpcmd(name):
3231 try:
3232 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
3233 except error.AmbiguousCommand, inst:
3234 # py3k fix: except vars can't be used outside the scope of the
3235 # except block, nor can be used inside a lambda. python issue4617
3236 prefix = inst.args[0]
3237 select = lambda c: c.lstrip('^').startswith(prefix)
3238 rst = helplist(select)
3239 return rst
3240
3241 rst = []
3242
3243 # check if it's an invalid alias and display its error if it is
3244 if getattr(entry[0], 'badalias', False):
3245 if not unknowncmd:
3246 ui.pushbuffer()
3247 entry[0](ui)
3248 rst.append(ui.popbuffer())
3249 return rst
3250
3251 # synopsis
3252 if len(entry) > 2:
3253 if entry[2].startswith('hg'):
3254 rst.append("%s\n" % entry[2])
3255 else:
3256 rst.append('hg %s %s\n' % (aliases[0], entry[2]))
3257 else:
3258 rst.append('hg %s\n' % aliases[0])
3259 # aliases
3260 if full and not ui.quiet and len(aliases) > 1:
3261 rst.append(_("\naliases: %s\n") % ', '.join(aliases[1:]))
3262 rst.append('\n')
3263
3264 # description
3265 doc = gettext(entry[0].__doc__)
3266 if not doc:
3267 doc = _("(no help text available)")
3268 if util.safehasattr(entry[0], 'definition'): # aliased command
3269 if entry[0].definition.startswith('!'): # shell alias
3270 doc = _('shell alias for::\n\n %s') % entry[0].definition[1:]
3271 else:
3272 doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
3273 doc = doc.splitlines(True)
3274 if ui.quiet or not full:
3275 rst.append(doc[0])
3276 else:
3277 rst.extend(doc)
3278 rst.append('\n')
3279
3280 # check if this command shadows a non-trivial (multi-line)
3281 # extension help text
3282 try:
3283 mod = extensions.find(name)
3284 doc = gettext(mod.__doc__) or ''
3285 if '\n' in doc.strip():
3286 msg = _('use "hg help -e %s" to show help for '
3287 'the %s extension') % (name, name)
3288 rst.append('\n%s\n' % msg)
3289 except KeyError:
3290 pass
3291
3292 # options
3293 if not ui.quiet and entry[1]:
3294 rst.append('\n%s\n\n' % _("options:"))
3295 rst.append(help.optrst(entry[1], ui.verbose))
3296
3297 if ui.verbose:
3298 rst.append('\n%s\n\n' % _("global options:"))
3299 rst.append(help.optrst(globalopts, ui.verbose))
3300
3301 if not ui.verbose:
3302 if not full:
3303 rst.append(_('\nuse "hg help %s" to show the full help text\n')
3304 % name)
3305 elif not ui.quiet:
3306 omitted = _('use "hg -v help %s" to show more complete'
3307 ' help and the global options') % name
3308 notomitted = _('use "hg -v help %s" to show'
3309 ' the global options') % name
3310 help.indicateomitted(rst, omitted, notomitted)
3311
3312 return rst
3313
3314
3315 def helplist(select=None):
3316 # list of commands
3317 if name == "shortlist":
3318 header = _('basic commands:\n\n')
3319 else:
3320 header = _('list of commands:\n\n')
3321
3322 h = {}
3323 cmds = {}
3324 for c, e in table.iteritems():
3325 f = c.split("|", 1)[0]
3326 if select and not select(f):
3327 continue
3328 if (not select and name != 'shortlist' and
3329 e[0].__module__ != __name__):
3330 continue
3331 if name == "shortlist" and not f.startswith("^"):
3332 continue
3333 f = f.lstrip("^")
3334 if not ui.debugflag and f.startswith("debug"):
3335 continue
3336 doc = e[0].__doc__
3337 if doc and 'DEPRECATED' in doc and not ui.verbose:
3338 continue
3339 doc = gettext(doc)
3340 if not doc:
3341 doc = _("(no help text available)")
3342 h[f] = doc.splitlines()[0].rstrip()
3343 cmds[f] = c.lstrip("^")
3344
3345 rst = []
3346 if not h:
3347 if not ui.quiet:
3348 rst.append(_('no commands defined\n'))
3349 return rst
3350
3351 if not ui.quiet:
3352 rst.append(header)
3353 fns = sorted(h)
3354 for f in fns:
3355 if ui.verbose:
3356 commands = cmds[f].replace("|",", ")
3357 rst.append(" :%s: %s\n" % (commands, h[f]))
3358 else:
3359 rst.append(' :%s: %s\n' % (f, h[f]))
3360
3361 if not name:
3362 exts = help.listexts(_('enabled extensions:'), extensions.enabled())
3363 if exts:
3364 rst.append('\n')
3365 rst.extend(exts)
3366
3367 rst.append(_("\nadditional help topics:\n\n"))
3368 topics = []
3369 for names, header, doc in help.helptable:
3370 topics.append((names[0], header))
3371 for t, desc in topics:
3372 rst.append(" :%s: %s\n" % (t, desc))
3373
3374 optlist = []
3375 if not ui.quiet:
3376 if ui.verbose:
3377 optlist.append((_("global options:"), globalopts))
3378 if name == 'shortlist':
3379 optlist.append((_('use "hg help" for the full list '
3380 'of commands'), ()))
3381 else:
3382 if name == 'shortlist':
3383 msg = _('use "hg help" for the full list of commands '
3384 'or "hg -v" for details')
3385 elif name and not full:
3386 msg = _('use "hg help %s" to show the full help '
3387 'text') % name
3388 else:
3389 msg = _('use "hg -v help%s" to show builtin aliases and '
3390 'global options') % (name and " " + name or "")
3391 optlist.append((msg, ()))
3392
3393 if optlist:
3394 for title, options in optlist:
3395 rst.append('\n%s\n' % title)
3396 if options:
3397 rst.append('\n%s\n' % help.optrst(options, ui.verbose))
3398 return rst
3399
3400 def helptopic(name):
3401 for names, header, doc in help.helptable:
3402 if name in names:
3403 break
3404 else:
3405 raise error.UnknownCommand(name)
3406
3407 rst = ["%s\n\n" % header]
3408 # description
3409 if not doc:
3410 rst.append(" %s\n" % _("(no help text available)"))
3411 if util.safehasattr(doc, '__call__'):
3412 rst += [" %s\n" % l for l in doc().splitlines()]
3413
3414 if not ui.verbose:
3415 omitted = (_('use "hg help -v %s" to show more complete help') %
3416 name)
3417 help.indicateomitted(rst, omitted)
3418
3419 try:
3420 cmdutil.findcmd(name, table)
3421 rst.append(_('\nuse "hg help -c %s" to see help for '
3422 'the %s command\n') % (name, name))
3423 except error.UnknownCommand:
3424 pass
3425 return rst
3426
3427 def helpext(name):
3428 try:
3429 mod = extensions.find(name)
3430 doc = gettext(mod.__doc__) or _('no help text available')
3431 except KeyError:
3432 mod = None
3433 doc = extensions.disabledext(name)
3434 if not doc:
3435 raise error.UnknownCommand(name)
3436
3437 if '\n' not in doc:
3438 head, tail = doc, ""
3439 else:
3440 head, tail = doc.split('\n', 1)
3441 rst = [_('%s extension - %s\n\n') % (name.split('.')[-1], head)]
3442 if tail:
3443 rst.extend(tail.splitlines(True))
3444 rst.append('\n')
3445
3446 if not ui.verbose:
3447 omitted = (_('use "hg help -v %s" to show more complete help') %
3448 name)
3449 help.indicateomitted(rst, omitted)
3450
3451 if mod:
3452 try:
3453 ct = mod.cmdtable
3454 except AttributeError:
3455 ct = {}
3456 modcmds = set([c.split('|', 1)[0] for c in ct])
3457 rst.extend(helplist(modcmds.__contains__))
3458 else:
3459 rst.append(_('use "hg help extensions" for information on enabling '
3460 'extensions\n'))
3461 return rst
3462
3463 def helpextcmd(name):
3464 cmd, ext, mod = extensions.disabledcmd(ui, name,
3465 ui.configbool('ui', 'strict'))
3466 doc = gettext(mod.__doc__).splitlines()[0]
3467
3468 rst = help.listexts(_("'%s' is provided by the following "
3469 "extension:") % cmd, {ext: doc}, indent=4)
3470 rst.append('\n')
3471 rst.append(_('use "hg help extensions" for information on enabling '
3472 'extensions\n'))
3473 return rst
3474
3475
3476 rst = []
3477 kw = opts.get('keyword')
3478 if kw:
3479 matches = help.topicmatch(kw)
3480 for t, title in (('topics', _('Topics')),
3481 ('commands', _('Commands')),
3482 ('extensions', _('Extensions')),
3483 ('extensioncommands', _('Extension Commands'))):
3484 if matches[t]:
3485 rst.append('%s:\n\n' % title)
3486 rst.extend(minirst.maketable(sorted(matches[t]), 1))
3487 rst.append('\n')
3488 elif name and name != 'shortlist':
3489 i = None
3490 if unknowncmd:
3491 queries = (helpextcmd,)
3492 elif opts.get('extension'):
3493 queries = (helpext,)
3494 elif opts.get('command'):
3495 queries = (helpcmd,)
3496 else:
3497 queries = (helptopic, helpcmd, helpext, helpextcmd)
3498 for f in queries:
3499 try:
3500 rst = f(name)
3501 i = None
3502 break
3503 except error.UnknownCommand, inst:
3504 i = inst
3505 if i:
3506 raise i
3507 else:
3508 # program name
3509 if not ui.quiet:
3510 rst = [_("Mercurial Distributed SCM\n"), '\n']
3511 rst.extend(helplist())
3512
3513 keep = ui.verbose and ['verbose'] or []
3230 keep = ui.verbose and ['verbose'] or []
3514 text = ''.join(rst)
3231 text = help.help_(ui, name, **opts)
3232
3515 formatted, pruned = minirst.format(text, textwidth, keep=keep)
3233 formatted, pruned = minirst.format(text, textwidth, keep=keep)
3516 if 'verbose' in pruned:
3234 if 'verbose' in pruned:
3517 keep.append('omitted')
3235 keep.append('omitted')
@@ -6,9 +6,10 b''
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from i18n import gettext, _
8 from i18n import gettext, _
9 import itertools, sys, os
9 import itertools, sys, os, error
10 import extensions, revset, fileset, templatekw, templatefilters, filemerge
10 import extensions, revset, fileset, templatekw, templatefilters, filemerge
11 import encoding, util, minirst
11 import encoding, util, minirst
12 import cmdutil
12
13
13 def listexts(header, exts, indent=1):
14 def listexts(header, exts, indent=1):
14 '''return a text listing of the given extensions'''
15 '''return a text listing of the given extensions'''
@@ -206,3 +207,297 b" addtopicsymbols('merge-tools', '.. inter"
206 addtopicsymbols('revsets', '.. predicatesmarker', revset.symbols)
207 addtopicsymbols('revsets', '.. predicatesmarker', revset.symbols)
207 addtopicsymbols('templates', '.. keywordsmarker', templatekw.dockeywords)
208 addtopicsymbols('templates', '.. keywordsmarker', templatekw.dockeywords)
208 addtopicsymbols('templates', '.. filtersmarker', templatefilters.filters)
209 addtopicsymbols('templates', '.. filtersmarker', templatefilters.filters)
210
211 def help_(ui, name, unknowncmd=False, full=True, **opts):
212 '''
213 Generate the help for 'name' as unformatted restructured text. If
214 'name' is None, describe the commands available.
215 '''
216
217 import commands # avoid cycle
218
219 def helpcmd(name):
220 try:
221 aliases, entry = cmdutil.findcmd(name, commands.table,
222 strict=unknowncmd)
223 except error.AmbiguousCommand, inst:
224 # py3k fix: except vars can't be used outside the scope of the
225 # except block, nor can be used inside a lambda. python issue4617
226 prefix = inst.args[0]
227 select = lambda c: c.lstrip('^').startswith(prefix)
228 rst = helplist(select)
229 return rst
230
231 rst = []
232
233 # check if it's an invalid alias and display its error if it is
234 if getattr(entry[0], 'badalias', False):
235 if not unknowncmd:
236 ui.pushbuffer()
237 entry[0](ui)
238 rst.append(ui.popbuffer())
239 return rst
240
241 # synopsis
242 if len(entry) > 2:
243 if entry[2].startswith('hg'):
244 rst.append("%s\n" % entry[2])
245 else:
246 rst.append('hg %s %s\n' % (aliases[0], entry[2]))
247 else:
248 rst.append('hg %s\n' % aliases[0])
249 # aliases
250 if full and not ui.quiet and len(aliases) > 1:
251 rst.append(_("\naliases: %s\n") % ', '.join(aliases[1:]))
252 rst.append('\n')
253
254 # description
255 doc = gettext(entry[0].__doc__)
256 if not doc:
257 doc = _("(no help text available)")
258 if util.safehasattr(entry[0], 'definition'): # aliased command
259 if entry[0].definition.startswith('!'): # shell alias
260 doc = _('shell alias for::\n\n %s') % entry[0].definition[1:]
261 else:
262 doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
263 doc = doc.splitlines(True)
264 if ui.quiet or not full:
265 rst.append(doc[0])
266 else:
267 rst.extend(doc)
268 rst.append('\n')
269
270 # check if this command shadows a non-trivial (multi-line)
271 # extension help text
272 try:
273 mod = extensions.find(name)
274 doc = gettext(mod.__doc__) or ''
275 if '\n' in doc.strip():
276 msg = _('use "hg help -e %s" to show help for '
277 'the %s extension') % (name, name)
278 rst.append('\n%s\n' % msg)
279 except KeyError:
280 pass
281
282 # options
283 if not ui.quiet and entry[1]:
284 rst.append('\n%s\n\n' % _("options:"))
285 rst.append(optrst(entry[1], ui.verbose))
286
287 if ui.verbose:
288 rst.append('\n%s\n\n' % _("global options:"))
289 rst.append(optrst(commands.globalopts, ui.verbose))
290
291 if not ui.verbose:
292 if not full:
293 rst.append(_('\nuse "hg help %s" to show the full help text\n')
294 % name)
295 elif not ui.quiet:
296 omitted = _('use "hg -v help %s" to show more complete'
297 ' help and the global options') % name
298 notomitted = _('use "hg -v help %s" to show'
299 ' the global options') % name
300 indicateomitted(rst, omitted, notomitted)
301
302 return rst
303
304
305 def helplist(select=None):
306 # list of commands
307 if name == "shortlist":
308 header = _('basic commands:\n\n')
309 else:
310 header = _('list of commands:\n\n')
311
312 h = {}
313 cmds = {}
314 for c, e in commands.table.iteritems():
315 f = c.split("|", 1)[0]
316 if select and not select(f):
317 continue
318 if (not select and name != 'shortlist' and
319 e[0].__module__ != commands.__name__):
320 continue
321 if name == "shortlist" and not f.startswith("^"):
322 continue
323 f = f.lstrip("^")
324 if not ui.debugflag and f.startswith("debug"):
325 continue
326 doc = e[0].__doc__
327 if doc and 'DEPRECATED' in doc and not ui.verbose:
328 continue
329 doc = gettext(doc)
330 if not doc:
331 doc = _("(no help text available)")
332 h[f] = doc.splitlines()[0].rstrip()
333 cmds[f] = c.lstrip("^")
334
335 rst = []
336 if not h:
337 if not ui.quiet:
338 rst.append(_('no commands defined\n'))
339 return rst
340
341 if not ui.quiet:
342 rst.append(header)
343 fns = sorted(h)
344 for f in fns:
345 if ui.verbose:
346 commacmds = cmds[f].replace("|",", ")
347 rst.append(" :%s: %s\n" % (commacmds, h[f]))
348 else:
349 rst.append(' :%s: %s\n' % (f, h[f]))
350
351 if not name:
352 exts = listexts(_('enabled extensions:'), extensions.enabled())
353 if exts:
354 rst.append('\n')
355 rst.extend(exts)
356
357 rst.append(_("\nadditional help topics:\n\n"))
358 topics = []
359 for names, header, doc in helptable:
360 topics.append((names[0], header))
361 for t, desc in topics:
362 rst.append(" :%s: %s\n" % (t, desc))
363
364 optlist = []
365 if not ui.quiet:
366 if ui.verbose:
367 optlist.append((_("global options:"), commands.globalopts))
368 if name == 'shortlist':
369 optlist.append((_('use "hg help" for the full list '
370 'of commands'), ()))
371 else:
372 if name == 'shortlist':
373 msg = _('use "hg help" for the full list of commands '
374 'or "hg -v" for details')
375 elif name and not full:
376 msg = _('use "hg help %s" to show the full help '
377 'text') % name
378 else:
379 msg = _('use "hg -v help%s" to show builtin aliases and '
380 'global options') % (name and " " + name or "")
381 optlist.append((msg, ()))
382
383 if optlist:
384 for title, options in optlist:
385 rst.append('\n%s\n' % title)
386 if options:
387 rst.append('\n%s\n' % optrst(options, ui.verbose))
388 return rst
389
390 def helptopic(name):
391 for names, header, doc in helptable:
392 if name in names:
393 break
394 else:
395 raise error.UnknownCommand(name)
396
397 rst = ["%s\n\n" % header]
398 # description
399 if not doc:
400 rst.append(" %s\n" % _("(no help text available)"))
401 if util.safehasattr(doc, '__call__'):
402 rst += [" %s\n" % l for l in doc().splitlines()]
403
404 if not ui.verbose:
405 omitted = (_('use "hg help -v %s" to show more complete help') %
406 name)
407 indicateomitted(rst, omitted)
408
409 try:
410 cmdutil.findcmd(name, commands.table)
411 rst.append(_('\nuse "hg help -c %s" to see help for '
412 'the %s command\n') % (name, name))
413 except error.UnknownCommand:
414 pass
415 return rst
416
417 def helpext(name):
418 try:
419 mod = extensions.find(name)
420 doc = gettext(mod.__doc__) or _('no help text available')
421 except KeyError:
422 mod = None
423 doc = extensions.disabledext(name)
424 if not doc:
425 raise error.UnknownCommand(name)
426
427 if '\n' not in doc:
428 head, tail = doc, ""
429 else:
430 head, tail = doc.split('\n', 1)
431 rst = [_('%s extension - %s\n\n') % (name.split('.')[-1], head)]
432 if tail:
433 rst.extend(tail.splitlines(True))
434 rst.append('\n')
435
436 if not ui.verbose:
437 omitted = (_('use "hg help -v %s" to show more complete help') %
438 name)
439 indicateomitted(rst, omitted)
440
441 if mod:
442 try:
443 ct = mod.cmdtable
444 except AttributeError:
445 ct = {}
446 modcmds = set([c.split('|', 1)[0] for c in ct])
447 rst.extend(helplist(modcmds.__contains__))
448 else:
449 rst.append(_('use "hg help extensions" for information on enabling '
450 'extensions\n'))
451 return rst
452
453 def helpextcmd(name):
454 cmd, ext, mod = extensions.disabledcmd(ui, name,
455 ui.configbool('ui', 'strict'))
456 doc = gettext(mod.__doc__).splitlines()[0]
457
458 rst = listexts(_("'%s' is provided by the following "
459 "extension:") % cmd, {ext: doc}, indent=4)
460 rst.append('\n')
461 rst.append(_('use "hg help extensions" for information on enabling '
462 'extensions\n'))
463 return rst
464
465
466 rst = []
467 kw = opts.get('keyword')
468 if kw:
469 matches = topicmatch(kw)
470 for t, title in (('topics', _('Topics')),
471 ('commands', _('Commands')),
472 ('extensions', _('Extensions')),
473 ('extensioncommands', _('Extension Commands'))):
474 if matches[t]:
475 rst.append('%s:\n\n' % title)
476 rst.extend(minirst.maketable(sorted(matches[t]), 1))
477 rst.append('\n')
478 elif name and name != 'shortlist':
479 i = None
480 if unknowncmd:
481 queries = (helpextcmd,)
482 elif opts.get('extension'):
483 queries = (helpext,)
484 elif opts.get('command'):
485 queries = (helpcmd,)
486 else:
487 queries = (helptopic, helpcmd, helpext, helpextcmd)
488 for f in queries:
489 try:
490 rst = f(name)
491 i = None
492 break
493 except error.UnknownCommand, inst:
494 i = inst
495 if i:
496 raise i
497 else:
498 # program name
499 if not ui.quiet:
500 rst = [_("Mercurial Distributed SCM\n"), '\n']
501 rst.extend(helplist())
502
503 return ''.join(rst)
General Comments 0
You need to be logged in to leave comments. Login now