--- a/hgext3rd/evolve/__init__.py Wed May 10 12:16:01 2017 +0200
+++ b/hgext3rd/evolve/__init__.py Wed May 10 12:26:33 2017 +0200
@@ -3249,3 +3249,62 @@
f.write(orig.topic())
return merge.graft(repo, orig, pctx, ['local', 'graft'], True)
+
+@eh.command(
+ '^debugobshistory',
+ [('r', 'rev', [], _("revision to debug"))],
+ _('hg debugobshistory [OPTION]... [-r] [REV]'))
+def debugobshistory(ui, repo, *revs, **opts):
+ revs = scmutil.revrange(repo, revs)
+
+ for rev in revs:
+ _debugobshistorysingle(ui, repo, rev)
+
+def _debugobshistorysingle(ui, repo, rev):
+ """ Display the obsolescence history for a single revision
+ """
+ precursors = repo.obsstore.precursors
+ successors = repo.obsstore.successors
+ nodec = repo.changelog.node
+ nodes = [nodec(rev)]
+
+ while nodes:
+ ctxnode = nodes.pop()
+ _debugobshistorydisplaynode(ui, repo, ctxnode)
+
+ succs = successors.get(ctxnode, ())
+
+ for successor in sorted(succs):
+ _debugobshistorydisplaymarker(ui, repo, successor)
+
+ precs = precursors.get(ctxnode, ())
+ nodes.extend(precursor[0] for precursor in sorted(precs))
+
+def _debugobshistorydisplaynode(ui, repo, node):
+ ctx = repo.unfiltered()[node]
+ shortdescription = ctx.description().splitlines()[0]
+
+ args = (ui.label(str(ctx), "evolve.short_node"),
+ ui.label(str(int(ctx)), "evolve.rev"),
+ ui.label(shortdescription, "evolve.short_description"))
+
+ ui.write("%s (%s) %s\n" % args)
+
+def _debugobshistorydisplaymarker(ui, repo, marker):
+ succnodes = marker[1]
+ date = marker[4]
+ metadata = dict(marker[3])
+
+ msgargs = (ui.label(metadata['user'], "evolve.user"),
+ ui.label(util.datestr(date), "evolve.date"))
+ # If no successors with a marker, the commit has been pruned
+ if len(succnodes) == 0:
+ msgargs = (ui.label("pruned", "evolve.verb"),) + msgargs
+ msg = " %s by %s (%s)\n"
+ else:
+ shortsnodes = (node.short(succnode) for succnode in sorted(succnodes))
+ labelednodes = (ui.label(node, "evolve.short_node") for node in shortsnodes)
+ msgargs = (ui.label("rewritten", "evolve.verb"),) + msgargs + (", ".join(labelednodes),)
+ msg = " %s by %s (%s) as %s\n"
+
+ ui.write(msg % msgargs)