hgext/show.py
changeset 43077 687b865b95ad
parent 43076 2372284d9457
child 43080 86e4daa2d54c
--- a/hgext/show.py	Sun Oct 06 09:45:02 2019 -0400
+++ b/hgext/show.py	Sun Oct 06 09:48:39 2019 -0400
@@ -49,7 +49,7 @@
 # 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.
-testedwith = 'ships-with-hg-core'
+testedwith = b'ships-with-hg-core'
 
 cmdtable = {}
 command = registrar.command(cmdtable)
@@ -61,7 +61,7 @@
     """Register a function to be invoked for an `hg show <thing>`."""
 
     # Used by _formatdoc().
-    _docformat = '%s -- %s'
+    _docformat = b'%s -- %s'
 
     def _extrasetup(self, name, func, fmtopic=None, csettopic=None):
         """Called with decorator arguments to register a show view.
@@ -88,16 +88,16 @@
 
 
 @command(
-    'show',
+    b'show',
     [
         # 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.
-        ('T', 'template', '', 'display with template', _('TEMPLATE')),
+        (b'T', b'template', b'', b'display with template', _(b'TEMPLATE')),
     ],
-    _('VIEW'),
+    _(b'VIEW'),
     helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
 )
 def show(ui, repo, view=None, template=None):
@@ -119,45 +119,47 @@
     List of available views:
     """
     if ui.plain() and not template:
-        hint = _('invoke with -T/--template to control output format')
-        raise error.Abort(_('must specify a template in plain mode'), hint=hint)
+        hint = _(b'invoke with -T/--template to control output format')
+        raise error.Abort(
+            _(b'must specify a template in plain mode'), hint=hint
+        )
 
     views = showview._table
 
     if not view:
-        ui.pager('show')
+        ui.pager(b'show')
         # TODO consider using formatter here so available views can be
         # rendered to custom format.
-        ui.write(_('available views:\n'))
-        ui.write('\n')
+        ui.write(_(b'available views:\n'))
+        ui.write(b'\n')
 
         for name, func in sorted(views.items()):
-            ui.write('%s\n' % pycompat.sysbytes(func.__doc__))
+            ui.write(b'%s\n' % pycompat.sysbytes(func.__doc__))
 
-        ui.write('\n')
+        ui.write(b'\n')
         raise error.Abort(
-            _('no view requested'),
-            hint=_('use "hg show VIEW" to choose a view'),
+            _(b'no view requested'),
+            hint=_(b'use "hg show VIEW" to choose a view'),
         )
 
     # TODO use same logic as dispatch to perform prefix matching.
     if view not in views:
         raise error.Abort(
-            _('unknown view: %s') % view,
-            hint=_('run "hg show" to see available views'),
+            _(b'unknown view: %s') % view,
+            hint=_(b'run "hg show" to see available views'),
         )
 
-    template = template or 'show'
+    template = template or b'show'
 
     fn = views[view]
-    ui.pager('show')
+    ui.pager(b'show')
 
     if fn._fmtopic:
-        fmtopic = 'show%s' % fn._fmtopic
-        with ui.formatter(fmtopic, {'template': template}) as fm:
+        fmtopic = b'show%s' % fn._fmtopic
+        with ui.formatter(fmtopic, {b'template': template}) as fm:
             return fn(ui, repo, fm)
     elif fn._csettopic:
-        ref = 'show%s' % fn._csettopic
+        ref = b'show%s' % fn._csettopic
         spec = formatter.lookuptemplate(ui, ref, template)
         displayer = logcmdutil.changesettemplater(ui, repo, spec, buffered=True)
         return fn(ui, repo, displayer)
@@ -165,7 +167,7 @@
         return fn(ui, repo)
 
 
-@showview('bookmarks', fmtopic='bookmarks')
+@showview(b'bookmarks', fmtopic=b'bookmarks')
 def showbookmarks(ui, repo, fm):
     """bookmarks and their associated changeset"""
     marks = repo._bookmarks
@@ -174,7 +176,7 @@
         # specify an empty output, but we shouldn't corrupt JSON while
         # waiting for this functionality.
         if not isinstance(fm, formatter.jsonformatter):
-            ui.write(_('(no bookmarks set)\n'))
+            ui.write(_(b'(no bookmarks set)\n'))
         return
 
     revs = [repo[node].rev() for node in marks.values()]
@@ -185,27 +187,30 @@
     for bm, node in sorted(marks.items()):
         fm.startitem()
         fm.context(ctx=repo[node])
-        fm.write('bookmark', '%s', bm)
-        fm.write('node', fm.hexfunc(node), fm.hexfunc(node))
+        fm.write(b'bookmark', b'%s', bm)
+        fm.write(b'node', fm.hexfunc(node), fm.hexfunc(node))
         fm.data(
             active=bm == active, longestbookmarklen=longestname, nodelen=nodelen
         )
 
 
-@showview('stack', csettopic='stack')
+@showview(b'stack', csettopic=b'stack')
 def showstack(ui, repo, displayer):
     """current line of work"""
-    wdirctx = repo['.']
+    wdirctx = repo[b'.']
     if wdirctx.rev() == nullrev:
         raise error.Abort(
-            _('stack view only available when there is a ' 'working directory')
+            _(
+                b'stack view only available when there is a '
+                b'working directory'
+            )
         )
 
     if wdirctx.phase() == phases.public:
         ui.write(
             _(
-                '(empty stack; working directory parent is a published '
-                'changeset)\n'
+                b'(empty stack; working directory parent is a published '
+                b'changeset)\n'
             )
         )
         return
@@ -220,7 +225,7 @@
         baserev = wdirctx.rev()
         stackrevs = {wdirctx.rev()}
     else:
-        stackrevs = set(repo.revs('%d::.', baserev))
+        stackrevs = set(repo.revs(b'%d::.', baserev))
 
     ctx = repo[baserev]
     if ctx.p1().rev() != nullrev:
@@ -256,7 +261,7 @@
         # TODO make this customizable?
         newheads = set(
             repo.revs(
-                'heads(%d::) - %ld - not public()', basectx.rev(), stackrevs
+                b'heads(%d::) - %ld - not public()', basectx.rev(), stackrevs
             )
         )
     else:
@@ -266,7 +271,7 @@
     nodelen = longestshortest(repo, allrevs)
 
     try:
-        cmdutil.findcmd('rebase', commands.table)
+        cmdutil.findcmd(b'rebase', commands.table)
         haverebase = True
     except (error.AmbiguousCommand, error.UnknownCommand):
         haverebase = False
@@ -278,11 +283,11 @@
 
     tres = formatter.templateresources(ui, repo)
     shortesttmpl = formatter.maketemplater(
-        ui, '{shortest(node, %d)}' % nodelen, resources=tres
+        ui, b'{shortest(node, %d)}' % nodelen, resources=tres
     )
 
     def shortest(ctx):
-        return shortesttmpl.renderdefault({'ctx': ctx, 'node': ctx.hex()})
+        return shortesttmpl.renderdefault({b'ctx': ctx, b'node': ctx.hex()})
 
     # 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
@@ -307,60 +312,60 @@
             ctx = repo[rev]
 
             if i:
-                ui.write(': ')
+                ui.write(b': ')
             else:
-                ui.write('  ')
+                ui.write(b'  ')
 
-            ui.write('o  ')
+            ui.write(b'o  ')
             displayer.show(ctx, nodelen=nodelen)
             displayer.flush(ctx)
-            ui.write('\n')
+            ui.write(b'\n')
 
             if i:
-                ui.write(':/')
+                ui.write(b':/')
             else:
-                ui.write(' /')
+                ui.write(b' /')
 
-            ui.write('    (')
+            ui.write(b'    (')
             ui.write(
-                _('%d commits ahead') % revdistance[rev],
-                label='stack.commitdistance',
+                _(b'%d commits ahead') % revdistance[rev],
+                label=b'stack.commitdistance',
             )
 
             if haverebase:
                 # TODO may be able to omit --source in some scenarios
-                ui.write('; ')
+                ui.write(b'; ')
                 ui.write(
                     (
-                        'hg rebase --source %s --dest %s'
+                        b'hg rebase --source %s --dest %s'
                         % (shortest(sourcectx), shortest(ctx))
                     ),
-                    label='stack.rebasehint',
+                    label=b'stack.rebasehint',
                 )
 
-            ui.write(')\n')
+            ui.write(b')\n')
 
-        ui.write(':\n:    ')
-        ui.write(_('(stack head)\n'), label='stack.label')
+        ui.write(b':\n:    ')
+        ui.write(_(b'(stack head)\n'), label=b'stack.label')
 
     if branchpointattip:
-        ui.write(' \\ /  ')
-        ui.write(_('(multiple children)\n'), label='stack.label')
-        ui.write('  |\n')
+        ui.write(b' \\ /  ')
+        ui.write(_(b'(multiple children)\n'), label=b'stack.label')
+        ui.write(b'  |\n')
 
     for rev in stackrevs:
         ctx = repo[rev]
-        symbol = '@' if rev == wdirctx.rev() else 'o'
+        symbol = b'@' if rev == wdirctx.rev() else b'o'
 
         if newheads:
-            ui.write(': ')
+            ui.write(b': ')
         else:
-            ui.write('  ')
+            ui.write(b'  ')
 
-        ui.write(symbol, '  ')
+        ui.write(symbol, b'  ')
         displayer.show(ctx, nodelen=nodelen)
         displayer.flush(ctx)
-        ui.write('\n')
+        ui.write(b'\n')
 
     # TODO display histedit hint?
 
@@ -368,25 +373,25 @@
         # Vertically and horizontally separate stack base from parent
         # to reinforce stack boundary.
         if newheads:
-            ui.write(':/   ')
+            ui.write(b':/   ')
         else:
-            ui.write(' /   ')
+            ui.write(b' /   ')
 
-        ui.write(_('(stack base)'), '\n', label='stack.label')
-        ui.write('o  ')
+        ui.write(_(b'(stack base)'), b'\n', label=b'stack.label')
+        ui.write(b'o  ')
 
         displayer.show(basectx, nodelen=nodelen)
         displayer.flush(basectx)
-        ui.write('\n')
+        ui.write(b'\n')
 
 
-@revsetpredicate('_underway([commitage[, headage]])')
+@revsetpredicate(b'_underway([commitage[, headage]])')
 def underwayrevset(repo, subset, x):
-    args = revset.getargsdict(x, 'underway', 'commitage headage')
-    if 'commitage' not in args:
-        args['commitage'] = None
-    if 'headage' not in args:
-        args['headage'] = None
+    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
 
     # We assume callers of this revset add a topographical sort on the
     # result. This means there is no benefit to making the revset lazy
@@ -399,13 +404,13 @@
     # 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.
-    rs = 'not public() and not obsolete()'
+    rs = b'not public() and not obsolete()'
     rsargs = []
-    if args['commitage']:
-        rs += ' and date(%s)'
+    if args[b'commitage']:
+        rs += b' and date(%s)'
         rsargs.append(
             revsetlang.getstring(
-                args['commitage'], _('commitage requires a string')
+                args[b'commitage'], _(b'commitage requires a string')
             )
         )
 
@@ -413,55 +418,55 @@
     relevant = revset.baseset(mutable)
 
     # Add parents of mutable changesets to provide context.
-    relevant += repo.revs('parents(%ld)', mutable)
+    relevant += repo.revs(b'parents(%ld)', mutable)
 
     # We also pull in (public) heads if they a) aren't closing a branch
     # b) are recent.
-    rs = 'head() and not closed()'
+    rs = b'head() and not closed()'
     rsargs = []
-    if args['headage']:
-        rs += ' and date(%s)'
+    if args[b'headage']:
+        rs += b' and date(%s)'
         rsargs.append(
             revsetlang.getstring(
-                args['headage'], _('headage requires a string')
+                args[b'headage'], _(b'headage requires a string')
             )
         )
 
     relevant += repo.revs(rs, *rsargs)
 
     # Add working directory parent.
-    wdirrev = repo['.'].rev()
+    wdirrev = repo[b'.'].rev()
     if wdirrev != nullrev:
         relevant += revset.baseset({wdirrev})
 
     return subset & relevant
 
 
-@showview('work', csettopic='work')
+@showview(b'work', csettopic=b'work')
 def showwork(ui, repo, displayer):
     """changesets that aren't finished"""
     # TODO support date-based limiting when calling revset.
-    revs = repo.revs('sort(_underway(), topo)')
+    revs = repo.revs(b'sort(_underway(), topo)')
     nodelen = longestshortest(repo, revs)
 
     revdag = graphmod.dagwalker(repo, revs)
 
-    ui.setconfig('experimental', 'graphshorten', True)
+    ui.setconfig(b'experimental', b'graphshorten', True)
     logcmdutil.displaygraph(
         ui,
         repo,
         revdag,
         displayer,
         graphmod.asciiedges,
-        props={'nodelen': nodelen},
+        props={b'nodelen': nodelen},
     )
 
 
 def extsetup(ui):
     # Alias `hg <prefix><view>` to `hg show <view>`.
-    for prefix in ui.configlist('commands', 'show.aliasprefix'):
+    for prefix in ui.configlist(b'commands', b'show.aliasprefix'):
         for view in showview._table:
-            name = '%s%s' % (prefix, view)
+            name = b'%s%s' % (prefix, view)
 
             choice, allcommands = cmdutil.findpossible(
                 name, commands.table, strict=True
@@ -472,10 +477,10 @@
                 continue
 
             # Same for aliases.
-            if ui.config('alias', name, None):
+            if ui.config(b'alias', name, None):
                 continue
 
-            ui.setconfig('alias', name, 'show %s' % view, source='show')
+            ui.setconfig(b'alias', name, b'show %s' % view, source=b'show')
 
 
 def longestshortest(repo, revs, minlen=4):
@@ -516,9 +521,9 @@
             )
         )
 
-    cmdtable['show'][0].__doc__ = pycompat.sysstr('%s\n\n%s\n    ') % (
-        cmdtable['show'][0].__doc__.rstrip(),
-        pycompat.sysstr('\n\n').join(entries),
+    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),
     )