diff mercurial/commands.py @ 13724:fe57046e9448

commands: add debugbundle command Lists ids contained in a bundle file. Useful for testing bundle-related commands.
author Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
date Tue, 22 Mar 2011 09:22:29 +0100
parents e615765fdcc7
children ce47a0c10224
line wrap: on
line diff
--- a/mercurial/commands.py	Tue Mar 22 09:22:21 2011 +0100
+++ b/mercurial/commands.py	Tue Mar 22 09:22:29 2011 +0100
@@ -1230,6 +1230,44 @@
     flags = repo.known([bin(s) for s in ids])
     ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
 
+def debugbundle(ui, bundlepath, all=None, **opts):
+    """lists the contents of a bundle"""
+    f = url.open(ui, bundlepath)
+    try:
+            gen = changegroup.readbundle(f, bundlepath)
+            if all:
+                ui.write("format: id, p1, p2, cset, len(delta)\n")
+
+                def showchunks(named):
+                    ui.write("\n%s\n" % named)
+                    while 1:
+                        chunkdata = gen.parsechunk()
+                        if not chunkdata:
+                            break
+                        node = chunkdata['node']
+                        p1 = chunkdata['p1']
+                        p2 = chunkdata['p2']
+                        cs = chunkdata['cs']
+                        delta = chunkdata['data']
+                        ui.write("%s %s %s %s %s\n" % (hex(node), hex(p1), hex(p2), hex(cs), len(delta)))
+
+                showchunks("changelog")
+                showchunks("manifest")
+                while 1:
+                    fname = gen.chunk()
+                    if not fname:
+                        break
+                    showchunks(fname)
+            else:
+                while 1:
+                    chunkdata = gen.parsechunk()
+                    if not chunkdata:
+                        break
+                    node = chunkdata['node']
+                    ui.write("%s\n" % hex(node))
+    finally:
+        f.close()
+
 def debugpushkey(ui, repopath, namespace, *keyinfo):
     '''access the pushkey key/value protocol
 
@@ -4432,6 +4470,11 @@
           ('n', 'new-file', None, _('add new file at each rev')),
          ],
          _('[OPTION]... TEXT')),
+    "debugbundle":
+        (debugbundle,
+         [('a', 'all', None, _('show all details')),
+          ],
+         _('FILE')),
     "debugcheckstate": (debugcheckstate, [], ''),
     "debugcommands": (debugcommands, [], _('[COMMAND]')),
     "debugcomplete":
@@ -4824,6 +4867,6 @@
 
 norepo = ("clone init version help debugcommands debugcomplete"
           " debugdate debuginstall debugfsinfo debugpushkey debugwireargs"
-          " debugknown")
+          " debugknown debugbundle")
 optionalrepo = ("identify paths serve showconfig debugancestor debugdag"
                 " debugdata debugindex debugindexdot")