hgext3rd/evolve/__init__.py
changeset 2336 93a37e13424f
parent 2311 26d638e419df
child 2337 c0ed4adf965e
--- 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)