diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -163,6 +163,7 @@ 'bookmarks': _logbookmarks(repo, tr), 'draftheads': _logdraftheads(repo, tr), 'workingparent': _logworkingparent(repo, tr), + 'draftobsolete': _logdraftobsolete(repo, tr), } try: existingnodes = _readindex(repo, 0) @@ -209,6 +210,12 @@ revstring = "\n".join(sorted(hexnodes)) return writelog(repo, tr, "draftheads.i", revstring) +def _logdraftobsolete(repo, tr): + spec = revsetlang.formatspec('draft() & obsolete()') + hexnodes = tohexnode(repo, spec) + revstring = "\n".join(sorted(hexnodes)) + return writelog(repo, tr, "draftobsolete.i", revstring) + def _logcommand(repo, tr, command): revstring = "\0".join(command) return writelog(repo, tr, "command.i", revstring) @@ -352,7 +359,7 @@ template = "{tabindent(sub('\0', ' ', content))}\n" fm = ui.formatter('debugundohistory', {'template': template}) cabinet = ('command.i', 'bookmarks.i', 'date.i', - 'draftheads.i', 'workingparent.i') + 'draftheads.i', 'draftobsolete.i', 'workingparent.i') for filename in cabinet: header = filename[:-2] + ":\n" rawcontent = _readnode(repo, filename, nodedict[filename[:-2]]) @@ -821,9 +828,18 @@ reverseindex) removedrevs = revsetlang.formatspec('olddraft(%d) - olddraft(0)', reverseindex) + currentstate = _readindex(repo, 0) + curdraftobsolete = _readnode(repo, "draftobsolete.i", + currentstate["draftobsolete"]) + newdraftobsolete = _readnode(repo, "draftobsolete.i", + nodedict["draftobsolete"]) + obschange = (set(curdraftobsolete.split("\n")) + - set(newdraftobsolete.split("\n"))) + obschangerevs = revsetlang.formatspec('%ls', obschange) if not branch: smarthide(repo, addedrevs, removedrevs) revealcommits(repo, removedrevs) + revealcommits(repo, obschangerevs) else: localadds = revsetlang.formatspec('(olddraft(0) - olddraft(%d)) and' ' _localbranch(%s)', @@ -831,9 +847,12 @@ localremoves = revsetlang.formatspec('(olddraft(%d) - olddraft(0)) and' ' _localbranch(%s)', reverseindex, branch) + localobschange = revsetlang.formatspec('(%ls) and _localbranch(%s)', + obschange, branch) smarthide(repo, localadds, removedrevs) smarthide(repo, addedrevs, localremoves, local=True) revealcommits(repo, localremoves) + revealcommits(repo, localobschange) # informative output time = _readnode(repo, "date.i", nodedict["date"]) @@ -1004,6 +1023,7 @@ related.update(obsutil.allsuccessors(unfi.obsstore, [ctx.node()])) related.intersection_update(x.node() for x in showctxs) destinations = [repo[x] for x in related] + # two primary objectives: # 1. correct divergence/nondivergence # 2. correct visibility of changesets for the user @@ -1019,6 +1039,7 @@ # Solution: provide helpfull ui message for # common and easy case (1 to 1), use simplest # correct solution for complex edge case + if len(destinations) == 1: hidecommits(repo, ctx, destinations) elif len(destinations) > 1: # split diff --git a/tests/test-undo.t b/tests/test-undo.t --- a/tests/test-undo.t +++ b/tests/test-undo.t @@ -66,6 +66,7 @@ command bae41a9d0ae9614fc3aa843a0f5cbdf47bc98c43 date * (glob) draftheads b80de5d138758541c5f05265ad144ab9fa86d1db + draftobsolete b80de5d138758541c5f05265ad144ab9fa86d1db unfinished False workingparent fcb754f6a51eaf982f66d0637b39f3d2e6b520d5 (no-eol) $ touch a3 && hg add a3 @@ -106,6 +107,8 @@ 0a3dd3e15e65b90836f492112d816f3ee073d897 REMOVED: + draftobsolete: + unfinished: False Test gap in data (extension dis and enabled) @@ -145,6 +148,8 @@ 1dafc0b436123cab96f82a8e9e8d1d42c0301aaa REMOVED: 0a3dd3e15e65b90836f492112d816f3ee073d897 + draftobsolete: + unfinished: False Index out of bound error @@ -168,6 +173,8 @@ aa430c8afedf9b2ec3f0655d39eef6b6b0a2ddb6 REMOVED: 1dafc0b436123cab96f82a8e9e8d1d42c0301aaa + draftobsolete: + unfinished: False Test 'olddraft([NUM])' revset @@ -1247,3 +1254,65 @@ > [extensions] > rebase =! > EOF + +Obsmarkers for instack amend + $ cat >> $HGRCPATH < [extensions] + > fbamend = $TESTDIR/../hgext3rd/fbamend/ + > EOF + $ hg update 0963 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ touch c5 && hg add c5 && hg amend c5 + warning: the changeset's children were left behind + (use 'hg restack' to rebase them) + $ hg log -G -T compact -l7 + @ 34[tip]:28 e1c5a2a441f5 1970-01-01 00:00 +0000 test + | c3 + | + | o 31:29 00617a57f780 1970-01-01 00:00 +0000 test + | | bfile + | | + | | o 30:24 28dfc398cab7 1970-01-01 00:00 +0000 test + | | | afile + | | | + | x | 29[e1c5a2a441f5.preamend] 0963b9e31e70 1970-01-01 00:00 +0000 test + |/ / c3 + | | + o | 28 4e0ac6fa4ca0 1970-01-01 00:00 +0000 test + | | c2 + | | + o | 27:-1 c54b1b73bb58 1970-01-01 00:00 +0000 test + / c1 + | + o 24:-1 90af9088326b 1970-01-01 00:00 +0000 test + b1 + + $ hg undo && hg update 00617a + undone to *, before amend c5 (glob) + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg log -G -T compact -l7 + @ 31[tip]:29 00617a57f780 1970-01-01 00:00 +0000 test + | bfile + | + | o 30:24 28dfc398cab7 1970-01-01 00:00 +0000 test + | | afile + | | + o | 29 0963b9e31e70 1970-01-01 00:00 +0000 test + | | c3 + | | + o | 28 4e0ac6fa4ca0 1970-01-01 00:00 +0000 test + | | c2 + | | + o | 27:-1 c54b1b73bb58 1970-01-01 00:00 +0000 test + / c1 + | + o 24:-1 90af9088326b 1970-01-01 00:00 +0000 test + b1 + + o 23 a0b72b3048d6 1970-01-01 00:00 +0000 test + | prev1 + ~ + $ cat >> $HGRCPATH < [extensions] + > famend =! + > EOF