335 user = revcache.get(rev) |
335 user = revcache.get(rev) |
336 if user is None: |
336 if user is None: |
337 user = revcache[rev] = ui.shortuser(name) |
337 user = revcache[rev] = ui.shortuser(name) |
338 return user |
338 return user |
339 |
339 |
340 def show_changeset(ui, repo, rev=0, changenode=None, brinfo=None): |
340 class changeset_templater(object): |
341 """show a single changeset or file revision""" |
341 def __init__(self, ui, repo, mapfile): |
342 log = repo.changelog |
342 self.t = templater.templater(mapfile, templater.common_filters) |
343 if changenode is None: |
343 self.ui = ui |
344 changenode = log.node(rev) |
344 self.repo = repo |
345 elif not rev: |
345 |
346 rev = log.rev(changenode) |
346 def use_template(self, t): |
347 |
347 self.t.cache['template'] = t |
348 if ui.quiet: |
348 |
349 ui.write("%d:%s\n" % (rev, short(changenode))) |
349 def write(self, thing): |
350 return |
350 for t in thing: |
351 |
351 if hasattr(t, '__iter__'): |
352 changes = log.read(changenode) |
352 self.write(t) |
353 date = util.datestr(changes[2]) |
353 else: |
354 |
354 self.ui.write(t) |
355 parents = [(log.rev(p), ui.verbose and hex(p) or short(p)) |
355 |
356 for p in log.parents(changenode) |
356 def show(self, rev=0, changenode=None, brinfo=None): |
357 if ui.debugflag or p != nullid] |
357 """show a single changeset or file revision""" |
358 if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1: |
358 log = self.repo.changelog |
359 parents = [] |
359 if changenode is None: |
360 |
360 changenode = log.node(rev) |
361 if ui.verbose: |
361 elif not rev: |
362 ui.write(_("changeset: %d:%s\n") % (rev, hex(changenode))) |
362 rev = log.rev(changenode) |
|
363 |
|
364 changes = log.read(changenode) |
|
365 |
|
366 def showlist(name, values, plural=None, **args): |
|
367 if plural: names = plural |
|
368 else: names = name + 's' |
|
369 if not values: |
|
370 noname = 'no_' + names |
|
371 if noname in self.t: |
|
372 yield self.t(noname, **args) |
|
373 return |
|
374 vargs = args.copy() |
|
375 if name not in self.t: |
|
376 yield ' '.join(values) |
|
377 return |
|
378 startname = 'start_' + names |
|
379 if startname in self.t: |
|
380 yield self.t(startname, **args) |
|
381 def one(v): |
|
382 try: |
|
383 vargs.update(v) |
|
384 except ValueError: |
|
385 vargs.update([(name, v)]) |
|
386 return self.t(name, **vargs) |
|
387 lastname = 'last_' + name |
|
388 if lastname in self.t: |
|
389 last = values.pop() |
|
390 else: |
|
391 last = None |
|
392 for v in values: |
|
393 yield one(v) |
|
394 if last is not None: |
|
395 name = lastname |
|
396 yield one(last) |
|
397 endname = 'end_' + names |
|
398 if endname in self.t: |
|
399 yield self.t(endname, **args) |
|
400 |
|
401 if brinfo: |
|
402 def showbranches(**args): |
|
403 if changenode in brinfo: |
|
404 for x in showlist('branch', brinfo[changenode], |
|
405 plural='branches', **args): |
|
406 yield x |
|
407 else: |
|
408 showbranches = '' |
|
409 |
|
410 def showmanifest(**args): |
|
411 args = args.copy() |
|
412 args.update(rev=self.repo.manifest.rev(changes[0]), |
|
413 node=hex(changes[0])) |
|
414 yield self.t('manifest', **args) |
|
415 |
|
416 def showparents(**args): |
|
417 parents = [[('rev', log.rev(p)), ('node', hex(p))] |
|
418 for p in log.parents(changenode) |
|
419 if self.ui.debugflag or p != nullid] |
|
420 if (not self.ui.debugflag and len(parents) == 1 and |
|
421 parents[0][0][1] == rev - 1): |
|
422 return |
|
423 for x in showlist('parent', parents, **args): |
|
424 yield x |
|
425 |
|
426 def showtags(**args): |
|
427 for x in showlist('tag', self.repo.nodetags(changenode), **args): |
|
428 yield x |
|
429 |
|
430 if self.ui.debugflag: |
|
431 files = self.repo.changes(log.parents(changenode)[0], changenode) |
|
432 def showfiles(**args): |
|
433 for x in showlist('file', files[0], **args): yield x |
|
434 def showadds(**args): |
|
435 for x in showlist('file_add', files[1], **args): yield x |
|
436 def showdels(**args): |
|
437 for x in showlist('file_del', files[2], **args): yield x |
|
438 else: |
|
439 def showfiles(**args): |
|
440 for x in showlist('file', changes[3], **args): yield x |
|
441 showadds = '' |
|
442 showdels = '' |
|
443 |
|
444 props = { |
|
445 'author': changes[1], |
|
446 'branches': showbranches, |
|
447 'date': changes[2], |
|
448 'desc': changes[4], |
|
449 'file_adds': showadds, |
|
450 'file_dels': showdels, |
|
451 'files': showfiles, |
|
452 'manifest': showmanifest, |
|
453 'node': hex(changenode), |
|
454 'parents': showparents, |
|
455 'rev': rev, |
|
456 'tags': showtags, |
|
457 } |
|
458 |
|
459 try: |
|
460 self.write(self.t('template', **props)) |
|
461 except KeyError, inst: |
|
462 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, |
|
463 inst.args[0])) |
|
464 except SyntaxError, inst: |
|
465 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
|
466 |
|
467 class changeset_printer(object): |
|
468 def __init__(self, ui, repo): |
|
469 self.ui = ui |
|
470 self.repo = repo |
|
471 |
|
472 def show(self, rev=0, changenode=None, brinfo=None): |
|
473 """show a single changeset or file revision""" |
|
474 log = self.repo.changelog |
|
475 if changenode is None: |
|
476 changenode = log.node(rev) |
|
477 elif not rev: |
|
478 rev = log.rev(changenode) |
|
479 |
|
480 if self.ui.quiet: |
|
481 self.ui.write("%d:%s\n" % (rev, short(changenode))) |
|
482 return |
|
483 |
|
484 changes = log.read(changenode) |
|
485 date = util.datestr(changes[2]) |
|
486 |
|
487 parents = [(log.rev(p), self.ui.verbose and hex(p) or short(p)) |
|
488 for p in log.parents(changenode) |
|
489 if self.ui.debugflag or p != nullid] |
|
490 if (not self.ui.debugflag and len(parents) == 1 and |
|
491 parents[0][0] == rev-1): |
|
492 parents = [] |
|
493 |
|
494 if self.ui.verbose: |
|
495 self.ui.write(_("changeset: %d:%s\n") % (rev, hex(changenode))) |
|
496 else: |
|
497 self.ui.write(_("changeset: %d:%s\n") % (rev, short(changenode))) |
|
498 |
|
499 for tag in self.repo.nodetags(changenode): |
|
500 self.ui.status(_("tag: %s\n") % tag) |
|
501 for parent in parents: |
|
502 self.ui.write(_("parent: %d:%s\n") % parent) |
|
503 |
|
504 if brinfo and changenode in brinfo: |
|
505 br = brinfo[changenode] |
|
506 self.ui.write(_("branch: %s\n") % " ".join(br)) |
|
507 |
|
508 self.ui.debug(_("manifest: %d:%s\n") % |
|
509 (self.repo.manifest.rev(changes[0]), hex(changes[0]))) |
|
510 self.ui.status(_("user: %s\n") % changes[1]) |
|
511 self.ui.status(_("date: %s\n") % date) |
|
512 |
|
513 if self.ui.debugflag: |
|
514 files = self.repo.changes(log.parents(changenode)[0], changenode) |
|
515 for key, value in zip([_("files:"), _("files+:"), _("files-:")], |
|
516 files): |
|
517 if value: |
|
518 self.ui.note("%-12s %s\n" % (key, " ".join(value))) |
|
519 else: |
|
520 self.ui.note(_("files: %s\n") % " ".join(changes[3])) |
|
521 |
|
522 description = changes[4].strip() |
|
523 if description: |
|
524 if self.ui.verbose: |
|
525 self.ui.status(_("description:\n")) |
|
526 self.ui.status(description) |
|
527 self.ui.status("\n\n") |
|
528 else: |
|
529 self.ui.status(_("summary: %s\n") % |
|
530 description.splitlines()[0]) |
|
531 self.ui.status("\n") |
|
532 |
|
533 def show_changeset(ui, repo, opts): |
|
534 tmpl = opts.get('template') |
|
535 if tmpl: |
|
536 tmpl = templater.parsestring(tmpl, quoted=False) |
363 else: |
537 else: |
364 ui.write(_("changeset: %d:%s\n") % (rev, short(changenode))) |
538 tmpl = ui.config('ui', 'logtemplate') |
365 |
539 if tmpl: tmpl = templater.parsestring(tmpl) |
366 for tag in repo.nodetags(changenode): |
540 mapfile = opts.get('map_file') or ui.config('ui', 'logmap') |
367 ui.status(_("tag: %s\n") % tag) |
541 if tmpl or mapfile: |
368 for parent in parents: |
542 if mapfile: |
369 ui.write(_("parent: %d:%s\n") % parent) |
543 if not os.path.isfile(mapfile): |
370 |
544 mapname = templater.templatepath(mapfile) |
371 if brinfo and changenode in brinfo: |
545 if mapname: mapfile = mapname |
372 br = brinfo[changenode] |
546 try: |
373 ui.write(_("branch: %s\n") % " ".join(br)) |
547 t = changeset_templater(ui, repo, mapfile) |
374 |
548 except SyntaxError, inst: |
375 ui.debug(_("manifest: %d:%s\n") % (repo.manifest.rev(changes[0]), |
549 raise util.Abort(inst.args[0]) |
376 hex(changes[0]))) |
550 if tmpl: t.use_template(tmpl) |
377 ui.status(_("user: %s\n") % changes[1]) |
551 return t |
378 ui.status(_("date: %s\n") % date) |
552 return changeset_printer(ui, repo) |
379 |
|
380 if ui.debugflag: |
|
381 files = repo.changes(log.parents(changenode)[0], changenode) |
|
382 for key, value in zip([_("files:"), _("files+:"), _("files-:")], files): |
|
383 if value: |
|
384 ui.note("%-12s %s\n" % (key, " ".join(value))) |
|
385 else: |
|
386 ui.note(_("files: %s\n") % " ".join(changes[3])) |
|
387 |
|
388 description = changes[4].strip() |
|
389 if description: |
|
390 if ui.verbose: |
|
391 ui.status(_("description:\n")) |
|
392 ui.status(description) |
|
393 ui.status("\n\n") |
|
394 else: |
|
395 ui.status(_("summary: %s\n") % description.splitlines()[0]) |
|
396 ui.status("\n") |
|
397 |
553 |
398 def show_version(ui): |
554 def show_version(ui): |
399 """output version and copyright information""" |
555 """output version and copyright information""" |
400 ui.write(_("Mercurial Distributed SCM (version %s)\n") |
556 ui.write(_("Mercurial Distributed SCM (version %s)\n") |
401 % version.get_version()) |
557 % version.get_version()) |
2475 _('skip check for outstanding uncommitted changes')), |
2639 _('skip check for outstanding uncommitted changes')), |
2476 ('b', 'base', '', _('base path'))], |
2640 ('b', 'base', '', _('base path'))], |
2477 _('hg import [-f] [-p NUM] [-b BASE] PATCH...')), |
2641 _('hg import [-f] [-p NUM] [-b BASE] PATCH...')), |
2478 "incoming|in": (incoming, |
2642 "incoming|in": (incoming, |
2479 [('M', 'no-merges', None, _('do not show merges')), |
2643 [('M', 'no-merges', None, _('do not show merges')), |
|
2644 ('', 'map-file', '', _('display using template map file')), |
|
2645 ('n', 'newest-first', None, _('show newest record first')), |
2480 ('p', 'patch', None, _('show patch')), |
2646 ('p', 'patch', None, _('show patch')), |
2481 ('n', 'newest-first', None, _('show newest record first'))], |
2647 ('t', 'template', '', _('display with template'))], |
2482 _('hg incoming [-p] [-n] [-M] [SOURCE]')), |
2648 _('hg incoming [-p] [-n] [-M] [SOURCE]')), |
2483 "^init": (init, [], _('hg init [DEST]')), |
2649 "^init": (init, [], _('hg init [DEST]')), |
2484 "locate": |
2650 "locate": |
2485 (locate, |
2651 (locate, |
2486 [('r', 'rev', '', _('search the repository as it stood at rev')), |
2652 [('r', 'rev', '', _('search the repository as it stood at rev')), |
2498 ('b', 'branches', None, _('show branches')), |
2664 ('b', 'branches', None, _('show branches')), |
2499 ('k', 'keyword', [], _('search for a keyword')), |
2665 ('k', 'keyword', [], _('search for a keyword')), |
2500 ('l', 'limit', '', _('limit number of changes displayed')), |
2666 ('l', 'limit', '', _('limit number of changes displayed')), |
2501 ('r', 'rev', [], _('show the specified revision or range')), |
2667 ('r', 'rev', [], _('show the specified revision or range')), |
2502 ('M', 'no-merges', None, _('do not show merges')), |
2668 ('M', 'no-merges', None, _('do not show merges')), |
|
2669 ('', 'map-file', '', _('display using template map file')), |
2503 ('m', 'only-merges', None, _('show only merges')), |
2670 ('m', 'only-merges', None, _('show only merges')), |
2504 ('p', 'patch', None, _('show patch'))], |
2671 ('p', 'patch', None, _('show patch')), |
|
2672 ('t', 'template', '', _('display with template'))], |
2505 _('hg log [-I] [-X] [-r REV]... [-p] [FILE]')), |
2673 _('hg log [-I] [-X] [-r REV]... [-p] [FILE]')), |
2506 "manifest": (manifest, [], _('hg manifest [REV]')), |
2674 "manifest": (manifest, [], _('hg manifest [REV]')), |
2507 "outgoing|out": (outgoing, |
2675 "outgoing|out": (outgoing, |
2508 [('M', 'no-merges', None, _('do not show merges')), |
2676 [('M', 'no-merges', None, _('do not show merges')), |
2509 ('p', 'patch', None, _('show patch')), |
2677 ('p', 'patch', None, _('show patch')), |
2510 ('n', 'newest-first', None, _('show newest record first'))], |
2678 ('', 'map-file', '', _('display using template map file')), |
|
2679 ('n', 'newest-first', None, _('show newest record first')), |
|
2680 ('t', 'template', '', _('display with template'))], |
2511 _('hg outgoing [-p] [-n] [-M] [DEST]')), |
2681 _('hg outgoing [-p] [-n] [-M] [DEST]')), |
2512 "^parents": |
2682 "^parents": |
2513 (parents, |
2683 (parents, |
2514 [('b', 'branches', None, _('show branches'))], |
2684 [('b', 'branches', None, _('show branches')), |
|
2685 ('', 'map-file', '', _('display using template map file')), |
|
2686 ('t', 'template', '', _('display with template'))], |
2515 _('hg parents [-b] [REV]')), |
2687 _('hg parents [-b] [REV]')), |
2516 "paths": (paths, [], _('hg paths [NAME]')), |
2688 "paths": (paths, [], _('hg paths [NAME]')), |
2517 "^pull": |
2689 "^pull": |
2518 (pull, |
2690 (pull, |
2519 [('u', 'update', None, |
2691 [('u', 'update', None, |
2600 _('hg tag [-r REV] [OPTION]... NAME')), |
2772 _('hg tag [-r REV] [OPTION]... NAME')), |
2601 "tags": (tags, [], _('hg tags')), |
2773 "tags": (tags, [], _('hg tags')), |
2602 "tip": |
2774 "tip": |
2603 (tip, |
2775 (tip, |
2604 [('b', 'branches', None, _('show branches')), |
2776 [('b', 'branches', None, _('show branches')), |
2605 ('p', 'patch', None, _('show patch'))], |
2777 ('', 'map-file', '', _('display using template map file')), |
|
2778 ('p', 'patch', None, _('show patch')), |
|
2779 ('t', 'template', '', _('display with template'))], |
2606 _('hg [-b] [-p] tip')), |
2780 _('hg [-b] [-p] tip')), |
2607 "unbundle": |
2781 "unbundle": |
2608 (unbundle, |
2782 (unbundle, |
2609 [('u', 'update', None, |
2783 [('u', 'update', None, |
2610 _('update the working directory to tip after unbundle'))], |
2784 _('update the working directory to tip after unbundle'))], |
2611 _('hg unbundle [-u] FILE')), |
2785 _('hg unbundle [-u] FILE')), |
2612 "undo": (undo, [], _('hg undo')), |
2786 "undo": (undo, [], _('hg undo')), |
2613 "^update|up|checkout|co": |
2787 "^update|up|checkout|co": |
2614 (update, |
2788 (update, |
2615 [('b', 'branch', '', _('checkout the head of a specific branch')), |
2789 [('b', 'branch', '', _('checkout the head of a specific branch')), |
|
2790 ('', 'map-file', '', _('display using template map file')), |
2616 ('m', 'merge', None, _('allow merging of branches')), |
2791 ('m', 'merge', None, _('allow merging of branches')), |
2617 ('C', 'clean', None, _('overwrite locally modified files')), |
2792 ('C', 'clean', None, _('overwrite locally modified files')), |
2618 ('f', 'force', None, _('force a merge with outstanding changes'))], |
2793 ('f', 'force', None, _('force a merge with outstanding changes')), |
|
2794 ('t', 'template', '', _('display with template'))], |
2619 _('hg update [-b TAG] [-m] [-C] [-f] [REV]')), |
2795 _('hg update [-b TAG] [-m] [-C] [-f] [REV]')), |
2620 "verify": (verify, [], _('hg verify')), |
2796 "verify": (verify, [], _('hg verify')), |
2621 "version": (show_version, [], _('hg version')), |
2797 "version": (show_version, [], _('hg version')), |
2622 } |
2798 } |
2623 |
2799 |