diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -13,9 +13,11 @@ from mercurial import ( cmdutil, + commands, dispatch, error, extensions, + fancyopts, hg, localrepo, lock as lockmod, @@ -578,7 +580,9 @@ if interactive: preview = True - if branch and reverseindex != 1: + repo = repo.unfiltered() + + if branch and reverseindex != 1 and reverseindex != -1: raise error.Abort(_("--branch with --index not supported")) if relativeundo: reverseindex = _computerelative(repo, reverseindex, @@ -626,7 +630,6 @@ with repo.wlock(), repo.lock(), repo.transaction("undo"): cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) - repo = repo.unfiltered() if not (opts.get("force") or _gapcheck(repo, reverseindex)): raise error.Abort(_("attempted risky undo across" " missing history")) @@ -638,30 +641,55 @@ _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 - Performs a redo. Specifically, redo moves forward a repo state relative to - the previous undo or redo command. If you run hg undo -n 10, you can redo - each of the 10 repo states one by one all the way back to the state from - which you ran undo. You can use --index to redo across more states at once, - and you can use any number of undos/redos up to the current state or back to - when the undo extension was first active. + Rolls back the previous undo. """ - branch = opts.get("branch") - reverseindex = -1 * abs(opts.get("index")) + shiftedindex = _computerelative(repo, 0) preview = opts.get("preview") - if branch and reverseindex != -1: - raise error.Abort(_("--branch with --index not supported")) + reverseindex = 0 + redocount = 0 + done = False + while not done: + # we step back the linear undo log + # redoes cancel out undoes, if we have one more undo, we should undo + # there, otherwise we continue looking + # we are careful to not redo past absolute undoes (bc we loose undoredo + # log info) + # if we run into something that isn't undo or redo, we Abort (including + # gaps in the log) + # we extract the --index arguments out of undoes to make sure we update + # the undoredo index correctly + nodedict = _readindex(repo, reverseindex) + commandstr = _readnode(repo, 'command.i', nodedict['command']) + commandlist = commandstr.split("\0") - reverseindex = _computerelative(repo, reverseindex) + if commandlist[0] == "undo": + undoopts = {} + fancyopts.fancyopts(commandlist[1:], + cmdtable['undo'][1] + commands.globalopts, + undoopts) + if redocount == 0: + # want to go to state before the undo (not after) + toshift = undoopts['index'] + shiftedindex -= toshift + reverseindex += 1 + done = True + else: + if undoopts['absolute']: + raise error.Abort(_("can't redo past absolute undo")) + reverseindex += 1 + redocount -= 1 + elif commandlist[0] == "redo": + redocount += 1 + reverseindex += 1 + else: + raise error.Abort(_("nothing to redo")) if preview: _preview(ui, repo, reverseindex) @@ -671,8 +699,9 @@ cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) repo = repo.unfiltered() - _undoto(ui, repo, reverseindex, branch=branch) - _logundoredoindex(repo, reverseindex, branch=branch) + _undoto(ui, repo, reverseindex) + # update undredo by removing what the given undo added + _logundoredoindex(repo, shiftedindex) def _undoto(ui, repo, reverseindex, keep=False, branch=None): # undo to specific reverseindex diff --git a/tests/test-undo.t b/tests/test-undo.t --- a/tests/test-undo.t +++ b/tests/test-undo.t @@ -274,8 +274,8 @@ feature2 7:296fda51a303 master 9:1dafc0b43612 -hg redo test - $ hg redo +hg undo with negative index + $ hg undo -n -1 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg log -G -T compact -l1 @ 9[tip][master,test] 1dafc0b43612 1970-01-01 00:00 +0000 test @@ -289,24 +289,24 @@ ~ $ hg undo -n 5 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg redo -n 5 + $ hg undo -n -5 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg log -G -T compact -l1 @ 9[tip][master] 1dafc0b43612 1970-01-01 00:00 +0000 test | cmiss ~ - $ hg redo -n 100 + $ hg undo -n -100 abort: index out of bounds [255] hg undo --absolute tests $ hg undo -a 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg redo + $ hg undo -n -1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg undo -a 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg redo + $ hg undo -n -1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg undo -n 5 0 files updated, 0 files merged, 0 files removed, 0 files unresolved @@ -415,7 +415,7 @@ f86734247df6db66a810e549cc938a72cd5c6d1a d0fdb9510dbf78c1a7e62c3e6628ff1f978f87ea 75f63379f12bf02d40fe7444587ad67be9ae81b8 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'split', 'user': 'test'} $ hg undo 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ hg redo + $ hg undo -n -1 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg debugobsolete | tail -5 d0fdb9510dbf78c1a7e62c3e6628ff1f978f87ea f86734247df6db66a810e549cc938a72cd5c6d1a 0 (Thu Jan 01 00:00:01 1970 +0000) {'operation': 'undo', 'user': 'test'} @@ -639,10 +639,8 @@ > rebase = ! > EOF -Check local redo works -Simple test should be sufficient, as per usual, redo is an undo with some index -logic - $ hg redo -b 3532 +Check local undo works forward + $ hg undo -n -1 -b 3532 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg log -l 2 changeset: 21:35324a911c0d @@ -666,9 +664,9 @@ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg undo -b 3532 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ hg redo -b 75f6 + $ hg undo -n -1 -b 75f6 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ hg redo -b 75f6 + $ hg undo -n -1 -b 75f6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg log -l 2 changeset: 22:3ee6a6880888 @@ -751,3 +749,148 @@ o | ~ + +hg redo tests + $ hg log -G -T compact + @ 23[tip] a0b72b3048d6 1970-01-01 00:00 +0000 test + | prev1 + | + o 22:18 3ee6a6880888 1970-01-01 00:00 +0000 test + | a9 + | + | o 21[newbook]:18 35324a911c0d 1970-01-01 00:00 +0000 test + |/ newbranch + | + o 18 75f63379f12b 1970-01-01 00:00 +0000 test + | newfiles + | + o 17:9 d0fdb9510dbf 1970-01-01 00:00 +0000 test + | newfiles + | + o 9[master] 1dafc0b43612 1970-01-01 00:00 +0000 test + | cmiss + | + o 8:4 0a3dd3e15e65 1970-01-01 00:00 +0000 test + | words + | + | o 7[feature2]:4 296fda51a303 1970-01-01 00:00 +0000 test + |/ d + | + o 4 38d85b506754 1970-01-01 00:00 +0000 test + | c2 + | + o 3:1 ec7553f7b382 1970-01-01 00:00 +0000 test + | c1 + | + | o 2[feature1] 49cdb4091aca 1970-01-01 00:00 +0000 test + |/ b + | + o 1 b68836a6e2ca 1970-01-01 00:00 +0000 test + | a2 + | + o 0 df4fd610a3d6 1970-01-01 00:00 +0000 test + a1 + + $ hg log -r . -T {node} + a0b72b3048d6d07b35b1d79c8e5c46b159d21cc9 (no-eol) + $ hg undo -n 2 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg redo + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg log -r . -T {node} + a0b72b3048d6d07b35b1d79c8e5c46b159d21cc9 (no-eol) + $ hg undo + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg undo + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg log -r . -T {node} + 75f63379f12bf02d40fe7444587ad67be9ae81b8 (no-eol) + $ hg undo -n 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg redo + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg log -r . -T {node} + 75f63379f12bf02d40fe7444587ad67be9ae81b8 (no-eol) + $ hg undo -n 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg redo + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg redo + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg redo + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg log -r . -T {node} + a0b72b3048d6d07b35b1d79c8e5c46b159d21cc9 (no-eol) + $ hg undo -fn 3 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg undo --force --index -1 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg debugundohistory -l + 0: undo --force --index -1 + 1: undo -fn 3 + 2: redo + 3: redo + 4: redo + $ hg redo + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg undo + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg log -r . -T {node} + 75f63379f12bf02d40fe7444587ad67be9ae81b8 (no-eol) + $ hg redo + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg redo + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg log -r . -T {node} + a0b72b3048d6d07b35b1d79c8e5c46b159d21cc9 (no-eol) + $ hg undo --traceback + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg undo -an1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg redo + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg redo + abort: can't redo past absolute undo + [255] + $ hg undo -n -1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg log -G -T compact + @ 23[tip] a0b72b3048d6 1970-01-01 00:00 +0000 test + | prev1 + | + o 22:18 3ee6a6880888 1970-01-01 00:00 +0000 test + | a9 + | + | o 21[newbook]:18 35324a911c0d 1970-01-01 00:00 +0000 test + |/ newbranch + | + o 18 75f63379f12b 1970-01-01 00:00 +0000 test + | newfiles + | + o 17:9 d0fdb9510dbf 1970-01-01 00:00 +0000 test + | newfiles + | + o 9[master] 1dafc0b43612 1970-01-01 00:00 +0000 test + | cmiss + | + o 8:4 0a3dd3e15e65 1970-01-01 00:00 +0000 test + | words + | + | o 7[feature2]:4 296fda51a303 1970-01-01 00:00 +0000 test + |/ d + | + o 4 38d85b506754 1970-01-01 00:00 +0000 test + | c2 + | + o 3:1 ec7553f7b382 1970-01-01 00:00 +0000 test + | c1 + | + | o 2[feature1] 49cdb4091aca 1970-01-01 00:00 +0000 test + |/ b + | + o 1 b68836a6e2ca 1970-01-01 00:00 +0000 test + | a2 + | + o 0 df4fd610a3d6 1970-01-01 00:00 +0000 test + a1 +