<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 2, 2019, 01:46 Pierre-Yves David <<a href="mailto:pierre-yves.david@ens-lyon.org">pierre-yves.david@ens-lyon.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This patch don't apply anymore :-/</blockquote></div></div><div dir="auto"><br></div><div dir="auto">Should be okay to apply only the changes that applied, I think. It looks like they're independent.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> It is also very invasive and will be <br>
painful for all other contributors.<br>
<br>
Do you think we could get to a point where no manual tweaking is needed <br>
? (could be simply adding dedicated comment to line that need to be <br>
skipped). If we have a script only approach we could use the <br>
format-source extensions for that.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I'm curious to hear what Ludovic thinks, but I'm doubtful that saves other contributors more time than it costs for Ludovic, so it's a net negative.</div><div dir="auto"><br></div><div dir="auto">I assume you know that Python 2's end of life is Jan 1 2020, so this is getting urgent. I don't know about others, but my team will need to have Mercurial and extensions on Python 3 by then.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
On 7/1/19 7:39 AM, Ludovic Chabant wrote:<br>
> # HG changeset patch<br>
> # User Ludovic Chabant <<a href="mailto:ludovic@chabant.com" target="_blank" rel="noreferrer">ludovic@chabant.com</a>><br>
> # Date 1561959530 0<br>
> #      Mon Jul 01 05:38:50 2019 +0000<br>
> # Branch stable<br>
> # Node ID 89e3ab4dcbc56ee72ce1d4d17527337e01d99467<br>
> # Parent  90daf413dfc7a7e4762e6445f05c52b123c6188f<br>
> py3: broad pass for python3 compatibility<br>
> <br>
> - ran mercurial's bytify-strings script<br>
> - excluded some places where we use strings to pass to setattr()<br>
> - re-decode some template funcions' docstrings that were previously encoded<br>
>    (probably by the hgloader?)<br>
> <br>
> diff --git a/hgext3rd/evolve/__init__.py b/hgext3rd/evolve/__init__.py<br>
> --- a/hgext3rd/evolve/__init__.py<br>
> +++ b/hgext3rd/evolve/__init__.py<br>
> @@ -258,7 +258,7 @@<br>
>       registrar.templatekeyword # new in hg-3.8<br>
>   except ImportError:<br>
>       from . import metadata<br>
> -    raise ImportError('evolve needs Mercurial version %s or above' %<br>
> +    raise ImportError(b'evolve needs Mercurial version %s or above' %<br>
>                         min(metadata.testedwith.split()))<br>
>   <br>
>   import mercurial<br>
> @@ -311,25 +311,25 @@<br>
>   buglink = metadata.buglink<br>
>   <br>
>   # Flags for enabling optional parts of evolve<br>
> -commandopt = 'allnewcommands'<br>
> +commandopt = b'allnewcommands'<br>
>   <br>
>   obsexcmsg = utility.obsexcmsg<br>
>   shorttemplate = utility.shorttemplate<br>
>   <br>
> -colortable = {'evolve.node': 'yellow',<br>
> -              'evolve.user': 'green',<br>
> -              'evolve.rev': 'blue',<br>
> -              'evolve.short_description': '',<br>
> -              'evolve.date': 'cyan',<br>
> -              'evolve.current_rev': 'bold',<br>
> -              'evolve.verb': '',<br>
> -              'evolve.operation': 'bold'<br>
> +colortable = {b'evolve.node': b'yellow',<br>
> +              b'evolve.user': b'green',<br>
> +              b'evolve.rev': b'blue',<br>
> +              b'evolve.short_description': b'',<br>
> +              b'evolve.date': b'cyan',<br>
> +              b'evolve.current_rev': b'bold',<br>
> +              b'evolve.verb': b'',<br>
> +              b'evolve.operation': b'bold'<br>
>                 }<br>
>   <br>
>   _pack = struct.pack<br>
>   _unpack = struct.unpack<br>
>   <br>
> -aliases, entry = cmdutil.findcmd('commit', commands.table)<br>
> +aliases, entry = cmdutil.findcmd(b'commit', commands.table)<br>
>   commitopts3 = cmdrewrite.commitopts3<br>
>   interactiveopt = cmdrewrite.interactiveopt<br>
>   rewrite = rewriteutil.rewrite<br>
> @@ -362,13 +362,13 @@<br>
>   templatekeyword = eh.templatekeyword<br>
>   <br>
>   # Configuration<br>
> -eh.configitem('experimental', 'evolutioncommands', [])<br>
> -eh.configitem('experimental', 'evolution.allnewcommands', None)<br>
> -eh.configitem('experimental', 'prunestrip', False)<br>
> +eh.configitem(b'experimental', b'evolutioncommands', [])<br>
> +eh.configitem(b'experimental', b'evolution.allnewcommands', None)<br>
> +eh.configitem(b'experimental', b'prunestrip', False)<br>
>   <br>
>   # pre hg 4.0 compat<br>
>   <br>
> -if not util.safehasattr(dirstate.dirstate, 'parentchange'):<br>
> +if not util.safehasattr(dirstate.dirstate, b'parentchange'):<br>
>       import contextlib<br>
>   <br>
>       @contextlib.contextmanager<br>
> @@ -397,14 +397,14 @@<br>
>   def _configureoptions(ui, repo):<br>
>       # If no capabilities are specified, enable everything.<br>
>       # This is so existing evolve users don't need to change their config.<br>
> -    evolveopts = repo.ui.configlist('experimental', 'evolution')<br>
> +    evolveopts = repo.ui.configlist(b'experimental', b'evolution')<br>
>       if not evolveopts:<br>
> -        evolveopts = ['all']<br>
> -        repo.ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')<br>
> -    if obsolete.isenabled(repo, 'exchange'):<br>
> +        evolveopts = [b'all']<br>
> +        repo.ui.setconfig(b'experimental', b'evolution', evolveopts, b'evolve')<br>
> +    if obsolete.isenabled(repo, b'exchange'):<br>
>           # if no config explicitly set, disable bundle1<br>
> -        if not isinstance(repo.ui.config('server', 'bundle1'), str):<br>
> -            repo.ui.setconfig('server', 'bundle1', False)<br>
> +        if not isinstance(repo.ui.config(b'server', b'bundle1'), str):<br>
> +            repo.ui.setconfig(b'server', b'bundle1', False)<br>
>   <br>
>       class trdescrepo(repo.__class__):<br>
>   <br>
> @@ -422,18 +422,18 @@<br>
>       # This must be in the same function as the option configuration above to<br>
>       # guarantee it happens after the above configuration, but before the<br>
>       # extsetup functions.<br>
> -    evolvecommands = ui.configlist('experimental', 'evolutioncommands')<br>
> -    evolveopts = ui.configlist('experimental', 'evolution')<br>
> +    evolvecommands = ui.configlist(b'experimental', b'evolutioncommands')<br>
> +    evolveopts = ui.configlist(b'experimental', b'evolution')<br>
>       if evolveopts and (commandopt not in evolveopts<br>
> -                       and 'all' not in evolveopts):<br>
> +                       and b'all' not in evolveopts):<br>
>           # We build whitelist containing the commands we want to enable<br>
>           whitelist = set()<br>
>           for cmd in evolvecommands:<br>
>               matchingevolvecommands = [e for e in cmdtable.keys() if cmd in e]<br>
>               if not matchingevolvecommands:<br>
> -                raise error.Abort(_('unknown command: %s') % cmd)<br>
> +                raise error.Abort(_(b'unknown command: %s') % cmd)<br>
>               elif len(matchingevolvecommands) > 1:<br>
> -                msg = _('ambiguous command specification: "%s" matches %r')<br>
> +                msg = _(b'ambiguous command specification: "%s" matches %r')<br>
>                   raise error.Abort(msg % (cmd, matchingevolvecommands))<br>
>               else:<br>
>                   whitelist.add(matchingevolvecommands[0])<br>
> @@ -464,10 +464,10 @@<br>
>   @eh.uisetup<br>
>   def setupparentcommand(ui):<br>
>   <br>
> -    _alias, statuscmd = cmdutil.findcmd('status', commands.table)<br>
> -    pstatusopts = [o for o in statuscmd[1] if o[1] != 'rev']<br>
> +    _alias, statuscmd = cmdutil.findcmd(b'status', commands.table)<br>
> +    pstatusopts = [o for o in statuscmd[1] if o[1] != b'rev']<br>
>   <br>
> -    @eh.command('pstatus', pstatusopts)<br>
> +    @eh.command(b'pstatus', pstatusopts)<br>
>       def pstatus(ui, repo, *args, **kwargs):<br>
>           """show status combining committed and uncommited changes<br>
>   <br>
> @@ -476,13 +476,13 @@<br>
>           match the content of the commit that a bare :hg:`amend` will creates.<br>
>   <br>
>           See :hg:`help status` for details."""<br>
> -        kwargs['rev'] = ['.^']<br>
> +        kwargs[b'rev'] = [b'.^']<br>
>           return statuscmd[0](ui, repo, *args, **kwargs)<br>
>   <br>
> -    _alias, diffcmd = cmdutil.findcmd('diff', commands.table)<br>
> -    pdiffopts = [o for o in diffcmd[1] if o[1] != 'rev']<br>
> +    _alias, diffcmd = cmdutil.findcmd(b'diff', commands.table)<br>
> +    pdiffopts = [o for o in diffcmd[1] if o[1] != b'rev']<br>
>   <br>
> -    @eh.command('pdiff', pdiffopts)<br>
> +    @eh.command(b'pdiff', pdiffopts)<br>
>       def pdiff(ui, repo, *args, **kwargs):<br>
>           """show diff combining committed and uncommited changes<br>
>   <br>
> @@ -491,32 +491,32 @@<br>
>           match the content of the commit that a bare :hg:`amend` will creates.<br>
>   <br>
>           See :hg:`help diff` for details."""<br>
> -        kwargs['rev'] = ['.^']<br>
> +        kwargs[b'rev'] = [b'.^']<br>
>           return diffcmd[0](ui, repo, *args, **kwargs)<br>
>   <br>
>   @eh.uisetup<br>
>   def _installalias(ui):<br>
> -    if ui.config('alias', 'odiff', None) is None:<br>
> -        ui.setconfig('alias', 'odiff',<br>
> -                     "diff --hidden --rev 'limit(predecessors(.),1)' --rev .",<br>
> -                     'evolve')<br>
> +    if ui.config(b'alias', b'odiff', None) is None:<br>
> +        ui.setconfig(b'alias', b'odiff',<br>
> +                     b"diff --hidden --rev 'limit(predecessors(.),1)' --rev .",<br>
> +                     b'evolve')<br>
>   <br>
>   ### Unstable revset symbol<br>
>   <br>
> -@eh.revsetpredicate('unstable()')<br>
> +@eh.revsetpredicate(b'unstable()')<br>
>   def revsetunstable(repo, subset, x):<br>
>       """Changesets with instabilities.<br>
>       """<br>
> -    revset.getargs(x, 0, 0, 'unstable takes no arguments')<br>
> +    revset.getargs(x, 0, 0, b'unstable takes no arguments')<br>
>       troubled = set()<br>
> -    troubled.update(getrevs(repo, 'orphan'))<br>
> -    troubled.update(getrevs(repo, 'phasedivergent'))<br>
> -    troubled.update(getrevs(repo, 'contentdivergent'))<br>
> +    troubled.update(getrevs(repo, b'orphan'))<br>
> +    troubled.update(getrevs(repo, b'phasedivergent'))<br>
> +    troubled.update(getrevs(repo, b'contentdivergent'))<br>
>       troubled = revset.baseset(troubled)<br>
>       troubled.sort() # set is non-ordered, enforce order<br>
>       return subset & troubled<br>
>   <br>
> -@eh.revsetpredicate('troubled()')    # legacy name<br>
> +@eh.revsetpredicate(b'troubled()')    # legacy name<br>
>   def revsettroubled(repo, subset, x):<br>
>       return revsetunstable(repo, subset, x)<br>
>   <br>
> @@ -615,17 +615,17 @@<br>
>   <br>
>   <br>
>   ### XXX I'm not sure this revset is useful<br>
> -@eh.revsetpredicate('suspended()')<br>
> +@eh.revsetpredicate(b'suspended()')<br>
>   def revsetsuspended(repo, subset, x):<br>
>       """Obsolete changesets with non-obsolete descendants.<br>
>       """<br>
> -    revset.getargs(x, 0, 0, 'suspended takes no arguments')<br>
> -    suspended = revset.baseset(getrevs(repo, 'suspended'))<br>
> +    revset.getargs(x, 0, 0, b'suspended takes no arguments')<br>
> +    suspended = revset.baseset(getrevs(repo, b'suspended'))<br>
>       suspended.sort()<br>
>       return subset & suspended<br>
>   <br>
>   <br>
> -@eh.revsetpredicate('predecessors(set)')<br>
> +@eh.revsetpredicate(b'predecessors(set)')<br>
>   def revsetpredecessors(repo, subset, x):<br>
>       """Immediate predecessors of changesets in set.<br>
>       """<br>
> @@ -635,12 +635,12 @@<br>
>       return subset & s<br>
>   <br>
>   <br>
> -@eh.revsetpredicate('precursors(set)')   # legacy name for predecessors<br>
> +@eh.revsetpredicate(b'precursors(set)')   # legacy name for predecessors<br>
>   def revsetprecursors(repo, subset, x):<br>
>       return revsetpredecessors(repo, subset, x)<br>
>   <br>
>   <br>
> -@eh.revsetpredicate('allpredecessors(set)')<br>
> +@eh.revsetpredicate(b'allpredecessors(set)')<br>
>   def revsetallpredecessors(repo, subset, x):<br>
>       """Transitive predecessors of changesets in set.<br>
>       """<br>
> @@ -650,12 +650,12 @@<br>
>       return subset & s<br>
>   <br>
>   <br>
> -@eh.revsetpredicate('allprecursors(set)')   # legacy name for allpredecessors<br>
> +@eh.revsetpredicate(b'allprecursors(set)')   # legacy name for allpredecessors<br>
>   def revsetallprecursors(repo, subset, x):<br>
>       return revsetallpredecessors(repo, subset, x)<br>
>   <br>
>   <br>
> -@eh.revsetpredicate('successors(set)')<br>
> +@eh.revsetpredicate(b'successors(set)')<br>
>   def revsetsuccessors(repo, subset, x):<br>
>       """Immediate successors of changesets in set.<br>
>       """<br>
> @@ -664,7 +664,7 @@<br>
>       s.sort()<br>
>       return subset & s<br>
>   <br>
> -@eh.revsetpredicate('allsuccessors(set)')<br>
> +@eh.revsetpredicate(b'allsuccessors(set)')<br>
>   def revsetallsuccessors(repo, subset, x):<br>
>       """Transitive successors of changesets in set.<br>
>       """<br>
> @@ -681,87 +681,87 @@<br>
>   # This section take care of issue warning to the user when troubles appear<br>
>   <br>
>   def _warnobsoletewc(ui, repo, prevnode=None, wasobs=None):<br>
> -    rev = repo['.']<br>
> +    rev = repo[b'.']<br>
>   <br>
>       if not rev.obsolete():<br>
>           return<br>
>   <br>
>       if rev.node() == prevnode and wasobs:<br>
>           return<br>
> -    msg = _("working directory parent is obsolete! (%s)\n")<br>
> +    msg = _(b"working directory parent is obsolete! (%s)\n")<br>
>       shortnode = node.short(rev.node())<br>
>   <br>
>       ui.warn(msg % shortnode)<br>
>   <br>
>       # Check that evolve is activated for performance reasons<br>
> -    evolvecommandenabled = any('evolve' in e for e in cmdtable)<br>
> +    evolvecommandenabled = any(b'evolve' in e for e in cmdtable)<br>
>       if ui.quiet or not evolvecommandenabled:<br>
>           return<br>
>   <br>
>       # Show a warning for helping the user to solve the issue<br>
>       reason, successors = obshistory._getobsfateandsuccs(repo, rev.node())<br>
>   <br>
> -    if reason == 'pruned':<br>
> -        solvemsg = _("use 'hg evolve' to update to its parent successor")<br>
> -    elif reason == 'diverged':<br>
> -        debugcommand = "hg evolve --list --content-divergent"<br>
> -        basemsg = _("%s has diverged, use '%s' to resolve the issue")<br>
> +    if reason == b'pruned':<br>
> +        solvemsg = _(b"use 'hg evolve' to update to its parent successor")<br>
> +    elif reason == b'diverged':<br>
> +        debugcommand = b"hg evolve --list --content-divergent"<br>
> +        basemsg = _(b"%s has diverged, use '%s' to resolve the issue")<br>
>           solvemsg = basemsg % (shortnode, debugcommand)<br>
> -    elif reason == 'superseed':<br>
> -        msg = _("use 'hg evolve' to update to its successor: %s")<br>
> +    elif reason == b'superseed':<br>
> +        msg = _(b"use 'hg evolve' to update to its successor: %s")<br>
>           solvemsg = msg % successors[0]<br>
> -    elif reason == 'superseed_split':<br>
> -        msg = _("use 'hg evolve' to update to its tipmost successor: %s")<br>
> +    elif reason == b'superseed_split':<br>
> +        msg = _(b"use 'hg evolve' to update to its tipmost successor: %s")<br>
>   <br>
>           if len(successors) <= 2:<br>
> -            solvemsg = msg % ", ".join(successors)<br>
> +            solvemsg = msg % b", ".join(successors)<br>
>           else:<br>
> -            firstsuccessors = ", ".join(successors[:2])<br>
> +            firstsuccessors = b", ".join(successors[:2])<br>
>               remainingnumber = len(successors) - 2<br>
> -            successorsmsg = _("%s and %d more") % (firstsuccessors, remainingnumber)<br>
> +            successorsmsg = _(b"%s and %d more") % (firstsuccessors, remainingnumber)<br>
>               solvemsg = msg % successorsmsg<br>
>       else:<br>
>           raise ValueError(reason)<br>
>   <br>
> -    ui.warn("(%s)\n" % solvemsg)<br>
> +    ui.warn(b"(%s)\n" % solvemsg)<br>
>   <br>
> -if util.safehasattr(context, '_filterederror'): # <= hg-4.5<br>
> -    @eh.wrapfunction(context, '_filterederror')<br>
> +if util.safehasattr(context, b'_filterederror'): # <= hg-4.5<br>
> +    @eh.wrapfunction(context, b'_filterederror')<br>
>       def evolve_filtererror(original, repo, changeid):<br>
>           """build an exception to be raised about a filtered changeid<br>
>   <br>
>           This is extracted in a function to help extensions (eg: evolve) to<br>
>           experiment with various message variants."""<br>
> -        if repo.filtername.startswith('visible'):<br>
> +        if repo.filtername.startswith(b'visible'):<br>
>   <br>
>               unfilteredrepo = repo.unfiltered()<br>
>               rev = repo[scmutil.revsingle(unfilteredrepo, changeid)]<br>
>               reason, successors = obshistory._getobsfateandsuccs(unfilteredrepo, rev.node())<br>
>   <br>
>               # Be more precise in case the revision is superseed<br>
> -            if reason == 'superseed':<br>
> -                reason = _("successor: %s") % successors[0]<br>
> -            elif reason == 'superseed_split':<br>
> +            if reason == b'superseed':<br>
> +                reason = _(b"successor: %s") % successors[0]<br>
> +            elif reason == b'superseed_split':<br>
>                   if len(successors) <= 2:<br>
> -                    reason = _("successors: %s") % ", ".join(successors)<br>
> +                    reason = _(b"successors: %s") % b", ".join(successors)<br>
>                   else:<br>
> -                    firstsuccessors = ", ".join(successors[:2])<br>
> +                    firstsuccessors = b", ".join(successors[:2])<br>
>                       remainingnumber = len(successors) - 2<br>
> -                    successorsmsg = _("%s and %d more") % (firstsuccessors, remainingnumber)<br>
> -                    reason = _("successors: %s") % successorsmsg<br>
> +                    successorsmsg = _(b"%s and %d more") % (firstsuccessors, remainingnumber)<br>
> +                    reason = _(b"successors: %s") % successorsmsg<br>
>   <br>
> -            msg = _("hidden revision '%s'") % changeid<br>
> -            hint = _('use --hidden to access hidden revisions; %s') % reason<br>
> +            msg = _(b"hidden revision '%s'") % changeid<br>
> +            hint = _(b'use --hidden to access hidden revisions; %s') % reason<br>
>               return error.FilteredRepoLookupError(msg, hint=hint)<br>
> -        msg = _("filtered revision '%s' (not in '%s' subset)")<br>
> +        msg = _(b"filtered revision '%s' (not in '%s' subset)")<br>
>           msg %= (changeid, repo.filtername)<br>
>           return error.FilteredRepoLookupError(msg)<br>
>   <br>
> -@eh.wrapcommand("update")<br>
> -@eh.wrapcommand("pull")<br>
> +@eh.wrapcommand(b"update")<br>
> +@eh.wrapcommand(b"pull")<br>
>   def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):<br>
>       """Warn that the working directory parent is an obsolete changeset"""<br>
> -    ctx = repo['.']<br>
> +    ctx = repo[b'.']<br>
>       node = ctx.node()<br>
>       isobs = ctx.obsolete()<br>
>   <br>
> @@ -776,23 +776,23 @@<br>
>           lockmod.release(wlock)<br>
>       return res<br>
>   <br>
> -@eh.wrapcommand("parents")<br>
> +@eh.wrapcommand(b"parents")<br>
>   def wrapparents(origfn, ui, repo, *args, **opts):<br>
>       res = origfn(ui, repo, *args, **opts)<br>
>       _warnobsoletewc(ui, repo)<br>
>       return res<br>
>   <br>
> -@eh.wrapfunction(mercurial.exchange, 'push')<br>
> +@eh.wrapfunction(mercurial.exchange, b'push')<br>
>   def push(orig, repo, *args, **opts):<br>
>       """Add a hint for "hg evolve" when troubles make push fails<br>
>       """<br>
>       try:<br>
>           return orig(repo, *args, **opts)<br>
>       except error.Abort as ex:<br>
> -        hint = _("use 'hg evolve' to get a stable history "<br>
> -                 "or --force to ignore warnings")<br>
> +        hint = _(b"use 'hg evolve' to get a stable history "<br>
> +                 b"or --force to ignore warnings")<br>
>           if (len(ex.args) >= 1<br>
> -            and ex.args[0].startswith('push includes ')<br>
> +            and ex.args[0].startswith(b'push includes ')<br>
>               and ex.hint is None):<br>
>               ex.hint = hint<br>
>           raise<br>
> @@ -801,11 +801,11 @@<br>
>       evolvestate = state.cmdstate(repo)<br>
>       if evolvestate:<br>
>           # i18n: column positioning for "hg summary"<br>
> -        ui.status(_('evolve: (evolve --continue)\n'))<br>
> +        ui.status(_(b'evolve: (evolve --continue)\n'))<br>
>   <br>
>   @eh.extsetup<br>
>   def obssummarysetup(ui):<br>
> -    cmdutil.summaryhooks.add('evolve', summaryhook)<br>
> +    cmdutil.summaryhooks.add(b'evolve', summaryhook)<br>
>   <br>
>   #####################################################################<br>
>   ### Old Evolve extension content                                  ###<br>
> @@ -816,20 +816,20 @@<br>
>   <br>
>   @eh.uisetup<br>
>   def _installimportobsolete(ui):<br>
> -    entry = cmdutil.findcmd('import', commands.table)[1]<br>
> -    entry[1].append(('', 'obsolete', False,<br>
> -                    _('mark the old node as obsoleted by '<br>
> -                      'the created commit')))<br>
> +    entry = cmdutil.findcmd(b'import', commands.table)[1]<br>
> +    entry[1].append((b'', b'obsolete', False,<br>
> +                     _(b'mark the old node as obsoleted by '<br>
> +                       b'the created commit')))<br>
>   <br>
>   def _getnodefrompatch(patch, dest):<br>
> -    patchnode = patch.get('nodeid')<br>
> +    patchnode = patch.get(b'nodeid')<br>
>       if patchnode is not None:<br>
> -        dest['node'] = node.bin(patchnode)<br>
> +        dest[b'node'] = node.bin(patchnode)<br>
>   <br>
> -@eh.wrapfunction(mercurial.cmdutil, 'tryimportone')<br>
> +@eh.wrapfunction(mercurial.cmdutil, b'tryimportone')<br>
>   def tryimportone(orig, ui, repo, hunk, parents, opts, *args, **kwargs):<br>
> -    expected = {'node': None}<br>
> -    if not util.safehasattr(hunk, 'get'): # hg < 4.6<br>
> +    expected = {b'node': None}<br>
> +    if not util.safehasattr(hunk, b'get'): # hg < 4.6<br>
>           oldextract = patch.extract<br>
>   <br>
>           def extract(*args, **kwargs):<br>
> @@ -845,12 +845,12 @@<br>
>           _getnodefrompatch(hunk, expected)<br>
>           ret = orig(ui, repo, hunk, parents, opts, *args, **kwargs)<br>
>       created = ret[1]<br>
> -    if (opts['obsolete'] and None not in (created, expected['node'])<br>
> -        and created != expected['node']):<br>
> -        tr = repo.transaction('import-obs')<br>
> +    if (opts[b'obsolete'] and None not in (created, expected[b'node'])<br>
> +        and created != expected[b'node']):<br>
> +        tr = repo.transaction(b'import-obs')<br>
>           try:<br>
> -            metadata = {'user': ui.username()}<br>
> -            repo.obsstore.create(tr, expected['node'], (created,),<br>
> +            metadata = {b'user': ui.username()}<br>
> +            repo.obsstore.create(tr, expected[b'node'], (created,),<br>
>                                    metadata=metadata)<br>
>               tr.close()<br>
>           finally:<br>
> @@ -878,62 +878,62 @@<br>
>           if e is entry:<br>
>               break<br>
>   <br>
> -    synopsis = '(DEPRECATED)'<br>
> +    synopsis = b'(DEPRECATED)'<br>
>       if len(entry) > 2:<br>
>           fn, opts, _syn = entry<br>
>       else:<br>
>           fn, opts, = entry<br>
> -    deprecationwarning = _('%s have been deprecated in favor of %s\n') % (<br>
> +    deprecationwarning = _(b'%s have been deprecated in favor of %s\n') % (<br>
>           oldalias, newalias)<br>
>   <br>
>       def newfn(*args, **kwargs):<br>
>           ui = args[0]<br>
>           ui.warn(deprecationwarning)<br>
>           util.checksignature(fn)(*args, **kwargs)<br>
> -    newfn.__doc__ = deprecationwarning + ' (DEPRECATED)'<br>
> +    newfn.__doc__ = deprecationwarning + b' (DEPRECATED)'<br>
>       cmdwrapper = eh.command(oldalias, opts, synopsis)<br>
>       cmdwrapper(newfn)<br>
>   <br>
>   @eh.extsetup<br>
>   def deprecatealiases(ui):<br>
> -    _deprecatealias('gup', 'next')<br>
> -    _deprecatealias('gdown', 'previous')<br>
> +    _deprecatealias(b'gup', b'next')<br>
> +    _deprecatealias(b'gdown', b'previous')<br>
>   <br>
>   def _gettopic(ctx):<br>
>       """handle topic fetching with or without the extension"""<br>
> -    return getattr(ctx, 'topic', lambda: '')()<br>
> +    return getattr(ctx, 'topic', lambda: b'')()<br>
>   <br>
>   def _gettopicidx(ctx):<br>
>       """handle topic fetching with or without the extension"""<br>
>       return getattr(ctx, 'topicidx', lambda: None)()<br>
>   <br>
>   def _getcurrenttopic(repo):<br>
> -    return getattr(repo, 'currenttopic', '')<br>
> +    return getattr(repo, 'currenttopic', b'')<br>
>   <br>
>   def _prevupdate(repo, displayer, target, bookmark, dryrun, mergeopt):<br>
>       if dryrun:<br>
> -        repo.ui.write(_('hg update %s;\n') % target)<br>
> +        repo.ui.write(_(b'hg update %s;\n') % target)<br>
>           if bookmark is not None:<br>
> -            repo.ui.write(_('hg bookmark %s -r %s;\n')<br>
> +            repo.ui.write(_(b'hg bookmark %s -r %s;\n')<br>
>                             % (bookmark, target))<br>
>       else:<br>
>           updatecheck = None<br>
>           # --merge is passed, we don't need to care about commands.update.check<br>
>           # config option<br>
>           if mergeopt:<br>
> -            updatecheck = 'none'<br>
> +            updatecheck = b'none'<br>
>           try:<br>
>               ret = hg.updatetotally(repo.ui, repo, target.node(), None,<br>
>                                      updatecheck=updatecheck)<br>
>           except error.Abort as exc:<br>
>               # replace the hint to mention about --merge option<br>
> -            exc.hint = _('do you want --merge?')<br>
> +            exc.hint = _(b'do you want --merge?')<br>
>               raise<br>
>           if not ret:<br>
>               tr = lock = None<br>
>               try:<br>
>                   lock = repo.lock()<br>
> -                tr = repo.transaction('previous')<br>
> +                tr = repo.transaction(b'previous')<br>
>                   if bookmark is not None:<br>
>                       bmchanges = [(bookmark, target.node())]<br>
>                       repo._bookmarks.applychanges(repo, tr, bmchanges)<br>
> @@ -961,75 +961,75 @@<br>
>   <br>
>       # issue message for the various case<br>
>       if p1.node() == node.nullid:<br>
> -        repo.ui.warn(_('already at repository root\n'))<br>
> +        repo.ui.warn(_(b'already at repository root\n'))<br>
>       elif not parents and currenttopic:<br>
> -        repo.ui.warn(_('no parent in topic "%s"\n') % currenttopic)<br>
> -        repo.ui.warn(_('(do you want --no-topic)\n'))<br>
> +        repo.ui.warn(_(b'no parent in topic "%s"\n') % currenttopic)<br>
> +        repo.ui.warn(_(b'(do you want --no-topic)\n'))<br>
>       elif len(parents) == 1:<br>
>           target = parents[0]<br>
>           bookmark = None<br>
>           if movebookmark:<br>
>               bookmark = repo._activebookmark<br>
>       else:<br>
> -        header = _("multiple parents, choose one to update:")<br>
> +        header = _(b"multiple parents, choose one to update:")<br>
>           prevs = [p.rev() for p in parents]<br>
>           choosedrev = utility.revselectionprompt(repo.ui, repo, prevs, header)<br>
>           if choosedrev is None:<br>
>               for p in parents:<br>
>                   displayer.show(p)<br>
> -            repo.ui.warn(_('multiple parents, explicitly update to one\n'))<br>
> +            repo.ui.warn(_(b'multiple parents, explicitly update to one\n'))<br>
>           else:<br>
>               target = repo[choosedrev]<br>
>       return target, bookmark<br>
>   <br>
>   @eh.command(<br>
> -    'previous',<br>
> -    [('B', 'move-bookmark', False,<br>
> -        _('move active bookmark after update')),<br>
> -     ('m', 'merge', False, _('bring uncommitted change along')),<br>
> -     ('', 'no-topic', False, _('ignore topic and move topologically')),<br>
> -     ('n', 'dry-run', False,<br>
> -        _('do not perform actions, just print what would be done'))],<br>
> -    '[OPTION]...',<br>
> +    b'previous',<br>
> +    [(b'B', b'move-bookmark', False,<br>
> +        _(b'move active bookmark after update')),<br>
> +     (b'm', b'merge', False, _(b'bring uncommitted change along')),<br>
> +     (b'', b'no-topic', False, _(b'ignore topic and move topologically')),<br>
> +     (b'n', b'dry-run', False,<br>
> +        _(b'do not perform actions, just print what would be done'))],<br>
> +    b'[OPTION]...',<br>
>       helpbasic=True)<br>
>   def cmdprevious(ui, repo, **opts):<br>
>       """update to parent revision<br>
>   <br>
>       Displays the summary line of the destination for clarity."""<br>
>       wlock = None<br>
> -    dryrunopt = opts['dry_run']<br>
> -    mergeopt = opts['merge']<br>
> +    dryrunopt = opts[b'dry_run']<br>
> +    mergeopt = opts[b'merge']<br>
>       if not dryrunopt:<br>
>           wlock = repo.wlock()<br>
>       try:<br>
>           wkctx = repo[None]<br>
>           wparents = wkctx.parents()<br>
>           if len(wparents) != 1:<br>
> -            raise error.Abort(_('merge in progress'))<br>
> +            raise error.Abort(_(b'merge in progress'))<br>
>           if not mergeopt:<br>
>               # we only skip the check if noconflict is set<br>
> -            if ui.config('commands', 'update.check') == 'noconflict':<br>
> +            if ui.config(b'commands', b'update.check') == b'noconflict':<br>
>                   pass<br>
>               else:<br>
> -                cmdutil.bailifchanged(repo, hint=_('do you want --merge?'))<br>
> +                cmdutil.bailifchanged(repo, hint=_(b'do you want --merge?'))<br>
>   <br>
> -        topic = not opts.get("no_topic", False)<br>
> +        topic = not opts.get(b"no_topic", False)<br>
>           hastopic = bool(_getcurrenttopic(repo))<br>
>   <br>
>           template = shorttemplate<br>
>           if topic and hastopic:<br>
>               template = utility.stacktemplate<br>
>   <br>
> -        displayer = compat.changesetdisplayer(ui, repo, {'template': template})<br>
> +        displayer = compat.changesetdisplayer(ui, repo, {b'template': template})<br>
>   <br>
>           target, bookmark = _findprevtarget(repo, displayer,<br>
> -                                           opts.get('move_bookmark'), topic)<br>
> +                                           opts.get(b'move_bookmark'), topic)<br>
>           if target is not None:<br>
> -            backup = repo.ui.backupconfig('_internal', 'keep-topic')<br>
> +            backup = repo.ui.backupconfig(b'_internal', b'keep-topic')<br>
>               try:<br>
>                   if topic and _getcurrenttopic(repo) != _gettopic(target):<br>
> -                    repo.ui.setconfig('_internal', 'keep-topic', 'yes',<br>
> -                                      source='topic-extension')<br>
> +                    repo.ui.setconfig(b'_internal', b'keep-topic', b'yes',<br>
> +                                      source=b'topic-extension')<br>
>                   _prevupdate(repo, displayer, target, bookmark, dryrunopt,<br>
>                               mergeopt)<br>
>               finally:<br>
> @@ -1041,15 +1041,15 @@<br>
>           lockmod.release(wlock)<br>
>   <br>
>   @eh.command(<br>
> -    'next',<br>
> -    [('B', 'move-bookmark', False,<br>
> -        _('move active bookmark after update')),<br>
> -     ('m', 'merge', False, _('bring uncommitted change along')),<br>
> -     ('', 'evolve', True, _('evolve the next changeset if necessary')),<br>
> -     ('', 'no-topic', False, _('ignore topic and move topologically')),<br>
> -     ('n', 'dry-run', False,<br>
> -      _('do not perform actions, just print what would be done'))],<br>
> -    '[OPTION]...',<br>
> +    b'next',<br>
> +    [(b'B', b'move-bookmark', False,<br>
> +        _(b'move active bookmark after update')),<br>
> +     (b'm', b'merge', False, _(b'bring uncommitted change along')),<br>
> +     (b'', b'evolve', True, _(b'evolve the next changeset if necessary')),<br>
> +     (b'', b'no-topic', False, _(b'ignore topic and move topologically')),<br>
> +     (b'n', b'dry-run', False,<br>
> +      _(b'do not perform actions, just print what would be done'))],<br>
> +    b'[OPTION]...',<br>
>       helpbasic=True)<br>
>   def cmdnext(ui, repo, **opts):<br>
>       """update to next child revision<br>
> @@ -1060,29 +1060,29 @@<br>
>       Displays the summary line of the destination for clarity.<br>
>       """<br>
>       wlock = None<br>
> -    dryrunopt = opts['dry_run']<br>
> +    dryrunopt = opts[b'dry_run']<br>
>       if not dryrunopt:<br>
>           wlock = repo.wlock()<br>
>       try:<br>
>           wkctx = repo[None]<br>
>           wparents = wkctx.parents()<br>
>           if len(wparents) != 1:<br>
> -            raise error.Abort(_('merge in progress'))<br>
> +            raise error.Abort(_(b'merge in progress'))<br>
>   <br>
>           children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]<br>
>           topic = _getcurrenttopic(repo)<br>
>           filtered = set()<br>
>           template = shorttemplate<br>
> -        if topic and not opts.get("no_topic", False):<br>
> +        if topic and not opts.get(b"no_topic", False):<br>
>               filtered = set(ctx for ctx in children if ctx.topic() != topic)<br>
>               children = [ctx for ctx in children if ctx not in filtered]<br>
>               template = utility.stacktemplate<br>
> -            opts['stacktemplate'] = True<br>
> -        displayer = compat.changesetdisplayer(ui, repo, {'template': template})<br>
> +            opts[b'stacktemplate'] = True<br>
> +        displayer = compat.changesetdisplayer(ui, repo, {b'template': template})<br>
>   <br>
>           # check if we need to evolve while updating to the next child revision<br>
>           needevolve = False<br>
> -        aspchildren = evolvecmd._aspiringchildren(repo, [repo['.'].rev()])<br>
> +        aspchildren = evolvecmd._aspiringchildren(repo, [repo[b'.'].rev()])<br>
>           if topic:<br>
>               filtered.update(repo[c] for c in aspchildren<br>
>                               if repo[c].topic() != topic)<br>
> @@ -1101,54 +1101,54 @@<br>
>               needevolve = True<br>
>   <br>
>           # check if working directory is clean before we evolve the next cset<br>
> -        if needevolve and opts['evolve']:<br>
> -            hint = _('use `hg amend`, `hg revert` or `hg shelve`')<br>
> +        if needevolve and opts[b'evolve']:<br>
> +            hint = _(b'use `hg amend`, `hg revert` or `hg shelve`')<br>
>               cmdutil.bailifchanged(repo, hint=hint)<br>
>   <br>
> -        if not (opts['merge'] or (needevolve and opts['evolve'])):<br>
> +        if not (opts[b'merge'] or (needevolve and opts[b'evolve'])):<br>
>               # we only skip the check if noconflict is set<br>
> -            if ui.config('commands', 'update.check') == 'noconflict':<br>
> +            if ui.config(b'commands', b'update.check') == b'noconflict':<br>
>                   pass<br>
>               else:<br>
> -                cmdutil.bailifchanged(repo, hint=_('do you want --merge?'))<br>
> +                cmdutil.bailifchanged(repo, hint=_(b'do you want --merge?'))<br>
>   <br>
>           if len(children) == 1:<br>
>               c = children[0]<br>
>               return _updatetonext(ui, repo, c, displayer, opts)<br>
>           elif children:<br>
> -            cheader = _("ambiguous next changeset, choose one to update:")<br>
> +            cheader = _(b"ambiguous next changeset, choose one to update:")<br>
>               crevs = [c.rev() for c in children]<br>
>               choosedrev = utility.revselectionprompt(ui, repo, crevs, cheader)<br>
>               if choosedrev is None:<br>
> -                ui.warn(_("ambiguous next changeset:\n"))<br>
> +                ui.warn(_(b"ambiguous next changeset:\n"))<br>
>                   for c in children:<br>
>                       displayer.show(c)<br>
> -                ui.warn(_("explicitly update to one of them\n"))<br>
> +                ui.warn(_(b"explicitly update to one of them\n"))<br>
>                   return 1<br>
>               else:<br>
>                   return _updatetonext(ui, repo, repo[choosedrev], displayer, opts)<br>
>           else:<br>
> -            if not opts['evolve'] or not aspchildren:<br>
> +            if not opts[b'evolve'] or not aspchildren:<br>
>                   if filtered:<br>
> -                    ui.warn(_('no children on topic "%s"\n') % topic)<br>
> -                    ui.warn(_('do you want --no-topic\n'))<br>
> +                    ui.warn(_(b'no children on topic "%s"\n') % topic)<br>
> +                    ui.warn(_(b'do you want --no-topic\n'))<br>
>                   else:<br>
> -                    ui.warn(_('no children\n'))<br>
> +                    ui.warn(_(b'no children\n'))<br>
>                   if aspchildren:<br>
> -                    msg = _('(%i unstable changesets to be evolved here, '<br>
> -                            'do you want --evolve?)\n')<br>
> +                    msg = _(b'(%i unstable changesets to be evolved here, '<br>
> +                            b'do you want --evolve?)\n')<br>
>                       ui.warn(msg % len(aspchildren))<br>
>                   return 1<br>
>               elif len(aspchildren) > 1:<br>
> -                cheader = _("ambiguous next (unstable) changeset, choose one to"<br>
> -                            " evolve and update:")<br>
> +                cheader = _(b"ambiguous next (unstable) changeset, choose one to"<br>
> +                            b" evolve and update:")<br>
>                   choosedrev = utility.revselectionprompt(ui, repo,<br>
>                                                           aspchildren, cheader)<br>
>                   if choosedrev is None:<br>
> -                    ui.warn(_("ambiguous next (unstable) changeset:\n"))<br>
> +                    ui.warn(_(b"ambiguous next (unstable) changeset:\n"))<br>
>                       for c in aspchildren:<br>
>                           displayer.show(repo[c])<br>
> -                    ui.warn(_("(run 'hg evolve --rev REV' on one of them)\n"))<br>
> +                    ui.warn(_(b"(run 'hg evolve --rev REV' on one of them)\n"))<br>
>                       return 1<br>
>                   else:<br>
>                       return _nextevolve(ui, repo, repo[choosedrev], opts)<br>
> @@ -1161,51 +1161,51 @@<br>
>       """logic for hg next command to evolve and update to an aspiring children"""<br>
>   <br>
>       cmdutil.bailifchanged(repo)<br>
> -    evolvestate = state.cmdstate(repo, opts={'command': 'next',<br>
> -                                             'bookmarkchanges': []})<br>
> +    evolvestate = state.cmdstate(repo, opts={b'command': b'next',<br>
> +                                             b'bookmarkchanges': []})<br>
>       with repo.wlock(), repo.lock():<br>
> -        tr = repo.transaction("evolve")<br>
> +        tr = repo.transaction(b"evolve")<br>
>           with util.acceptintervention(tr):<br>
>               result = evolvecmd._solveone(ui, repo, repo[aspchildren],<br>
> -                                         evolvestate, opts.get('dry_run'),<br>
> +                                         evolvestate, opts.get(b'dry_run'),<br>
>                                            False,<br>
> -                                         lambda: None, category='orphan',<br>
> -                                         stacktmplt=opts.get('stacktemplate',<br>
> +                                         lambda: None, category=b'orphan',<br>
> +                                         stacktmplt=opts.get(b'stacktemplate',<br>
>                                                                False))<br>
>       # making sure a next commit is formed<br>
>       if result[0] and result[1]:<br>
> -        ui.status(_('working directory is now at %s\n')<br>
> -                  % ui.label(str(repo['.']), 'evolve.node'))<br>
> +        ui.status(_(b'working directory is now at %s\n')<br>
> +                  % ui.label(str(repo[b'.']), b'evolve.node'))<br>
>       return 0<br>
>   <br>
>   def _updatetonext(ui, repo, children, displayer, opts):<br>
>       """ logic for `hg next` command to update to children and move bookmarks if<br>
>       required """<br>
>       bm = repo._activebookmark<br>
> -    shouldmove = opts.get('move_bookmark') and bm is not None<br>
> -    if opts.get('dry_run'):<br>
> -        ui.write(_('hg update %s;\n') % children)<br>
> +    shouldmove = opts.get(b'move_bookmark') and bm is not None<br>
> +    if opts.get(b'dry_run'):<br>
> +        ui.write(_(b'hg update %s;\n') % children)<br>
>           if shouldmove:<br>
> -            ui.write(_('hg bookmark %s -r %s;\n') % (bm, children))<br>
> +            ui.write(_(b'hg bookmark %s -r %s;\n') % (bm, children))<br>
>       else:<br>
>           updatecheck = None<br>
>           # --merge is passed, we don't need to care about commands.update.check<br>
>           # config option<br>
> -        if opts['merge']:<br>
> -            updatecheck = 'none'<br>
> +        if opts[b'merge']:<br>
> +            updatecheck = b'none'<br>
>           try:<br>
>               ret = hg.updatetotally(ui, repo, children.node(), None,<br>
>                                      updatecheck=updatecheck)<br>
>           except error.Abort as exc:<br>
>               # replace the hint to mention about --merge option<br>
> -            exc.hint = _('do you want --merge?')<br>
> +            exc.hint = _(b'do you want --merge?')<br>
>               raise<br>
>   <br>
>           if not ret:<br>
>               lock = tr = None<br>
>               try:<br>
>                   lock = repo.lock()<br>
> -                tr = repo.transaction('next')<br>
> +                tr = repo.transaction(b'next')<br>
>                   if shouldmove:<br>
>                       bmchanges = [(bm, children.node())]<br>
>                       repo._bookmarks.applychanges(repo, tr, bmchanges)<br>
> @@ -1218,28 +1218,28 @@<br>
>           displayer.show(children)<br>
>       return 0<br>
>   <br>
> -@eh.wrapcommand('commit')<br>
> +@eh.wrapcommand(b'commit')<br>
>   def commitwrapper(orig, ui, repo, *arg, **kwargs):<br>
>       tr = None<br>
> -    if kwargs.get('amend', False):<br>
> +    if kwargs.get(b'amend', False):<br>
>           wlock = lock = None<br>
>       else:<br>
>           wlock = repo.wlock()<br>
>           lock = repo.lock()<br>
>       try:<br>
> -        obsoleted = kwargs.get('obsolete', [])<br>
> +        obsoleted = kwargs.get(b'obsolete', [])<br>
>           if obsoleted:<br>
> -            obsoleted = repo.set('%lr', obsoleted)<br>
> +            obsoleted = repo.set(b'%lr', obsoleted)<br>
>           result = orig(ui, repo, *arg, **kwargs)<br>
>           if not result: # commit succeeded<br>
> -            new = repo['tip']<br>
> +            new = repo[b'tip']<br>
>               oldbookmarks = []<br>
>               markers = []<br>
>               for old in obsoleted:<br>
>                   oldbookmarks.extend(repo.nodebookmarks(old.node()))<br>
>                   markers.append((old, (new,)))<br>
>               if markers:<br>
> -                obsolete.createmarkers(repo, markers, operation="amend")<br>
> +                obsolete.createmarkers(repo, markers, operation=b"amend")<br>
>               bmchanges = []<br>
>               for book in oldbookmarks:<br>
>                   bmchanges.append((book, new.node()))<br>
> @@ -1248,70 +1248,70 @@<br>
>                       wlock = repo.wlock()<br>
>                   if not lock:<br>
>                       lock = repo.lock()<br>
> -                tr = repo.transaction('commit')<br>
> +                tr = repo.transaction(b'commit')<br>
>                   repo._bookmarks.applychanges(repo, tr, bmchanges)<br>
>                   tr.close()<br>
>           return result<br>
>       finally:<br>
>           lockmod.release(tr, lock, wlock)<br>
>   <br>
> -@eh.wrapcommand('strip', extension='strip', opts=[<br>
> -    ('', 'bundle', None, _("delete the commit entirely and move it to a "<br>
> -                           "backup bundle")),<br>
> +@eh.wrapcommand(b'strip', extension=b'strip', opts=[<br>
> +    (b'', b'bundle', None, _(b"delete the commit entirely and move it to a "<br>
> +                             b"backup bundle")),<br>
>       ])<br>
>   def stripwrapper(orig, ui, repo, *revs, **kwargs):<br>
> -    if (not ui.configbool('experimental', 'prunestrip')<br>
> -        or kwargs.get('bundle', False)):<br>
> +    if (not ui.configbool(b'experimental', b'prunestrip')<br>
> +        or kwargs.get(b'bundle', False)):<br>
>           return orig(ui, repo, *revs, **kwargs)<br>
>   <br>
> -    if kwargs.get('force'):<br>
> -        ui.warn(_("warning: --force has no effect during strip with evolve "<br>
> -                  "enabled\n"))<br>
> -    if kwargs.get('no_backup', False):<br>
> -        ui.warn(_("warning: --no-backup has no effect during strips with "<br>
> -                  "evolve enabled\n"))<br>
> +    if kwargs.get(b'force'):<br>
> +        ui.warn(_(b"warning: --force has no effect during strip with evolve "<br>
> +                  b"enabled\n"))<br>
> +    if kwargs.get(b'no_backup', False):<br>
> +        ui.warn(_(b"warning: --no-backup has no effect during strips with "<br>
> +                  b"evolve enabled\n"))<br>
>   <br>
> -    revs = list(revs) + kwargs.pop('rev', [])<br>
> +    revs = list(revs) + kwargs.pop(b'rev', [])<br>
>       revs = set(scmutil.revrange(repo, revs))<br>
> -    revs = repo.revs("(%ld)::", revs)<br>
> -    kwargs['rev'] = []<br>
> -    kwargs['new'] = []<br>
> -    kwargs['succ'] = []<br>
> -    kwargs['biject'] = False<br>
> +    revs = repo.revs(b"(%ld)::", revs)<br>
> +    kwargs[b'rev'] = []<br>
> +    kwargs[b'new'] = []<br>
> +    kwargs[b'succ'] = []<br>
> +    kwargs[b'biject'] = False<br>
>       return cmdrewrite.cmdprune(ui, repo, *revs, **kwargs)<br>
>   <br>
>   @eh.extsetup<br>
>   def oldevolveextsetup(ui):<br>
> -    entry = cmdutil.findcmd('commit', commands.table)[1]<br>
> -    entry[1].append(('o', 'obsolete', [],<br>
> -                     _("make commit obsolete this revision (DEPRECATED)")))<br>
> +    entry = cmdutil.findcmd(b'commit', commands.table)[1]<br>
> +    entry[1].append((b'o', b'obsolete', [],<br>
> +                     _(b"make commit obsolete this revision (DEPRECATED)")))<br>
>   <br>
> -@eh.wrapfunction(obsolete, '_checkinvalidmarkers')<br>
> +@eh.wrapfunction(obsolete, b'_checkinvalidmarkers')<br>
>   def _checkinvalidmarkers(orig, markers):<br>
>       """search for marker with invalid data and raise error if needed<br>
>   <br>
>       Exist as a separated function to allow the evolve extension for a more<br>
>       subtle handling.<br>
>       """<br>
> -    if 'debugobsconvert' in sys.argv:<br>
> +    if b'debugobsconvert' in sys.argv:<br>
>           return<br>
>       for mark in markers:<br>
>           if node.nullid in mark[1]:<br>
> -            msg = _('bad obsolescence marker detected: invalid successors nullid')<br>
> -            hint = _('You should run `hg debugobsconvert`')<br>
> +            msg = _(b'bad obsolescence marker detected: invalid successors nullid')<br>
> +            hint = _(b'You should run `hg debugobsconvert`')<br>
>               raise error.Abort(msg, hint=hint)<br>
>   <br>
>   @eh.command(<br>
> -    'debugobsconvert',<br>
> -    [('', 'new-format', obsexchange._bestformat, _('Destination format for markers.'))],<br>
> -    '')<br>
> +    b'debugobsconvert',<br>
> +    [(b'', b'new-format', obsexchange._bestformat, _(b'Destination format for markers.'))],<br>
> +    b'')<br>
>   def debugobsconvert(ui, repo, new_format):<br>
>       origmarkers = repo.obsstore._all  # settle version<br>
>       if new_format == repo.obsstore._version:<br>
> -        msg = _('New format is the same as the old format, not upgrading!')<br>
> +        msg = _(b'New format is the same as the old format, not upgrading!')<br>
>           raise error.Abort(msg)<br>
>       with repo.lock():<br>
> -        f = repo.svfs('obsstore', 'wb', atomictemp=True)<br>
> +        f = repo.svfs(b'obsstore', b'wb', atomictemp=True)<br>
>           known = set()<br>
>           markers = []<br>
>           for m in origmarkers:<br>
> @@ -1324,11 +1324,11 @@<br>
>                   continue<br>
>               known.add(m)<br>
>               markers.append(m)<br>
> -        ui.write(_('Old store is version %d, will rewrite in version %d\n') % (<br>
> +        ui.write(_(b'Old store is version %d, will rewrite in version %d\n') % (<br>
>               repo.obsstore._version, new_format))<br>
>           map(f.write, obsolete.encodemarkers(markers, True, new_format))<br>
>           f.close()<br>
> -    ui.write(_('Done!\n'))<br>
> +    ui.write(_(b'Done!\n'))<br>
>   <br>
>   <br>
>   def _helploader(ui):<br>
> @@ -1337,40 +1337,40 @@<br>
>   @eh.uisetup<br>
>   def _setuphelp(ui):<br>
>       for entry in help.helptable:<br>
> -        if entry[0] == "evolution":<br>
> +        if entry[0] == b"evolution":<br>
>               break<br>
>       else:<br>
> -        help.helptable.append((["evolution"], _("Safely Rewriting History"),<br>
> -                              _helploader))<br>
> +        help.helptable.append(([b"evolution"], _(b"Safely Rewriting History"),<br>
> +                               _helploader))<br>
>           help.helptable.sort()<br>
>   <br>
>   evolvestateversion = 0<br>
>   <br>
>   def _evolvemessage():<br>
> -    _msg = _('To continue:    hg evolve --continue\n'<br>
> -             'To abort:       hg evolve --abort\n'<br>
> -             'To stop:        hg evolve --stop\n'<br>
> -             '(also see `hg help evolve.interrupted`)')<br>
> +    _msg = _(b'To continue:    hg evolve --continue\n'<br>
> +             b'To abort:       hg evolve --abort\n'<br>
> +             b'To stop:        hg evolve --stop\n'<br>
> +             b'(also see `hg help evolve.interrupted`)')<br>
>       return cmdutil._commentlines(_msg)<br>
>   <br>
>   @eh.uisetup<br>
>   def setupevolveunfinished(ui):<br>
> -    data = ('evolvestate', False, False, _('evolve in progress'),<br>
> -            _("use 'hg evolve --continue' or 'hg evolve --abort' to abort"))<br>
> +    data = (b'evolvestate', False, False, _(b'evolve in progress'),<br>
> +            _(b"use 'hg evolve --continue' or 'hg evolve --abort' to abort"))<br>
>       cmdutil.unfinishedstates.append(data)<br>
>   <br>
> -    afterresolved = ('evolvestate', _('hg evolve --continue'))<br>
> -    pickresolved = ('pickstate', _('hg pick --continue'))<br>
> +    afterresolved = (b'evolvestate', _(b'hg evolve --continue'))<br>
> +    pickresolved = (b'pickstate', _(b'hg pick --continue'))<br>
>       cmdutil.afterresolvedstates.append(afterresolved)<br>
>       cmdutil.afterresolvedstates.append(pickresolved)<br>
>   <br>
> -    if util.safehasattr(cmdutil, 'STATES'):<br>
> -        statedata = ('evolve', cmdutil.fileexistspredicate('evolvestate'),<br>
> +    if util.safehasattr(cmdutil, b'STATES'):<br>
> +        statedata = (b'evolve', cmdutil.fileexistspredicate(b'evolvestate'),<br>
>                        _evolvemessage)<br>
>           cmdutil.STATES = (statedata, ) + cmdutil.STATES<br>
>   <br>
> -@eh.wrapfunction(hg, 'clean')<br>
> +@eh.wrapfunction(hg, b'clean')<br>
>   def clean(orig, repo, *args, **kwargs):<br>
>       ret = orig(repo, *args, **kwargs)<br>
> -    util.unlinkpath(repo.vfs.join('evolvestate'), ignoremissing=True)<br>
> +    util.unlinkpath(repo.vfs.join(b'evolvestate'), ignoremissing=True)<br>
>       return ret<br>
> diff --git a/hgext3rd/evolve/cmdrewrite.py b/hgext3rd/evolve/cmdrewrite.py<br>
> --- a/hgext3rd/evolve/cmdrewrite.py<br>
> +++ b/hgext3rd/evolve/cmdrewrite.py<br>
> @@ -61,17 +61,17 @@<br>
>   def _checknotesize(ui, opts):<br>
>       """ make sure note is of valid format """<br>
>   <br>
> -    note = opts.get('note')<br>
> +    note = opts.get(b'note')<br>
>       if not note:<br>
>           return<br>
>   <br>
>       if not compat.isobsnotesupported():<br>
> -        ui.warn(_("current hg version does not support storing"<br>
> -                  " note in obsmarker\n"))<br>
> +        ui.warn(_(b"current hg version does not support storing"<br>
> +                  b" note in obsmarker\n"))<br>
>       if len(note) > 255:<br>
> -        raise error.Abort(_("cannot store a note of more than 255 bytes"))<br>
> -    if '\n' in note:<br>
> -        raise error.Abort(_("note cannot contain a newline"))<br>
> +        raise error.Abort(_(b"cannot store a note of more than 255 bytes"))<br>
> +    if b'\n' in note:<br>
> +        raise error.Abort(_(b"note cannot contain a newline"))<br>
>   <br>
>   def _resolveoptions(ui, opts):<br>
>       """modify commit options dict to handle related options<br>
> @@ -80,34 +80,34 @@<br>
>       -d was supplied.<br>
>       """<br>
>       # N.B. this is extremely similar to setupheaderopts() in mq.py<br>
> -    if not opts.get('date') and opts.get('current_date'):<br>
> -        opts['date'] = '%d %d' % compat.makedate()<br>
> -    if not opts.get('user') and opts.get('current_user'):<br>
> -        opts['user'] = ui.username()<br>
> +    if not opts.get(b'date') and opts.get(b'current_date'):<br>
> +        opts[b'date'] = b'%d %d' % compat.makedate()<br>
> +    if not opts.get(b'user') and opts.get(b'current_user'):<br>
> +        opts[b'user'] = ui.username()<br>
>   <br>
>   commitopts3 = [<br>
> -    ('D', 'current-date', None,<br>
> -     _('record the current date as commit date')),<br>
> -    ('U', 'current-user', None,<br>
> -     _('record the current user as committer')),<br>
> +    (b'D', b'current-date', None,<br>
> +     _(b'record the current date as commit date')),<br>
> +    (b'U', b'current-user', None,<br>
> +     _(b'record the current user as committer')),<br>
>   ]<br>
>   <br>
> -interactiveopt = [['i', 'interactive', None, _('use interactive mode')]]<br>
> +interactiveopt = [[b'i', b'interactive', None, _(b'use interactive mode')]]<br>
>   <br>
>   @eh.command(<br>
> -    'amend|refresh',<br>
> -    [('A', 'addremove', None,<br>
> -      _('mark new/missing files as added/removed before committing')),<br>
> -     ('a', 'all', False, _("match all files")),<br>
> -     ('e', 'edit', False, _('invoke editor on commit messages')),<br>
> -     ('', 'extract', False, _('extract changes from the commit to the working copy')),<br>
> -     ('', 'patch', False, _('make changes to wdir parent by editing patch')),<br>
> -     ('', 'close-branch', None,<br>
> -      _('mark a branch as closed, hiding it from the branch list')),<br>
> -     ('s', 'secret', None, _('use the secret phase for committing')),<br>
> -     ('n', 'note', '', _('store a note on amend'), _('TEXT')),<br>
> -    ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt,<br>
> -    _('[OPTION]... [FILE]...'),<br>
> +    b'amend|refresh',<br>
> +    [(b'A', b'addremove', None,<br>
> +      _(b'mark new/missing files as added/removed before committing')),<br>
> +     (b'a', b'all', False, _(b"match all files")),<br>
> +     (b'e', b'edit', False, _(b'invoke editor on commit messages')),<br>
> +     (b'', b'extract', False, _(b'extract changes from the commit to the working copy')),<br>
> +     (b'', b'patch', False, _(b'make changes to wdir parent by editing patch')),<br>
> +     (b'', b'close-branch', None,<br>
> +      _(b'mark a branch as closed, hiding it from the branch list')),<br>
> +     (b's', b'secret', None, _(b'use the secret phase for committing')),<br>
> +     (b'n', b'note', b'', _(b'store a note on amend'), _(b'TEXT')),<br>
> +     ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt,<br>
> +    _(b'[OPTION]... [FILE]...'),<br>
>       helpbasic=True)<br>
>   def amend(ui, repo, *pats, **opts):<br>
>       """combine a changeset with updates and replace it with a new one<br>
> @@ -127,34 +127,34 @@<br>
>       """<br>
>       _checknotesize(ui, opts)<br>
>       opts = opts.copy()<br>
> -    if opts.get('patch'):<br>
> +    if opts.get(b'patch'):<br>
>           return amendpatch(ui, repo, *pats, **opts)<br>
> -    if opts.get('extract'):<br>
> +    if opts.get(b'extract'):<br>
>           return uncommit(ui, repo, *pats, **opts)<br>
>       else:<br>
> -        if opts.pop('all', False):<br>
> +        if opts.pop(b'all', False):<br>
>               # add an include for all<br>
> -            include = list(opts.get('include'))<br>
> -            include.append('re:.*')<br>
> -        edit = opts.pop('edit', False)<br>
> -        log = opts.get('logfile')<br>
> -        opts['amend'] = True<br>
> +            include = list(opts.get(b'include'))<br>
> +            include.append(b're:.*')<br>
> +        edit = opts.pop(b'edit', False)<br>
> +        log = opts.get(b'logfile')<br>
> +        opts[b'amend'] = True<br>
>           _resolveoptions(ui, opts)<br>
> -        _alias, commitcmd = cmdutil.findcmd('commit', commands.table)<br>
> +        _alias, commitcmd = cmdutil.findcmd(b'commit', commands.table)<br>
>           with repo.wlock(), repo.lock():<br>
> -            if not (edit or opts['message'] or log):<br>
> -                opts['message'] = repo['.'].description()<br>
> -            rewriteutil.precheck(repo, [repo['.'].rev()], action='amend')<br>
> +            if not (edit or opts[b'message'] or log):<br>
> +                opts[b'message'] = repo[b'.'].description()<br>
> +            rewriteutil.precheck(repo, [repo[b'.'].rev()], action=b'amend')<br>
>               return commitcmd[0](ui, repo, *pats, **opts)<br>
>   <br>
>   def amendpatch(ui, repo, *pats, **opts):<br>
>       """logic for --patch flag of `hg amend` command."""<br>
> -    with repo.wlock(), repo.lock(), repo.transaction('amend') as tr:<br>
> +    with repo.wlock(), repo.lock(), repo.transaction(b'amend') as tr:<br>
>           cmdutil.bailifchanged(repo)<br>
>           # first get the patch<br>
> -        old = repo['.']<br>
> +        old = repo[b'.']<br>
>           p1 = old.p1()<br>
> -        rewriteutil.precheck(repo, [old.rev()], 'amend')<br>
> +        rewriteutil.precheck(repo, [old.rev()], b'amend')<br>
>           diffopts = patch.difffeatureopts(repo.ui, whitespace=True)<br>
>           diffopts.nodates = True<br>
>           diffopts.git = True<br>
> @@ -167,12 +167,12 @@<br>
>               fp.write(chunk)<br>
>           newnode = _editandapply(ui, repo, pats, old, p1, fp, diffopts)<br>
>           if newnode == old.node():<br>
> -            raise error.Abort(_("nothing changed"))<br>
> +            raise error.Abort(_(b"nothing changed"))<br>
>           metadata = {}<br>
> -        if opts.get('note'):<br>
> -            metadata['note'] = opts['note']<br>
> +        if opts.get(b'note'):<br>
> +            metadata[b'note'] = opts[b'note']<br>
>           replacements = {old.node(): [newnode]}<br>
> -        scmutil.cleanupnodes(repo, replacements, operation='amend',<br>
> +        scmutil.cleanupnodes(repo, replacements, operation=b'amend',<br>
>                                metadata=metadata)<br>
>           phases.retractboundary(repo, tr, old.phase(), [newnode])<br>
>           hg.updaterepo(repo, newnode, True)<br>
> @@ -183,7 +183,7 @@<br>
>           fp.seek(0)<br>
>           previous_patch = fp.getvalue()<br>
>           if 5 <= len(ui.edit.im_func.func_defaults):<br>
> -            newpatch = ui.edit(fp.getvalue(), old.user(), action="diff")<br>
> +            newpatch = ui.edit(fp.getvalue(), old.user(), action=b"diff")<br>
>           else:<br>
>               newpatch = ui.edit(fp.getvalue(), old.user())<br>
>   <br>
> @@ -191,7 +191,7 @@<br>
>           afp.write(newpatch)<br>
>           if pats:<br>
>               # write rest of the files in the patch<br>
> -            restmatcher = scmutil.match(old, [], opts={'exclude': pats})<br>
> +            restmatcher = scmutil.match(old, [], opts={b'exclude': pats})<br>
>               for chunk, label in patch.diffui(repo, p1.node(), old.node(),<br>
>                                                match=restmatcher,<br>
>                                                opts=diffopts):<br>
> @@ -199,21 +199,21 @@<br>
>   <br>
>           user_patch = afp.getvalue()<br>
>           if not user_patch:<br>
> -            raise error.Abort(_("empty patch file, amend aborted"))<br>
> +            raise error.Abort(_(b"empty patch file, amend aborted"))<br>
>           if user_patch == previous_patch:<br>
> -            raise error.Abort(_("patch unchanged"))<br>
> +            raise error.Abort(_(b"patch unchanged"))<br>
>           afp.seek(0)<br>
>           # write the patch to repo a</blockquote></div></div></div>