sapling/hgext/fbshow.py
Stanislau Hlebik 87a6499b5f add getcmdanddefaultopts
Summary:
Add a function that returns command and all the default options already
initialized. It should be used by commands that call other commands. For
example, calling pull inside of update, calling log inside of show etc.
getcmdanddefaultopts has important benefits:
1) It returns "wrapped" command i.e. command with all the overrides applied. On
the other hand, commands.pull doesn't return it.
2) It correctly initializes options to their default value and correctly
changes their name - replace '-'  with '_'.

Reviewed By: ryanmce

Differential Revision: D7193296

fbshipit-source-id: e8673bd4e16aad6156498660f2a7ed788ed2cac3
2018-04-13 21:51:24 -07:00

116 lines
3.6 KiB
Python

# fbshow.py
#
# Copyright 2016 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""show changesets in detail with full log message, patches etc
For example, 'hg show' prints something like
::
$ hg show
changeset: 1:b73358b94785
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
files: x
description:
longer
diff -r 852a8d467a01 -r b73358b94785 x
--- a/x Thu Jan 01 00:00:00 1970 +0000
+++ b/x Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +1,2 @@
show
+more
and 'hg show --stat' prints something like:
$ hg show --stat
changeset: 1:b73358b94785
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
files: x
description:
longer
x | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
"""
from mercurial.i18n import _
from mercurial import cmdutil, commands, error, registrar, scmutil
cmdtable = {}
command = registrar.command(cmdtable)
testedwith = 'ships-with-fb-hgext'
def uisetup(ui):
permitted_opts = [
('g', 'git', None, _('use git extended diff format')),
('', 'stat', None, _('output diffstat-style summary of changes')),
] + commands.templateopts + commands.walkopts
local_opts = [
('', 'nodates', None, _('omit dates from diff headers ' +
'(but keeps it in commit header)')),
('', 'noprefix', None, _('omit a/ and b/ prefixes from filenames')),
('U', 'unified', int, _('number of lines of diff context to show')),
] + commands.diffwsopts
aliases, entry = cmdutil.findcmd('log', commands.table)
allowed_opts = [opt for opt in entry[1]
if opt in permitted_opts] + local_opts
# manual call of the decorator
command('^show',
allowed_opts,
_('[OPTION]... [REV [FILE]...]'),
inferrepo=True)(show)
def show(ui, repo, *args, **opts):
"""show revision in detail
This behaves similarly to :hg:`log -vp -r REV [OPTION]... [FILE]...`, or
if called without a REV, :hg:`log -vp -r . [OPTION]...` Use
:hg:`log` for more powerful operations than supported by hg show
See :hg:`help templates` for more about pre-packaged styles and
specifying custom templates.
"""
ui.pager('show')
if len(args) == 0:
opts['rev'] = ['.']
pats = []
else:
opts['rev'] = [args[0]]
pats = args[1:]
if not scmutil.revrange(repo, opts['rev']):
h = _("if %s is a file, try `hg show . %s`") % (args[0], args[0])
raise error.Abort(_("unknown revision %s") % args[0],
hint=h)
opts['patch'] = not opts['stat']
opts['verbose'] = True
# Copy tracking is slow when doing a git diff. Override hgrc, and rely on
# opts getting us a git diff if it's been requested. Ideally, we'd find and
# fix the slowness in copy tracking, but this works for now.
# On a commit with lots of possible copies, Bryan O'Sullivan found that this
# reduces "time hg show" from 1.76 seconds to 0.81 seconds.
overrides = {('diff', 'git'): opts.get('git')
,('diff', 'unified'): opts.get('unified')
,('ui', 'verbose'): True}
overrides.update({('diff', opt): opts.get(opt)
for opt in commands.diffwsopts})
logcmd, defaultlogopts = cmdutil.getcmdanddefaultopts('log', commands.table)
defaultlogopts.update(opts)
with ui.configoverride(overrides, 'show'):
logcmd(ui, repo, *pats, **defaultlogopts)