mercurial/debugcommands.py
changeset 30528 22683f2f8100
parent 30527 243ecbd4f5c9
child 30529 bd5c4320b5a8
--- a/mercurial/debugcommands.py	Wed Aug 17 20:59:13 2016 -0700
+++ b/mercurial/debugcommands.py	Wed Aug 17 21:00:11 2016 -0700
@@ -15,6 +15,7 @@
 from .node import (
     bin,
     hex,
+    nullid,
     short,
 )
 from . import (
@@ -677,3 +678,73 @@
                          % (ignorefile, lineno, line))
             else:
                 ui.write(_("%s is not ignored\n") % f)
+
+@command('debugindex', commands.debugrevlogopts +
+    [('f', 'format', 0, _('revlog format'), _('FORMAT'))],
+    _('[-f FORMAT] -c|-m|FILE'),
+    optionalrepo=True)
+def debugindex(ui, repo, file_=None, **opts):
+    """dump the contents of an index file"""
+    r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
+    format = opts.get('format', 0)
+    if format not in (0, 1):
+        raise error.Abort(_("unknown format %d") % format)
+
+    generaldelta = r.version & revlog.REVLOGGENERALDELTA
+    if generaldelta:
+        basehdr = ' delta'
+    else:
+        basehdr = '  base'
+
+    if ui.debugflag:
+        shortfn = hex
+    else:
+        shortfn = short
+
+    # There might not be anything in r, so have a sane default
+    idlen = 12
+    for i in r:
+        idlen = len(shortfn(r.node(i)))
+        break
+
+    if format == 0:
+        ui.write(("   rev    offset  length " + basehdr + " linkrev"
+                 " %s %s p2\n") % ("nodeid".ljust(idlen), "p1".ljust(idlen)))
+    elif format == 1:
+        ui.write(("   rev flag   offset   length"
+                 "     size " + basehdr + "   link     p1     p2"
+                 " %s\n") % "nodeid".rjust(idlen))
+
+    for i in r:
+        node = r.node(i)
+        if generaldelta:
+            base = r.deltaparent(i)
+        else:
+            base = r.chainbase(i)
+        if format == 0:
+            try:
+                pp = r.parents(node)
+            except Exception:
+                pp = [nullid, nullid]
+            ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
+                    i, r.start(i), r.length(i), base, r.linkrev(i),
+                    shortfn(node), shortfn(pp[0]), shortfn(pp[1])))
+        elif format == 1:
+            pr = r.parentrevs(i)
+            ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
+                    i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
+                    base, r.linkrev(i), pr[0], pr[1], shortfn(node)))
+
+@command('debugindexdot', commands.debugrevlogopts,
+    _('-c|-m|FILE'), optionalrepo=True)
+def debugindexdot(ui, repo, file_=None, **opts):
+    """dump an index DAG as a graphviz dot file"""
+    r = cmdutil.openrevlog(repo, 'debugindexdot', file_, opts)
+    ui.write(("digraph G {\n"))
+    for i in r:
+        node = r.node(i)
+        pp = r.parents(node)
+        ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
+        if pp[1] != nullid:
+            ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
+    ui.write("}\n")