<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>