##// END OF EJS Templates
phabricator: treat non-utf-8 text files as binary as phabricator requires...
phabricator: treat non-utf-8 text files as binary as phabricator requires Phabricator can't cope with text files that are not UTF-8, so requires them to be submitted as binary files instead. This has the unfortunate effect of making them practically unreviewable in Phabricator since it will only display the separate versions of the file in other views, not a diff. `phabread`ing such submissions are similar, since it will just output the binary patch, but `hg import` copes with it fine and `hg diff` afterwards will show the actual changes. It is still a marked improvement over trying to submit them as text, which just leads to corruption (Phabricator will either output ? or HTML entities for non-UTF-8 characters, depending on context). Running decode on the whole file like this seems slightly unfortunate, but I'm not aware of a better way. Needs to be done to p1() version as well to detect conversions to UTF-8. Differential Revision: https://phab.mercurial-scm.org/D7054

File last commit:

r43350:86e4daa2 default
r43557:06a33a50 default
Show More
show.py
530 lines | 15.9 KiB | text/x-python | PythonLexer
Gregory Szorc
show: new extension for displaying various repository data...
r31765 # show.py - Extension implementing `hg show`
#
# Copyright 2017 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""unified command to show various repository information (EXPERIMENTAL)
This extension provides the :hg:`show` command, which provides a central
command for displaying commonly-accessed repository data and views of that
data.
Gregory Szorc
show: config option to register aliases for views...
r33132
The following config options can influence operation.
``commands``
------------
``show.aliasprefix``
List of strings that will register aliases for views. e.g. ``s`` will
effectively set config options ``alias.s<view> = show <view>`` for all
views. i.e. `hg swork` would execute `hg show work`.
Aliases that would conflict with existing registrations will not be
performed.
Gregory Szorc
show: new extension for displaying various repository data...
r31765 """
from __future__ import absolute_import
from mercurial.i18n import _
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.node import nullrev
Gregory Szorc
show: new extension for displaying various repository data...
r31765 from mercurial import (
cmdutil,
Gregory Szorc
show: config option to register aliases for views...
r33132 commands,
Gregory Szorc
show: implement "stack" view...
r33194 destutil,
Gregory Szorc
show: new extension for displaying various repository data...
r31765 error,
Ryan McElroy
show: fix corrupt json output with no bookmarks
r31859 formatter,
Gregory Szorc
show: implement underway view...
r31944 graphmod,
Yuya Nishihara
cmdutil: drop aliases for logcmdutil functions (API)...
r35906 logcmdutil,
Gregory Szorc
show: implement "stack" view...
r33194 phases,
Yuya Nishihara
py3: have registrar process docstrings in bytes...
r31820 pycompat,
Gregory Szorc
show: new extension for displaying various repository data...
r31765 registrar,
Gregory Szorc
show: implement underway view...
r31944 revset,
revsetlang,
Martin von Zweigbergk
scmutil: introduce shortesthexnodeidprefix()...
r37698 scmutil,
Gregory Szorc
show: new extension for displaying various repository data...
r31765 )
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
# be specifying the version(s) of Mercurial they are tested with, or
# leave the attribute unspecified.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 testedwith = b'ships-with-hg-core'
Gregory Szorc
show: new extension for displaying various repository data...
r31765
cmdtable = {}
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 command = registrar.command(cmdtable)
Boris Feld
configitems: register the 'commands.show.aliasprefix' config
r34519
Gregory Szorc
show: implement underway view...
r31944 revsetpredicate = registrar.revsetpredicate()
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
show: new extension for displaying various repository data...
r31765 class showcmdfunc(registrar._funcregistrarbase):
"""Register a function to be invoked for an `hg show <thing>`."""
# Used by _formatdoc().
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _docformat = b'%s -- %s'
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 def _extrasetup(self, name, func, fmtopic=None, csettopic=None):
Gregory Szorc
show: new extension for displaying various repository data...
r31765 """Called with decorator arguments to register a show view.
``name`` is the sub-command name.
``func`` is the function being decorated.
``fmtopic`` is the topic in the style that will be rendered for
this view.
Gregory Szorc
show: construct changeset templater during dispatch...
r33046
``csettopic`` is the topic in the style to be used for a changeset
printer.
If ``fmtopic`` is specified, the view function will receive a
formatter instance. If ``csettopic`` is specified, the view
function will receive a changeset printer.
Gregory Szorc
show: new extension for displaying various repository data...
r31765 """
func._fmtopic = fmtopic
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 func._csettopic = csettopic
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
show: new extension for displaying various repository data...
r31765 showview = showcmdfunc()
Augie Fackler
formatting: blacken the codebase...
r43346
@command(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'show',
Augie Fackler
formatting: blacken the codebase...
r43346 [
# TODO: Switch this template flag to use cmdutil.formatteropts if
# 'hg show' becomes stable before --template/-T is stable. For now,
# we are putting it here without the '(EXPERIMENTAL)' flag because it
# is an important part of the 'hg show' user experience and the entire
# 'hg show' experience is experimental.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 (b'T', b'template', b'', b'display with template', _(b'TEMPLATE')),
Augie Fackler
formatting: blacken the codebase...
r43346 ],
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'VIEW'),
Augie Fackler
formatting: blacken the codebase...
r43346 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
)
Gregory Szorc
show: new extension for displaying various repository data...
r31765 def show(ui, repo, view=None, template=None):
"""show various repository information
A requested view of repository data is displayed.
If no view is requested, the list of available views is shown and the
command aborts.
.. note::
There are no backwards compatibility guarantees for the output of this
command. Output may change in any future Mercurial release.
Consumers wanting stable command output should specify a template via
``-T/--template``.
List of available views:
"""
if ui.plain() and not template:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 hint = _(b'invoke with -T/--template to control output format')
raise error.Abort(
_(b'must specify a template in plain mode'), hint=hint
)
Gregory Szorc
show: new extension for displaying various repository data...
r31765
views = showview._table
if not view:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.pager(b'show')
Gregory Szorc
show: new extension for displaying various repository data...
r31765 # TODO consider using formatter here so available views can be
# rendered to custom format.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(_(b'available views:\n'))
ui.write(b'\n')
Gregory Szorc
show: new extension for displaying various repository data...
r31765
for name, func in sorted(views.items()):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'%s\n' % pycompat.sysbytes(func.__doc__))
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'no view requested'),
hint=_(b'use "hg show VIEW" to choose a view'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: new extension for displaying various repository data...
r31765
# TODO use same logic as dispatch to perform prefix matching.
if view not in views:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'unknown view: %s') % view,
hint=_(b'run "hg show" to see available views'),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 template = template or b'show'
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 fn = views[view]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.pager(b'show')
Gregory Szorc
show: construct changeset templater during dispatch...
r33046
if fn._fmtopic:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fmtopic = b'show%s' % fn._fmtopic
with ui.formatter(fmtopic, {b'template': template}) as fm:
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 return fn(ui, repo, fm)
elif fn._csettopic:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ref = b'show%s' % fn._csettopic
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 spec = formatter.lookuptemplate(ui, ref, template)
Yuya Nishihara
cmdutil: drop aliases for logcmdutil functions (API)...
r35906 displayer = logcmdutil.changesettemplater(ui, repo, spec, buffered=True)
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 return fn(ui, repo, displayer)
else:
return fn(ui, repo)
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @showview(b'bookmarks', fmtopic=b'bookmarks')
Gregory Szorc
show: new extension for displaying various repository data...
r31765 def showbookmarks(ui, repo, fm):
"""bookmarks and their associated changeset"""
marks = repo._bookmarks
if not len(marks):
Ryan McElroy
show: fix corrupt json output with no bookmarks
r31859 # This is a bit hacky. Ideally, templates would have a way to
# specify an empty output, but we shouldn't corrupt JSON while
# waiting for this functionality.
if not isinstance(fm, formatter.jsonformatter):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(_(b'(no bookmarks set)\n'))
Gregory Szorc
show: new extension for displaying various repository data...
r31765 return
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 revs = [repo[node].rev() for node in marks.values()]
Gregory Szorc
show: new extension for displaying various repository data...
r31765 active = repo._activebookmark
longestname = max(len(b) for b in marks)
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 nodelen = longestshortest(repo, revs)
Gregory Szorc
show: new extension for displaying various repository data...
r31765
for bm, node in sorted(marks.items()):
fm.startitem()
fm.context(ctx=repo[node])
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fm.write(b'bookmark', b'%s', bm)
fm.write(b'node', fm.hexfunc(node), fm.hexfunc(node))
Augie Fackler
formatting: blacken the codebase...
r43346 fm.data(
active=bm == active, longestbookmarklen=longestname, nodelen=nodelen
)
Gregory Szorc
show: new extension for displaying various repository data...
r31765
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @showview(b'stack', csettopic=b'stack')
Gregory Szorc
show: implement "stack" view...
r33194 def showstack(ui, repo, displayer):
"""current line of work"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 wdirctx = repo[b'.']
Gregory Szorc
show: implement "stack" view...
r33194 if wdirctx.rev() == nullrev:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(
b'stack view only available when there is a '
b'working directory'
)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: implement "stack" view...
r33194
if wdirctx.phase() == phases.public:
Augie Fackler
formatting: blacken the codebase...
r43346 ui.write(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'(empty stack; working directory parent is a published '
b'changeset)\n'
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Gregory Szorc
show: implement "stack" view...
r33194 return
# TODO extract "find stack" into a function to facilitate
# customization and reuse.
baserev = destutil.stackbase(ui, repo)
basectx = None
if baserev is None:
baserev = wdirctx.rev()
stackrevs = {wdirctx.rev()}
else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 stackrevs = set(repo.revs(b'%d::.', baserev))
Gregory Szorc
show: implement "stack" view...
r33194
ctx = repo[baserev]
if ctx.p1().rev() != nullrev:
basectx = ctx.p1()
# And relevant descendants.
branchpointattip = False
cl = repo.changelog
for rev in cl.descendants([wdirctx.rev()]):
ctx = repo[rev]
# Will only happen if . is public.
if ctx.phase() == phases.public:
break
stackrevs.add(ctx.rev())
Gregory Szorc
show: document why accidentally quadratic is (probably) acceptable
r33208 # ctx.children() within a function iterating on descandants
# potentially has severe performance concerns because revlog.children()
# iterates over all revisions after ctx's node. However, the number of
# draft changesets should be a reasonably small number. So even if
# this is quadratic, the perf impact should be minimal.
Gregory Szorc
show: implement "stack" view...
r33194 if len(ctx.children()) > 1:
branchpointattip = True
break
Gregory Szorc
show: avoid extra list operations
r33206 stackrevs = list(sorted(stackrevs, reverse=True))
Gregory Szorc
show: implement "stack" view...
r33194
# Find likely target heads for the current stack. These are likely
# merge or rebase targets.
if basectx:
# TODO make this customizable?
Augie Fackler
formatting: blacken the codebase...
r43346 newheads = set(
repo.revs(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'heads(%d::) - %ld - not public()', basectx.rev(), stackrevs
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Gregory Szorc
show: implement "stack" view...
r33194 else:
newheads = set()
Martin von Zweigbergk
cleanup: use set literals where possible...
r42224 allrevs = set(stackrevs) | newheads | {baserev}
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 nodelen = longestshortest(repo, allrevs)
Gregory Szorc
show: implement "stack" view...
r33194 try:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cmdutil.findcmd(b'rebase', commands.table)
Gregory Szorc
show: implement "stack" view...
r33194 haverebase = True
Gregory Szorc
show: also catch AmbiguousCommand...
r33207 except (error.AmbiguousCommand, error.UnknownCommand):
Gregory Szorc
show: implement "stack" view...
r33194 haverebase = False
# TODO use templating.
# TODO consider using graphmod. But it may not be necessary given
# our simplicity and the customizations required.
# TODO use proper graph symbols from graphmod
Yuya Nishihara
templater: move repo, ui and cache to per-engine resources
r35485 tres = formatter.templateresources(ui, repo)
Augie Fackler
formatting: blacken the codebase...
r43346 shortesttmpl = formatter.maketemplater(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui, b'{shortest(node, %d)}' % nodelen, resources=tres
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: implement "stack" view...
r33194 def shortest(ctx):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return shortesttmpl.renderdefault({b'ctx': ctx, b'node': ctx.hex()})
Gregory Szorc
show: implement "stack" view...
r33194
# We write out new heads to aid in DAG awareness and to help with decision
# making on how the stack should be reconciled with commits made since the
# branch point.
if newheads:
# Calculate distance from base so we can render the count and so we can
# sort display order by commit distance.
revdistance = {}
for head in newheads:
# There is some redundancy in DAG traversal here and therefore
# room to optimize.
ancestors = cl.ancestors([head], stoprev=basectx.rev())
revdistance[head] = len(list(ancestors))
sourcectx = repo[stackrevs[-1]]
Augie Fackler
formatting: blacken the codebase...
r43346 sortedheads = sorted(
newheads, key=lambda x: revdistance[x], reverse=True
)
Gregory Szorc
show: implement "stack" view...
r33194
for i, rev in enumerate(sortedheads):
ctx = repo[rev]
if i:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b': ')
Gregory Szorc
show: implement "stack" view...
r33194 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' ')
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n...
r43350 ui.writenoi18n(b'o ')
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 displayer.show(ctx, nodelen=nodelen)
Gregory Szorc
show: implement "stack" view...
r33194 displayer.flush(ctx)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
Gregory Szorc
show: implement "stack" view...
r33194
if i:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b':/')
Gregory Szorc
show: implement "stack" view...
r33194 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' /')
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' (')
Augie Fackler
formatting: blacken the codebase...
r43346 ui.write(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'%d commits ahead') % revdistance[rev],
label=b'stack.commitdistance',
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: implement "stack" view...
r33194
if haverebase:
# TODO may be able to omit --source in some scenarios
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'; ')
Augie Fackler
formatting: blacken the codebase...
r43346 ui.write(
(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'hg rebase --source %s --dest %s'
Augie Fackler
formatting: blacken the codebase...
r43346 % (shortest(sourcectx), shortest(ctx))
),
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 label=b'stack.rebasehint',
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b')\n')
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b':\n: ')
ui.write(_(b'(stack head)\n'), label=b'stack.label')
Gregory Szorc
show: implement "stack" view...
r33194
if branchpointattip:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' \\ / ')
ui.write(_(b'(multiple children)\n'), label=b'stack.label')
ui.write(b' |\n')
Gregory Szorc
show: implement "stack" view...
r33194
for rev in stackrevs:
ctx = repo[rev]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 symbol = b'@' if rev == wdirctx.rev() else b'o'
Gregory Szorc
show: implement "stack" view...
r33194
if newheads:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b': ')
Gregory Szorc
show: implement "stack" view...
r33194 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' ')
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(symbol, b' ')
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 displayer.show(ctx, nodelen=nodelen)
Gregory Szorc
show: implement "stack" view...
r33194 displayer.flush(ctx)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
Gregory Szorc
show: implement "stack" view...
r33194
# TODO display histedit hint?
if basectx:
# Vertically and horizontally separate stack base from parent
# to reinforce stack boundary.
if newheads:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b':/ ')
Gregory Szorc
show: implement "stack" view...
r33194 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b' / ')
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(_(b'(stack base)'), b'\n', label=b'stack.label')
Augie Fackler
cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n...
r43350 ui.writenoi18n(b'o ')
Gregory Szorc
show: implement "stack" view...
r33194
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 displayer.show(basectx, nodelen=nodelen)
Gregory Szorc
show: implement "stack" view...
r33194 displayer.flush(basectx)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.write(b'\n')
Gregory Szorc
show: implement "stack" view...
r33194
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @revsetpredicate(b'_underway([commitage[, headage]])')
Gregory Szorc
show: implement underway view...
r31944 def underwayrevset(repo, subset, x):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args = revset.getargsdict(x, b'underway', b'commitage headage')
if b'commitage' not in args:
args[b'commitage'] = None
if b'headage' not in args:
args[b'headage'] = None
Gregory Szorc
show: implement underway view...
r31944
# We assume callers of this revset add a topographical sort on the
# result. This means there is no benefit to making the revset lazy
# since the topographical sort needs to consume all revs.
#
# With this in mind, we build up the set manually instead of constructing
# a complex revset. This enables faster execution.
# Mutable changesets (non-public) are the most important changesets
# to return. ``not public()`` will also pull in obsolete changesets if
# there is a non-obsolete changeset with obsolete ancestors. This is
# why we exclude obsolete changesets from this query.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 rs = b'not public() and not obsolete()'
Gregory Szorc
show: implement underway view...
r31944 rsargs = []
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if args[b'commitage']:
rs += b' and date(%s)'
Augie Fackler
formatting: blacken the codebase...
r43346 rsargs.append(
revsetlang.getstring(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'commitage'], _(b'commitage requires a string')
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Gregory Szorc
show: implement underway view...
r31944
mutable = repo.revs(rs, *rsargs)
relevant = revset.baseset(mutable)
# Add parents of mutable changesets to provide context.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 relevant += repo.revs(b'parents(%ld)', mutable)
Gregory Szorc
show: implement underway view...
r31944
# We also pull in (public) heads if they a) aren't closing a branch
# b) are recent.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 rs = b'head() and not closed()'
Gregory Szorc
show: implement underway view...
r31944 rsargs = []
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if args[b'headage']:
rs += b' and date(%s)'
Augie Fackler
formatting: blacken the codebase...
r43346 rsargs.append(
revsetlang.getstring(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 args[b'headage'], _(b'headage requires a string')
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Gregory Szorc
show: implement underway view...
r31944
relevant += repo.revs(rs, *rsargs)
# Add working directory parent.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 wdirrev = repo[b'.'].rev()
Gregory Szorc
show: implement underway view...
r31944 if wdirrev != nullrev:
Martin von Zweigbergk
cleanup: use set literals...
r32291 relevant += revset.baseset({wdirrev})
Gregory Szorc
show: implement underway view...
r31944
return subset & relevant
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 @showview(b'work', csettopic=b'work')
Gregory Szorc
show: construct changeset templater during dispatch...
r33046 def showwork(ui, repo, displayer):
Gregory Szorc
show: implement underway view...
r31944 """changesets that aren't finished"""
# TODO support date-based limiting when calling revset.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 revs = repo.revs(b'sort(_underway(), topo)')
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 nodelen = longestshortest(repo, revs)
Gregory Szorc
show: implement underway view...
r31944
revdag = graphmod.dagwalker(repo, revs)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.setconfig(b'experimental', b'graphshorten', True)
Augie Fackler
formatting: blacken the codebase...
r43346 logcmdutil.displaygraph(
ui,
repo,
revdag,
displayer,
graphmod.asciiedges,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 props={b'nodelen': nodelen},
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: implement underway view...
r31944
Gregory Szorc
show: config option to register aliases for views...
r33132 def extsetup(ui):
# Alias `hg <prefix><view>` to `hg show <view>`.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 for prefix in ui.configlist(b'commands', b'show.aliasprefix'):
Gregory Szorc
show: config option to register aliases for views...
r33132 for view in showview._table:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 name = b'%s%s' % (prefix, view)
Gregory Szorc
show: config option to register aliases for views...
r33132
Augie Fackler
formatting: blacken the codebase...
r43346 choice, allcommands = cmdutil.findpossible(
name, commands.table, strict=True
)
Gregory Szorc
show: config option to register aliases for views...
r33132
# This alias is already a command name. Don't set it.
if name in choice:
continue
# Same for aliases.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if ui.config(b'alias', name, None):
Gregory Szorc
show: config option to register aliases for views...
r33132 continue
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 ui.setconfig(b'alias', name, b'show %s' % view, source=b'show')
Gregory Szorc
show: config option to register aliases for views...
r33132
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192 def longestshortest(repo, revs, minlen=4):
"""Return the length of the longest shortest node to identify revisions.
The result of this function can be used with the ``shortest()`` template
function to ensure that a value is unique and unambiguous for a given
set of nodes.
The number of revisions in the repo is taken into account to prevent
a numeric node prefix from conflicting with an integer revision number.
If we fail to do this, a value of e.g. ``10023`` could mean either
revision 10023 or node ``10023abc...``.
"""
Yuya Nishihara
show: use revlog function to compute length of the longest shortest node...
r35514 if not revs:
return minlen
Martin von Zweigbergk
scmutil: introduce shortesthexnodeidprefix()...
r37698 cl = repo.changelog
Augie Fackler
formatting: blacken the codebase...
r43346 return max(
len(scmutil.shortesthexnodeidprefix(repo, cl.node(r), minlen))
for r in revs
)
Gregory Szorc
show: use consistent (and possibly shorter) node lengths...
r34192
Gregory Szorc
show: new extension for displaying various repository data...
r31765 # Adjust the docstring of the show command so it shows all registered views.
# This is a bit hacky because it runs at the end of module load. When moved
# into core or when another extension wants to provide a view, we'll need
# to do this more robustly.
# TODO make this more robust.
Gregory Szorc
show: fix formatting of multiple commands...
r31943 def _updatedocstring():
longest = max(map(len, showview._table.keys()))
entries = []
for key in sorted(showview._table.keys()):
Augie Fackler
formatting: blacken the codebase...
r43346 entries.append(
r' %s %s'
% (
pycompat.sysstr(key.ljust(longest)),
showview._table[key]._origdoc,
)
)
Gregory Szorc
show: fix formatting of multiple commands...
r31943
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cmdtable[b'show'][0].__doc__ = pycompat.sysstr(b'%s\n\n%s\n ') % (
cmdtable[b'show'][0].__doc__.rstrip(),
pycompat.sysstr(b'\n\n').join(entries),
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
show: fix formatting of multiple commands...
r31943
_updatedocstring()