diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -206,7 +206,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, branch=""): +def _logundoredoindex(repo, reverseindex, branch=""): rlog = _getrevlog(repo, 'index.i') hexnode = hex(rlog.node(_invertindex(rlog, reverseindex))) return repo.vfs.write("undolog/redonode", str(hexnode) + "\0" + branch) @@ -566,18 +566,19 @@ if branch and reverseindex != 1: raise error.Abort(_("--branch with --index not supported")) + if relativeundo: + reverseindex = _computerelative(repo, reverseindex, + absolute = not relativeundo, + branch = branch) if preview: - _preview(ui, repo) + _preview(ui, repo, reverseindex) return with repo.wlock(), repo.lock(), repo.transaction("undo"): cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) repo = repo.unfiltered() - reverseindex = _computerelative(repo, reverseindex, - absolute=not relativeundo, - branch=branch) if not (opts.get("force") or _gapcheck(repo, reverseindex)): raise error.Abort(_("attempted risky undo across" " missing history")) @@ -586,12 +587,14 @@ # 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, branch) + _logundoredoindex(repo, reverseindex, branch) @command('redo', [ ('b', 'branch', "", _("single branch undo, accepts commit hash " "(ADVANCED)")), ('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 @@ -605,17 +608,23 @@ """ branch = opts.get("branch") reverseindex = -1 * abs(opts.get("index")) + preview = opts.get("preview") if branch and reverseindex != -1: raise error.Abort(_("--branch with --index not supported")) + reverseindex = _computerelative(repo, reverseindex) + + if preview: + _preview(ui, repo, reverseindex) + return + with repo.wlock(), repo.lock(), repo.transaction("redo"): cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) repo = repo.unfiltered() - reverseindex = _computerelative(repo, reverseindex, branch=branch) _undoto(ui, repo, reverseindex, branch=branch) - _logundoredoindex(repo, repo.currenttransaction(), reverseindex, branch) + _logundoredoindex(repo, reverseindex, branch=branch) def _undoto(ui, repo, reverseindex, keep=False, branch=None): # undo to specific reverseindex @@ -879,7 +888,7 @@ ctxts = repo.set(rev) inhibit.revive(ctxts) -def _preview(ui, repo): +def _preview(ui, repo, reverseindex): # Print smartlog like preview of undo # Input: # ui: @@ -887,15 +896,23 @@ # Output: # None - reverseindex = 1 - opts = {} - opts["template"] = "{undopreview}" - reverseindex = _computerelative(repo, reverseindex) - repo = repo.unfiltered() - revstring = revsetlang.formatspec("olddraft(%d) + olddraft(0)", - reverseindex) - opts['rev'] = [revstring] - cmdutil.graphlog(ui, repo, None, opts) + savedindex = _computerelative(repo, 0) + _logundoredoindex(repo, reverseindex - 1) + try: + opts = {} + opts["template"] = "{undopreview}" + repo = repo.unfiltered() + revstring = revsetlang.formatspec("olddraft(%d) + olddraft(0)", + reverseindex) + opts['rev'] = [revstring] + try: + cmdutil.graphlog(ui, repo, None, opts) + except IndexError: + # don't print anything + pass + finally: # always restore undoredo + _logundoredoindex(repo, savedindex) + return # Tools diff --git a/tests/test-undo.t b/tests/test-undo.t --- a/tests/test-undo.t +++ b/tests/test-undo.t @@ -709,6 +709,8 @@ $ cat >> $HGRCPATH < [extensions] > smartlog = $TESTDIR/../hgext3rd/smartlog.py + > [templatealias] + > undopreview = '{if(undonecommits, "Undone")}' > EOF $ touch prev1 && hg add prev1 && hg ci -m prev1 $ hg log -Gr "olddraft(1) + olddraft(0)" -T "{label(sl_label, separate('\n', separate(' ', separate(' ', label('sl.oldbook', '{if(undonecommits, shortest(undonecommits, 6))}'), label('sl.book', '{label('sl.book', '{if(donecommits, shortest(donecommits, 6))}')}')), sl_user, sl_diff, separate(' ', label('sl.book', oldbookmarks), label('sl.oldbook', removedbookmarks))), '{sl_desc}', '\n'))}" @@ -731,6 +733,46 @@ o 49cdb4 feature1 | ~ + $ hg undo -p + @ Undone + | + o + | + | o + |/ + o + | + o + | + o + | + ~ + o + | + ~ + o + | + ~ + $ hg undo -p -n 2 + @ Undone + | + o Undone + | + | o + |/ + o + | + o + | + o + | + ~ + o + | + ~ + o + | + ~ $ cat >> $HGRCPATH < [extensions] > smartlog =!