diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -207,7 +207,7 @@ revstring = "\n".join(sorted('%s %s' % (k, v) for k, v in nodes.items())) return writelog(repo, tr, "index.i", revstring) -def _logundoredoindex(repo, tr, reverseindex): +def _logundoredoindex(repo, reverseindex): rlog = _getrevlog(repo, 'index.i') hexnode = hex(rlog.node(_invertindex(rlog, reverseindex))) return repo.vfs.write("undolog/redonode", str(hexnode)) @@ -539,16 +539,17 @@ keep = opts.get("keep") preview = opts.get("preview") + if relativeundo: + reverseindex = _computerelative(repo, reverseindex) + if preview: - _preview(ui, repo, **opts) + _preview(ui, repo, reverseindex, **opts) return with repo.wlock(), repo.lock(), repo.transaction("undo"): cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) repo = repo.unfiltered() - if relativeundo: - reverseindex = _computerelative(repo, reverseindex) if not (opts.get("force") or _gapcheck(repo, reverseindex)): raise error.Abort(_("attempted risky undo across" " missing history")) @@ -556,10 +557,12 @@ # store undo data # for absolute undos, think of this as a reset # for relative undos, think of this as an update - _logundoredoindex(repo, repo.currenttransaction(), reverseindex) + _logundoredoindex(repo, reverseindex) @command('redo', [ ('n', 'index', 1, _("how many commands to redo")), + ('p', 'preview', False, _("see smartlog like preview of future redo " + "state")), ]) def redo(ui, repo, *args, **opts): """ perform a redo @@ -573,13 +576,18 @@ """ reverseindex = -1 * abs(opts.get("index")) reverseindex = _computerelative(repo, reverseindex) + preview = opts.get("preview") + + if preview: + _preview(ui, repo, reverseindex, **opts) + return with repo.wlock(), repo.lock(), repo.transaction("redo"): cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) repo = repo.unfiltered() _undoto(ui, repo, reverseindex) - _logundoredoindex(repo, repo.currenttransaction(), reverseindex) + _logundoredoindex(repo, reverseindex) def _undoto(ui, repo, reverseindex, keep=False): # undo to specific reverseindex @@ -706,7 +714,7 @@ ctxts = repo.set(rev) inhibit.revive(ctxts) -def _preview(ui, repo, **opts): +def _preview(ui, repo, reverseindex, **opts): # Print smartlog like preview of undo # Input: # ui: @@ -715,35 +723,40 @@ # Output: # None # Requires smartlog extension + savedindex = _computerelative(repo, 0) try: smartlog = extensions.find('smartlog') except KeyError: raise error.Abort(_('undo requires smartlog to work properly')) - reverseindex = opts.get("index") - opts["template"] = "{undopreview}" - reverseindex = _computerelative(repo, reverseindex) - revstring = revsetlang.formatspec("olddraft(%d)", reverseindex) - revs = set() + # overwrite undoredo with fake index, so that relative calls of 1 will + # return the index we want + _logundoredoindex(repo, reverseindex - 1) try: - revs.update(repo.revs(revstring)) - except IndexError: - raise error.Abort(_("can't undo: no data past this point")) - return - repo.filtered('visible') - revs.update(repo.revs("draft()")) - repo = repo.unfiltered() - revs = sorted(list(revs), reverse=True) - overrides = {} - if ui.config('experimental', 'graphstyle.grandparent') == '|': - overrides[('experimental', 'graphstyle.grandparent')] = '2.' - with ui.configoverride(overrides, 'smartlog'): - masterstring = opts.get('master') - masterrevset = smartlog._masterrevset(ui, repo, masterstring) - masterrev = smartlog._masterrev(repo, masterrevset) - revdag = smartlog.getdag(ui, repo, revs, masterrev) - displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True) - cmdutil.displaygraph( - ui, repo, revdag, displayer, graphmod.asciiedges, None, None) + opts["template"] = "{undopreview}" + revstring = revsetlang.formatspec("olddraft(%d)", reverseindex) + revs = set() + try: + revs.update(repo.revs(revstring)) + except IndexError: + raise error.Abort(_("can't undo: no data past this point")) + return + repo.filtered('visible') + revs.update(repo.revs("draft()")) + repo = repo.unfiltered() + revs = sorted(list(revs), reverse=True) + overrides = {} + if ui.config('experimental', 'graphstyle.grandparent') == '|': + overrides[('experimental', 'graphstyle.grandparent')] = '2.' + with ui.configoverride(overrides, 'smartlog'): + masterstring = opts.get('master') + masterrevset = smartlog._masterrevset(ui, repo, masterstring) + masterrev = smartlog._masterrev(repo, masterrevset) + revdag = smartlog.getdag(ui, repo, revs, masterrev) + displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True) + cmdutil.displaygraph( + ui, repo, revdag, displayer, graphmod.asciiedges, None, None) + finally:# always restore undoredo + _logundoredoindex(repo, savedindex) return # Tools