diff -r 2372284d9457 -r 687b865b95ad mercurial/shelve.py --- a/mercurial/shelve.py Sun Oct 06 09:45:02 2019 -0400 +++ b/mercurial/shelve.py Sun Oct 06 09:48:39 2019 -0400 @@ -56,15 +56,15 @@ stringutil, ) -backupdir = 'shelve-backup' -shelvedir = 'shelved' -shelvefileextensions = ['hg', 'patch', 'shelve'] +backupdir = b'shelve-backup' +shelvedir = b'shelved' +shelvefileextensions = [b'hg', b'patch', b'shelve'] # universal extension is present in all types of shelves -patchextension = 'patch' +patchextension = b'patch' # we never need the user, so we use a # generic user for all shelve operations -shelveuser = 'shelve@localhost' +shelveuser = b'shelve@localhost' class shelvedfile(object): @@ -80,7 +80,7 @@ self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir)) self.ui = self.repo.ui if filetype: - self.fname = name + '.' + filetype + self.fname = name + b'.' + filetype else: self.fname = name @@ -93,9 +93,9 @@ def backupfilename(self): def gennames(base): yield base - base, ext = base.rsplit('.', 1) + base, ext = base.rsplit(b'.', 1) for i in itertools.count(1): - yield '%s-%d.%s' % (base, i, ext) + yield b'%s-%d.%s' % (base, i, ext) name = self.backupvfs.join(self.fname) for n in gennames(name): @@ -110,13 +110,13 @@ def stat(self): return self.vfs.stat(self.fname) - def opener(self, mode='rb'): + def opener(self, mode=b'rb'): try: return self.vfs(self.fname, mode) except IOError as err: if err.errno != errno.ENOENT: raise - raise error.Abort(_("shelved change '%s' not found") % self.name) + raise error.Abort(_(b"shelved change '%s' not found") % self.name) def applybundle(self, tr): fp = self.opener() @@ -125,18 +125,18 @@ if not phases.supportinternal(self.repo): targetphase = phases.secret gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs) - pretip = self.repo['tip'] + pretip = self.repo[b'tip'] bundle2.applybundle( self.repo, gen, tr, - source='unshelve', - url='bundle:' + self.vfs.join(self.fname), + source=b'unshelve', + url=b'bundle:' + self.vfs.join(self.fname), targetphase=targetphase, ) - shelvectx = self.repo['tip'] + shelvectx = self.repo[b'tip'] if pretip == shelvectx: - shelverev = tr.changes['revduplicates'][-1] + shelverev = tr.changes[b'revduplicates'][-1] shelvectx = self.repo[shelverev] return shelvectx finally: @@ -145,24 +145,24 @@ def bundlerepo(self): path = self.vfs.join(self.fname) return bundlerepo.instance( - self.repo.baseui, 'bundle://%s+%s' % (self.repo.root, path) + self.repo.baseui, b'bundle://%s+%s' % (self.repo.root, path) ) def writebundle(self, bases, node): cgversion = changegroup.safeversion(self.repo) - if cgversion == '01': - btype = 'HG10BZ' + if cgversion == b'01': + btype = b'HG10BZ' compression = None else: - btype = 'HG20' - compression = 'BZ' + btype = b'HG20' + compression = b'BZ' repo = self.repo.unfiltered() outgoing = discovery.outgoing( repo, missingroots=bases, missingheads=[node] ) - cg = changegroup.makechangegroup(repo, outgoing, cgversion, 'shelve') + cg = changegroup.makechangegroup(repo, outgoing, cgversion, b'shelve') bundle2.writebundle( self.ui, cg, self.fname, btype, self.vfs, compression=compression @@ -183,22 +183,22 @@ """ _version = 2 - _filename = 'shelvedstate' - _keep = 'keep' - _nokeep = 'nokeep' + _filename = b'shelvedstate' + _keep = b'keep' + _nokeep = b'nokeep' # colon is essential to differentiate from a real bookmark name - _noactivebook = ':no-active-bookmark' - _interactive = 'interactive' + _noactivebook = b':no-active-bookmark' + _interactive = b'interactive' @classmethod def _verifyandtransform(cls, d): """Some basic shelvestate syntactic verification and transformation""" try: - d['originalwctx'] = nodemod.bin(d['originalwctx']) - d['pendingctx'] = nodemod.bin(d['pendingctx']) - d['parents'] = [nodemod.bin(h) for h in d['parents'].split(' ')] - d['nodestoremove'] = [ - nodemod.bin(h) for h in d['nodestoremove'].split(' ') + d[b'originalwctx'] = nodemod.bin(d[b'originalwctx']) + d[b'pendingctx'] = nodemod.bin(d[b'pendingctx']) + d[b'parents'] = [nodemod.bin(h) for h in d[b'parents'].split(b' ')] + d[b'nodestoremove'] = [ + nodemod.bin(h) for h in d[b'nodestoremove'].split(b' ') ] except (ValueError, TypeError, KeyError) as err: raise error.CorruptedState(pycompat.bytestr(err)) @@ -222,15 +222,15 @@ # to detemine values of fields (i.g. name is on the second line, # originalwctx is on the third and so forth). Please do not change. keys = [ - 'version', - 'name', - 'originalwctx', - 'pendingctx', - 'parents', - 'nodestoremove', - 'branchtorestore', - 'keep', - 'activebook', + b'version', + b'name', + b'originalwctx', + b'pendingctx', + b'parents', + b'nodestoremove', + b'branchtorestore', + b'keep', + b'activebook', ] # this is executed only seldomly, so it is not a big deal # that we open this file twice @@ -255,25 +255,25 @@ else: raise error.Abort( _( - 'this version of shelve is incompatible ' - 'with the version used in this repo' + b'this version of shelve is incompatible ' + b'with the version used in this repo' ) ) cls._verifyandtransform(d) try: obj = cls() - obj.name = d['name'] - obj.wctx = repo[d['originalwctx']] - obj.pendingctx = repo[d['pendingctx']] - obj.parents = d['parents'] - obj.nodestoremove = d['nodestoremove'] - obj.branchtorestore = d.get('branchtorestore', '') - obj.keep = d.get('keep') == cls._keep - obj.activebookmark = '' - if d.get('activebook', '') != cls._noactivebook: - obj.activebookmark = d.get('activebook', '') - obj.interactive = d.get('interactive') == cls._interactive + obj.name = d[b'name'] + obj.wctx = repo[d[b'originalwctx']] + obj.pendingctx = repo[d[b'pendingctx']] + obj.parents = d[b'parents'] + obj.nodestoremove = d[b'nodestoremove'] + obj.branchtorestore = d.get(b'branchtorestore', b'') + obj.keep = d.get(b'keep') == cls._keep + obj.activebookmark = b'' + if d.get(b'activebook', b'') != cls._noactivebook: + obj.activebookmark = d.get(b'activebook', b'') + obj.interactive = d.get(b'interactive') == cls._interactive except (error.RepoLookupError, KeyError) as err: raise error.CorruptedState(pycompat.bytestr(err)) @@ -289,25 +289,27 @@ nodestoremove, branchtorestore, keep=False, - activebook='', + activebook=b'', interactive=False, ): info = { - "name": name, - "originalwctx": nodemod.hex(originalwctx.node()), - "pendingctx": nodemod.hex(pendingctx.node()), - "parents": ' '.join( + b"name": name, + b"originalwctx": nodemod.hex(originalwctx.node()), + b"pendingctx": nodemod.hex(pendingctx.node()), + b"parents": b' '.join( [nodemod.hex(p) for p in repo.dirstate.parents()] ), - "nodestoremove": ' '.join([nodemod.hex(n) for n in nodestoremove]), - "branchtorestore": branchtorestore, - "keep": cls._keep if keep else cls._nokeep, - "activebook": activebook or cls._noactivebook, + b"nodestoremove": b' '.join( + [nodemod.hex(n) for n in nodestoremove] + ), + b"branchtorestore": branchtorestore, + b"keep": cls._keep if keep else cls._nokeep, + b"activebook": activebook or cls._noactivebook, } if interactive: - info['interactive'] = cls._interactive + info[b'interactive'] = cls._interactive scmutil.simplekeyvaluefile(repo.vfs, cls._filename).write( - info, firstline=("%d" % cls._version) + info, firstline=(b"%d" % cls._version) ) @classmethod @@ -317,8 +319,8 @@ def cleanupoldbackups(repo): vfs = vfsmod.vfs(repo.vfs.join(backupdir)) - maxbackups = repo.ui.configint('shelve', 'maxbackups') - hgfiles = [f for f in vfs.listdir() if f.endswith('.' + patchextension)] + maxbackups = repo.ui.configint(b'shelve', b'maxbackups') + hgfiles = [f for f in vfs.listdir() if f.endswith(b'.' + patchextension)] hgfiles = sorted([(vfs.stat(f)[stat.ST_MTIME], f) for f in hgfiles]) if maxbackups > 0 and maxbackups < len(hgfiles): bordermtime = hgfiles[-maxbackups][0] @@ -330,7 +332,7 @@ continue base = f[: -(1 + len(patchextension))] for ext in shelvefileextensions: - vfs.tryunlink(base + '.' + ext) + vfs.tryunlink(base + b'.' + ext) def _backupactivebookmark(repo): @@ -348,7 +350,7 @@ def _aborttransaction(repo, tr): '''Abort current transaction for shelve/unshelve, but keep dirstate ''' - dirstatebackupname = 'dirstate.shelve' + dirstatebackupname = b'dirstate.shelve' repo.dirstate.savebackup(tr, dirstatebackupname) tr.abort() repo.dirstate.restorebackup(None, dirstatebackupname) @@ -360,27 +362,29 @@ def gennames(): yield label for i in itertools.count(1): - yield '%s-%02d' % (label, i) + yield b'%s-%02d' % (label, i) - name = opts.get('name') - label = repo._activebookmark or parent.branch() or 'default' + name = opts.get(b'name') + label = repo._activebookmark or parent.branch() or b'default' # slashes aren't allowed in filenames, therefore we rename it - label = label.replace('/', '_') - label = label.replace('\\', '_') + label = label.replace(b'/', b'_') + label = label.replace(b'\\', b'_') # filenames must not start with '.' as it should not be hidden - if label.startswith('.'): - label = label.replace('.', '_', 1) + if label.startswith(b'.'): + label = label.replace(b'.', b'_', 1) if name: if shelvedfile(repo, name, patchextension).exists(): - e = _("a shelved change named '%s' already exists") % name + e = _(b"a shelved change named '%s' already exists") % name raise error.Abort(e) # ensure we are not creating a subdirectory or a hidden file - if '/' in name or '\\' in name: - raise error.Abort(_('shelved change names can not contain slashes')) - if name.startswith('.'): - raise error.Abort(_("shelved change names can not start with '.'")) + if b'/' in name or b'\\' in name: + raise error.Abort( + _(b'shelved change names can not contain slashes') + ) + if name.startswith(b'.'): + raise error.Abort(_(b"shelved change names can not start with '.'")) else: for n in gennames(): @@ -411,25 +415,25 @@ def getcommitfunc(extra, interactive, editor=False): def commitfunc(ui, repo, message, match, opts): - hasmq = util.safehasattr(repo, 'mq') + hasmq = util.safehasattr(repo, b'mq') if hasmq: saved, repo.mq.checkapplied = repo.mq.checkapplied, False targetphase = phases.internal if not phases.supportinternal(repo): targetphase = phases.secret - overrides = {('phases', 'new-commit'): targetphase} + overrides = {(b'phases', b'new-commit'): targetphase} try: editor_ = False if editor: editor_ = cmdutil.getcommiteditor( - editform='shelve.shelve', **pycompat.strkwargs(opts) + editform=b'shelve.shelve', **pycompat.strkwargs(opts) ) with repo.ui.configoverride(overrides): return repo.commit( message, shelveuser, - opts.get('date'), + opts.get(b'date'), match, editor=editor_, extra=extra, @@ -440,8 +444,8 @@ def interactivecommitfunc(ui, repo, *pats, **opts): opts = pycompat.byteskwargs(opts) - match = scmutil.match(repo['.'], pats, {}) - message = opts['message'] + match = scmutil.match(repo[b'.'], pats, {}) + message = opts[b'message'] return commitfunc(ui, repo, message, match, opts) return interactivecommitfunc if interactive else commitfunc @@ -451,19 +455,19 @@ stat = repo.status(match=scmutil.match(repo[None], pats, opts)) if stat.deleted: ui.status( - _("nothing changed (%d missing files, see " "'hg status')\n") + _(b"nothing changed (%d missing files, see " b"'hg status')\n") % len(stat.deleted) ) else: - ui.status(_("nothing changed\n")) + ui.status(_(b"nothing changed\n")) def _shelvecreatedcommit(repo, node, name, match): - info = {'node': nodemod.hex(node)} - shelvedfile(repo, name, 'shelve').writeinfo(info) + info = {b'node': nodemod.hex(node)} + shelvedfile(repo, name, b'shelve').writeinfo(info) bases = list(mutableancestors(repo[node])) - shelvedfile(repo, name, 'hg').writebundle(bases, node) - with shelvedfile(repo, name, patchextension).opener('wb') as fp: + shelvedfile(repo, name, b'hg').writebundle(bases, node) + with shelvedfile(repo, name, patchextension).opener(b'wb') as fp: cmdutil.exportfile( repo, [node], fp, opts=mdiff.diffopts(git=True), match=match ) @@ -472,7 +476,7 @@ def _includeunknownfiles(repo, pats, opts, extra): s = repo.status(match=scmutil.match(repo[None], pats, opts), unknown=True) if s.unknown: - extra['shelve_unknown'] = '\0'.join(s.unknown) + extra[b'shelve_unknown'] = b'\0'.join(s.unknown) repo[None].add(s.unknown) @@ -497,12 +501,12 @@ origbranch = wctx.branch() if parent.node() != nodemod.nullid: - desc = "changes to: %s" % parent.description().split('\n', 1)[0] + desc = b"changes to: %s" % parent.description().split(b'\n', 1)[0] else: - desc = '(changes in empty repository)' + desc = b'(changes in empty repository)' - if not opts.get('message'): - opts['message'] = desc + if not opts.get(b'message'): + opts[b'message'] = desc lock = tr = activebookmark = None try: @@ -510,23 +514,23 @@ # use an uncommitted transaction to generate the bundle to avoid # pull races. ensure we don't print the abort message to stderr. - tr = repo.transaction('shelve', report=lambda x: None) + tr = repo.transaction(b'shelve', report=lambda x: None) - interactive = opts.get('interactive', False) - includeunknown = opts.get('unknown', False) and not opts.get( - 'addremove', False + interactive = opts.get(b'interactive', False) + includeunknown = opts.get(b'unknown', False) and not opts.get( + b'addremove', False ) name = getshelvename(repo, parent, opts) activebookmark = _backupactivebookmark(repo) - extra = {'internal': 'shelve'} + extra = {b'internal': b'shelve'} if includeunknown: _includeunknownfiles(repo, pats, opts, extra) if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts): # In non-bare shelve we don't store newly created branch # at bundled commit - repo.dirstate.setbranch(repo['.'].branch()) + repo.dirstate.setbranch(repo[b'.'].branch()) commitfunc = getcommitfunc(extra, interactive, editor=True) if not interactive: @@ -554,13 +558,13 @@ if ui.formatted(): desc = stringutil.ellipsis(desc, ui.termwidth()) - ui.status(_('shelved as %s\n') % name) - if opts['keep']: + ui.status(_(b'shelved as %s\n') % name) + if opts[b'keep']: with repo.dirstate.parentchange(): scmutil.movedirstate(repo, parent, match) else: hg.update(repo, parent.node()) - if origbranch != repo['.'].branch() and not _isbareshelve(pats, opts): + if origbranch != repo[b'.'].branch() and not _isbareshelve(pats, opts): repo.dirstate.setbranch(origbranch) _finishshelve(repo, tr) @@ -572,14 +576,14 @@ def _isbareshelve(pats, opts): return ( not pats - and not opts.get('interactive', False) - and not opts.get('include', False) - and not opts.get('exclude', False) + and not opts.get(b'interactive', False) + and not opts.get(b'include', False) + and not opts.get(b'exclude', False) ) def _iswctxonnewbranch(repo): - return repo[None].branch() != repo['.'].branch() + return repo[None].branch() != repo[b'.'].branch() def cleanupcmd(ui, repo): @@ -587,7 +591,7 @@ with repo.wlock(): for (name, _type) in repo.vfs.readdir(shelvedir): - suffix = name.rsplit('.', 1)[-1] + suffix = name.rsplit(b'.', 1)[-1] if suffix in shelvefileextensions: shelvedfile(repo, name).movetobackup() cleanupoldbackups(repo) @@ -596,7 +600,7 @@ def deletecmd(ui, repo, pats): """subcommand that deletes a specific shelve""" if not pats: - raise error.Abort(_('no shelved changes specified!')) + raise error.Abort(_(b'no shelved changes specified!')) with repo.wlock(): try: for name in pats: @@ -613,7 +617,7 @@ except OSError as err: if err.errno != errno.ENOENT: raise - raise error.Abort(_("shelved change '%s' not found") % name) + raise error.Abort(_(b"shelved change '%s' not found") % name) def listshelves(repo): @@ -626,7 +630,7 @@ return [] info = [] for (name, _type) in names: - pfx, sfx = name.rsplit('.', 1) + pfx, sfx = name.rsplit(b'.', 1) if not pfx or sfx != patchextension: continue st = shelvedfile(repo, name).stat() @@ -640,43 +644,43 @@ width = 80 if not ui.plain(): width = ui.termwidth() - namelabel = 'shelve.newest' - ui.pager('shelve') + namelabel = b'shelve.newest' + ui.pager(b'shelve') for mtime, name in listshelves(repo): sname = util.split(name)[1] if pats and sname not in pats: continue ui.write(sname, label=namelabel) - namelabel = 'shelve.name' + namelabel = b'shelve.name' if ui.quiet: - ui.write('\n') + ui.write(b'\n') continue - ui.write(' ' * (16 - len(sname))) + ui.write(b' ' * (16 - len(sname))) used = 16 date = dateutil.makedate(mtime) - age = '(%s)' % templatefilters.age(date, abbrev=True) - ui.write(age, label='shelve.age') - ui.write(' ' * (12 - len(age))) + age = b'(%s)' % templatefilters.age(date, abbrev=True) + ui.write(age, label=b'shelve.age') + ui.write(b' ' * (12 - len(age))) used += 12 - with open(name + '.' + patchextension, 'rb') as fp: + with open(name + b'.' + patchextension, b'rb') as fp: while True: line = fp.readline() if not line: break - if not line.startswith('#'): + if not line.startswith(b'#'): desc = line.rstrip() if ui.formatted(): desc = stringutil.ellipsis(desc, width - used) ui.write(desc) break - ui.write('\n') - if not (opts['patch'] or opts['stat']): + ui.write(b'\n') + if not (opts[b'patch'] or opts[b'stat']): continue difflines = fp.readlines() - if opts['patch']: + if opts[b'patch']: for chunk, label in patch.difflabel(iter, difflines): ui.write(chunk, label=label) - if opts['stat']: + if opts[b'stat']: for chunk, label in patch.diffstatui(difflines, width=width): ui.write(chunk, label=label) @@ -686,14 +690,14 @@ if len(pats) == 0: shelves = listshelves(repo) if not shelves: - raise error.Abort(_("there are no shelves to show")) + raise error.Abort(_(b"there are no shelves to show")) mtime, name = shelves[0] sname = util.split(name)[1] pats = [sname] for shelfname in pats: if not shelvedfile(repo, shelfname, patchextension).exists(): - raise error.Abort(_("cannot find shelf %s") % shelfname) + raise error.Abort(_(b"cannot find shelf %s") % shelfname) listcmd(ui, repo, pats, opts) @@ -702,34 +706,35 @@ """check parent while resuming an unshelve""" if state.parents != repo.dirstate.parents(): raise error.Abort( - _('working directory parents do not match unshelve ' 'state') + _(b'working directory parents do not match unshelve ' b'state') ) def _loadshelvedstate(ui, repo, opts): try: state = shelvedstate.load(repo) - if opts.get('keep') is None: - opts['keep'] = state.keep + if opts.get(b'keep') is None: + opts[b'keep'] = state.keep except IOError as err: if err.errno != errno.ENOENT: raise - cmdutil.wrongtooltocontinue(repo, _('unshelve')) + cmdutil.wrongtooltocontinue(repo, _(b'unshelve')) except error.CorruptedState as err: - ui.debug(pycompat.bytestr(err) + '\n') - if opts.get('continue'): - msg = _('corrupted shelved state file') + ui.debug(pycompat.bytestr(err) + b'\n') + if opts.get(b'continue'): + msg = _(b'corrupted shelved state file') hint = _( - 'please run hg unshelve --abort to abort unshelve ' 'operation' + b'please run hg unshelve --abort to abort unshelve ' + b'operation' ) raise error.Abort(msg, hint=hint) - elif opts.get('abort'): + elif opts.get(b'abort'): shelvedstate.clear(repo) raise error.Abort( _( - 'could not read shelved state file, your ' - 'working copy may be in an unexpected state\n' - 'please update to some commit\n' + b'could not read shelved state file, your ' + b'working copy may be in an unexpected state\n' + b'please update to some commit\n' ) ) return state @@ -747,24 +752,24 @@ mergefiles(ui, repo, state.wctx, state.pendingctx) if not phases.supportinternal(repo): repair.strip( - ui, repo, state.nodestoremove, backup=False, topic='shelve' + ui, repo, state.nodestoremove, backup=False, topic=b'shelve' ) finally: shelvedstate.clear(repo) - ui.warn(_("unshelve of '%s' aborted\n") % state.name) + ui.warn(_(b"unshelve of '%s' aborted\n") % state.name) def hgabortunshelve(ui, repo): """logic to abort unshelve using 'hg abort""" with repo.wlock(): - state = _loadshelvedstate(ui, repo, {'abort': True}) + state = _loadshelvedstate(ui, repo, {b'abort': True}) return unshelveabort(ui, repo, state) def mergefiles(ui, repo, wctx, shelvectx): """updates to wctx and merges the changes from shelvectx into the dirstate.""" - with ui.configoverride({('ui', 'quiet'): True}): + with ui.configoverride({(b'ui', b'quiet'): True}): hg.update(repo, wctx.node()) ui.pushbuffer(True) cmdutil.revert(ui, repo, shelvectx, repo.dirstate.parents()) @@ -775,13 +780,13 @@ if branchtorestore and branchtorestore != repo.dirstate.branch(): repo.dirstate.setbranch(branchtorestore) ui.status( - _('marked working directory as branch %s\n') % branchtorestore + _(b'marked working directory as branch %s\n') % branchtorestore ) def unshelvecleanup(ui, repo, name, opts): """remove related files after an unshelve""" - if not opts.get('keep'): + if not opts.get(b'keep'): for filetype in shelvefileextensions: shfile = shelvedfile(repo, name, filetype) if shfile.exists(): @@ -800,8 +805,8 @@ ms = merge.mergestate.read(repo) if list(ms.unresolved()): raise error.Abort( - _("unresolved conflicts, can't continue"), - hint=_("see 'hg resolve', then 'hg unshelve --continue'"), + _(b"unresolved conflicts, can't continue"), + hint=_(b"see 'hg resolve', then 'hg unshelve --continue'"), ) shelvectx = repo[state.parents[1]] @@ -814,8 +819,8 @@ targetphase = phases.internal if not phases.supportinternal(repo): targetphase = phases.secret - overrides = {('phases', 'new-commit'): targetphase} - with repo.ui.configoverride(overrides, 'unshelve'): + overrides = {(b'phases', b'new-commit'): targetphase} + with repo.ui.configoverride(overrides, b'unshelve'): with repo.dirstate.parentchange(): repo.setparents(state.parents[0], nodemod.nullid) newnode, ispartialunshelve = _createunshelvectx( @@ -829,8 +834,8 @@ merge.mergestate.clean(repo) shelvectx = state.pendingctx msg = _( - 'note: unshelved changes already existed ' - 'in the working copy\n' + b'note: unshelved changes already existed ' + b'in the working copy\n' ) ui.status(msg) else: @@ -844,20 +849,20 @@ if not phases.supportinternal(repo): repair.strip( - ui, repo, state.nodestoremove, backup=False, topic='shelve' + ui, repo, state.nodestoremove, backup=False, topic=b'shelve' ) shelvedstate.clear(repo) if not ispartialunshelve: unshelvecleanup(ui, repo, state.name, opts) _restoreactivebookmark(repo, state.activebookmark) - ui.status(_("unshelve of '%s' complete\n") % state.name) + ui.status(_(b"unshelve of '%s' complete\n") % state.name) def hgcontinueunshelve(ui, repo): """logic to resume unshelve using 'hg continue'""" with repo.wlock(): - state = _loadshelvedstate(ui, repo, {'continue': True}) - return unshelvecontinue(ui, repo, state, {'keep': state.keep}) + state = _loadshelvedstate(ui, repo, {b'continue': True}) + return unshelvecontinue(ui, repo, state, {b'keep': state.keep}) def _commitworkingcopychanges(ui, repo, opts, tmpwctx): @@ -870,16 +875,16 @@ return tmpwctx, addedbefore ui.status( _( - "temporarily committing pending changes " - "(restore with 'hg unshelve --abort')\n" + b"temporarily committing pending changes " + b"(restore with 'hg unshelve --abort')\n" ) ) - extra = {'internal': 'shelve'} + extra = {b'internal': b'shelve'} commitfunc = getcommitfunc(extra=extra, interactive=False, editor=False) tempopts = {} - tempopts['message'] = "pending changes temporary commit" - tempopts['date'] = opts.get('date') - with ui.configoverride({('ui', 'quiet'): True}): + tempopts[b'message'] = b"pending changes temporary commit" + tempopts[b'date'] = opts.get(b'date') + with ui.configoverride({(b'ui', b'quiet'): True}): node = cmdutil.commit(ui, repo, commitfunc, [], tempopts) tmpwctx = repo[node] return tmpwctx, addedbefore @@ -889,16 +894,16 @@ """Recreate commit in the repository during the unshelve""" repo = repo.unfiltered() node = None - if shelvedfile(repo, basename, 'shelve').exists(): - node = shelvedfile(repo, basename, 'shelve').readinfo()['node'] + if shelvedfile(repo, basename, b'shelve').exists(): + node = shelvedfile(repo, basename, b'shelve').readinfo()[b'node'] if node is None or node not in repo: - with ui.configoverride({('ui', 'quiet'): True}): - shelvectx = shelvedfile(repo, basename, 'hg').applybundle(tr) + with ui.configoverride({(b'ui', b'quiet'): True}): + shelvectx = shelvedfile(repo, basename, b'hg').applybundle(tr) # We might not strip the unbundled changeset, so we should keep track of # the unshelve node in case we need to reuse it (eg: unshelve --keep) if node is None: - info = {'node': nodemod.hex(shelvectx.node())} - shelvedfile(repo, basename, 'shelve').writeinfo(info) + info = {b'node': nodemod.hex(shelvectx.node())} + shelvedfile(repo, basename, b'shelve').writeinfo(info) else: shelvectx = repo[node] @@ -926,8 +931,8 @@ Here, we return both the newnode which is created interactively and a bool to know whether the shelve is partly done or completely done. """ - opts['message'] = shelvectx.description() - opts['interactive-unshelve'] = True + opts[b'message'] = shelvectx.description() + opts[b'interactive-unshelve'] = True pats = [] if not interactive: newnode = repo.commit( @@ -977,23 +982,23 @@ """Rebase restored commit from its original location to a destination""" # If the shelve is not immediately on top of the commit # we'll be merging with, rebase it to be on top. - interactive = opts.get('interactive') + interactive = opts.get(b'interactive') if tmpwctx.node() == shelvectx.p1().node() and not interactive: # We won't skip on interactive mode because, the user might want to # unshelve certain changes only. return shelvectx, False overrides = { - ('ui', 'forcemerge'): opts.get('tool', ''), - ('phases', 'new-commit'): phases.secret, + (b'ui', b'forcemerge'): opts.get(b'tool', b''), + (b'phases', b'new-commit'): phases.secret, } - with repo.ui.configoverride(overrides, 'unshelve'): - ui.status(_('rebasing shelved changes\n')) + with repo.ui.configoverride(overrides, b'unshelve'): + ui.status(_(b'rebasing shelved changes\n')) stats = merge.graft( repo, shelvectx, shelvectx.p1(), - labels=['shelve', 'working-copy'], + labels=[b'shelve', b'working-copy'], keepconflictparent=True, ) if stats.unresolvedcount: @@ -1010,14 +1015,14 @@ tmpwctx, nodestoremove, branchtorestore, - opts.get('keep'), + opts.get(b'keep'), activebookmark, interactive, ) raise error.InterventionRequired( _( - "unresolved conflicts (see 'hg resolve', then " - "'hg unshelve --continue')" + b"unresolved conflicts (see 'hg resolve', then " + b"'hg unshelve --continue')" ) ) @@ -1034,8 +1039,8 @@ merge.mergestate.clean(repo) shelvectx = tmpwctx msg = _( - 'note: unshelved changes already existed ' - 'in the working copy\n' + b'note: unshelved changes already existed ' + b'in the working copy\n' ) ui.status(msg) else: @@ -1048,10 +1053,10 @@ def _forgetunknownfiles(repo, shelvectx, addedbefore): # Forget any files that were unknown before the shelve, unknown before # unshelve started, but are now added. - shelveunknown = shelvectx.extra().get('shelve_unknown') + shelveunknown = shelvectx.extra().get(b'shelve_unknown') if not shelveunknown: return - shelveunknown = frozenset(shelveunknown.split('\0')) + shelveunknown = frozenset(shelveunknown.split(b'\0')) addedafter = frozenset(repo.status().added) toforget = (addedafter & shelveunknown) - addedbefore repo[None].forget(toforget) @@ -1074,66 +1079,66 @@ shelvetouched = set(shelvectx.files()) intersection = wcdeleted.intersection(shelvetouched) if intersection: - m = _("shelved change touches missing files") - hint = _("run hg status to see which files are missing") + m = _(b"shelved change touches missing files") + hint = _(b"run hg status to see which files are missing") raise error.Abort(m, hint=hint) def dounshelve(ui, repo, *shelved, **opts): opts = pycompat.byteskwargs(opts) - abortf = opts.get('abort') - continuef = opts.get('continue') - interactive = opts.get('interactive') + abortf = opts.get(b'abort') + continuef = opts.get(b'continue') + interactive = opts.get(b'interactive') if not abortf and not continuef: cmdutil.checkunfinished(repo) shelved = list(shelved) - if opts.get("name"): - shelved.append(opts["name"]) + if opts.get(b"name"): + shelved.append(opts[b"name"]) - if interactive and opts.get('keep'): - raise error.Abort(_('--keep on --interactive is not yet supported')) + if interactive and opts.get(b'keep'): + raise error.Abort(_(b'--keep on --interactive is not yet supported')) if abortf or continuef: if abortf and continuef: - raise error.Abort(_('cannot use both abort and continue')) + raise error.Abort(_(b'cannot use both abort and continue')) if shelved: raise error.Abort( _( - 'cannot combine abort/continue with ' - 'naming a shelved change' + b'cannot combine abort/continue with ' + b'naming a shelved change' ) ) - if abortf and opts.get('tool', False): - ui.warn(_('tool option will be ignored\n')) + if abortf and opts.get(b'tool', False): + ui.warn(_(b'tool option will be ignored\n')) state = _loadshelvedstate(ui, repo, opts) if abortf: return unshelveabort(ui, repo, state) elif continuef and interactive: - raise error.Abort(_('cannot use both continue and interactive')) + raise error.Abort(_(b'cannot use both continue and interactive')) elif continuef: return unshelvecontinue(ui, repo, state, opts) elif len(shelved) > 1: - raise error.Abort(_('can only unshelve one change at a time')) + raise error.Abort(_(b'can only unshelve one change at a time')) elif not shelved: shelved = listshelves(repo) if not shelved: - raise error.Abort(_('no shelved changes to apply!')) + raise error.Abort(_(b'no shelved changes to apply!')) basename = util.split(shelved[0][1])[1] - ui.status(_("unshelving change '%s'\n") % basename) + ui.status(_(b"unshelving change '%s'\n") % basename) else: basename = shelved[0] if not shelvedfile(repo, basename, patchextension).exists(): - raise error.Abort(_("shelved change '%s' not found") % basename) + raise error.Abort(_(b"shelved change '%s' not found") % basename) repo = repo.unfiltered() lock = tr = None try: lock = repo.lock() - tr = repo.transaction('unshelve', report=lambda x: None) + tr = repo.transaction(b'unshelve', report=lambda x: None) oldtiprev = len(repo) - pctx = repo['.'] + pctx = repo[b'.'] tmpwctx = pctx # The goal is to have a commit structure like so: # ...-> pctx -> tmpwctx -> shelvectx @@ -1147,7 +1152,7 @@ ) repo, shelvectx = _unshelverestorecommit(ui, repo, tr, basename) _checkunshelveuntrackedproblems(ui, repo, shelvectx) - branchtorestore = '' + branchtorestore = b'' if shelvectx.branch() != shelvectx.p1().branch(): branchtorestore = shelvectx.branch() @@ -1164,8 +1169,8 @@ branchtorestore, activebookmark, ) - overrides = {('ui', 'forcemerge'): opts.get('tool', '')} - with ui.configoverride(overrides, 'unshelve'): + overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')} + with ui.configoverride(overrides, b'unshelve'): mergefiles(ui, repo, pctx, shelvectx) restorebranch(ui, repo, branchtorestore) shelvedstate.clear(repo)