Patchwork [1,of,2] commands.debugbundle: Bundle2 support

login
register
mail settings
Submitter Eric Sumner
Date Jan. 16, 2015, 8:20 p.m.
Message ID <e07587a186a859fdb065.1421439656@dev911.prn1.facebook.com>
Download mbox | patch
Permalink /patch/7494/
State Accepted
Commit 6d8bebf4d6d4c60b343846519f23d0fe40e4678c
Headers show

Comments

Eric Sumner - Jan. 16, 2015, 8:20 p.m.
# HG changeset patch
# User Eric Sumner <ericsumner@fb.com>
# Date 1421364926 28800
#      Thu Jan 15 15:35:26 2015 -0800
# Node ID e07587a186a859fdb065b9475afd0470e2ae4508
# Parent  049a9e3a078d7c988cb12ed456aad6ec2779ea69
commands.debugbundle: Bundle2 support

This enables debugbundle to print supporting info for bundle2 files.
Pierre-Yves David - Jan. 16, 2015, 8:36 p.m.
On 01/16/2015 12:20 PM, Eric Sumner wrote:
> # HG changeset patch
> # User Eric Sumner<ericsumner@fb.com>
> # Date 1421364926 28800
> #      Thu Jan 15 15:35:26 2015 -0800
> # Node ID e07587a186a859fdb065b9475afd0470e2ae4508
> # Parent  049a9e3a078d7c988cb12ed456aad6ec2779ea69
> commands.debugbundle: Bundle2 support

I've pushed this one to the clowncopter

>
> This enables debugbundle to print supporting info for bundle2 files.
>
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -21,7 +21,7 @@
>   import dagparser, context, simplemerge, graphmod, copies
>   import random
>   import setdiscovery, treediscovery, dagutil, pvec, localrepo
> -import phases, obsolete, exchange
> +import phases, obsolete, exchange, bundle2
>   import ui as uimod
>
>   table = {}
> @@ -1817,6 +1817,8 @@
>       f = hg.openpath(ui, bundlepath)
>       try:
>           gen = exchange.readbundle(ui, f, bundlepath)
> +        if isinstance(gen, bundle2.unbundle20):
> +            return _debugbundle2(ui, gen, all=all, **opts)
>           if all:
>               ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
>
> @@ -1849,6 +1851,8 @@
>                   fname = chunkdata['filename']
>                   showchunks(fname)
>           else:
> +            if isinstance(gen, bundle2.unbundle20):
> +                raise util.Abort(_('Use debugbundle2 for this file'))
>               chunkdata = gen.changelogheader()
>               chain = None
>               while True:
> @@ -1861,6 +1865,26 @@
>       finally:
>           f.close()
>
> +def _debugbundle2(ui, gen, **opts):
> +    """lists the contents of a bundle2"""
> +    if not isinstance(gen, bundle2.unbundle20):
> +        raise util.Abort(_('Not a bundle2 file'))
> +    ui.write('Stream params: %s\n' % repr(gen.params))
> +    for part in gen.iterparts():
> +        ui.write('%s -- %r\n' % (part.type, repr(part.params)))
> +        if part.type == 'b2x:changegroup':
> +            version = part.params.get('version', '01')
> +            cg = changegroup.packermap[version][1](part, 'UN')
> +            chunkdata = cg.changelogheader()
> +            chain = None
> +            while True:
> +                chunkdata = cg.deltachunk(chain)
> +                if not chunkdata:
> +                    break
> +                node = chunkdata['node']
> +                ui.write("    %s\n" % hex(node))
> +                chain = node
> +
>   @command('debugcheckstate', [], '')
>   def debugcheckstate(ui, repo):
>       """validate the correctness of the current dirstate"""
> diff --git a/tests/test-bundle2-format.t b/tests/test-bundle2-format.t
> --- a/tests/test-bundle2-format.t
> +++ b/tests/test-bundle2-format.t
> @@ -755,6 +755,13 @@
>     \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02H (esc)
>     \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
>
> +  $ hg debugbundle ../rev.hg2
> +  Stream params: {}
> +  b2x:changegroup -- '{}'
> +      32af7686d403cf45b5d95f2d70cebea587ac806a
> +      9520eea781bcca16c1e15acc0ba14335a0e8e5ba
> +      eea13746799a9e0bfd88f29d3c2e9dc9389f524f
> +      02de42196ebee42ef284b6780a87cdc96e8eaab6
>     $ hg unbundle2 < ../rev.hg2
>     adding changesets
>     adding manifests
Pierre-Yves David - Jan. 16, 2015, 8:50 p.m.
On 01/16/2015 12:20 PM, Eric Sumner wrote:
> # HG changeset patch
> # User Eric Sumner <ericsumner@fb.com>
> # Date 1421364926 28800
> #      Thu Jan 15 15:35:26 2015 -0800
> # Node ID e07587a186a859fdb065b9475afd0470e2ae4508
> # Parent  049a9e3a078d7c988cb12ed456aad6ec2779ea69
> commands.debugbundle: Bundle2 support

I've fixed check-code and the description and pushed the result to the 
clowncopter.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -21,7 +21,7 @@ 
 import dagparser, context, simplemerge, graphmod, copies
 import random
 import setdiscovery, treediscovery, dagutil, pvec, localrepo
-import phases, obsolete, exchange
+import phases, obsolete, exchange, bundle2
 import ui as uimod
 
 table = {}
@@ -1817,6 +1817,8 @@ 
     f = hg.openpath(ui, bundlepath)
     try:
         gen = exchange.readbundle(ui, f, bundlepath)
+        if isinstance(gen, bundle2.unbundle20):
+            return _debugbundle2(ui, gen, all=all, **opts)
         if all:
             ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
 
@@ -1849,6 +1851,8 @@ 
                 fname = chunkdata['filename']
                 showchunks(fname)
         else:
+            if isinstance(gen, bundle2.unbundle20):
+                raise util.Abort(_('Use debugbundle2 for this file'))
             chunkdata = gen.changelogheader()
             chain = None
             while True:
@@ -1861,6 +1865,26 @@ 
     finally:
         f.close()
 
+def _debugbundle2(ui, gen, **opts):
+    """lists the contents of a bundle2"""
+    if not isinstance(gen, bundle2.unbundle20):
+        raise util.Abort(_('Not a bundle2 file'))
+    ui.write('Stream params: %s\n' % repr(gen.params))
+    for part in gen.iterparts():
+        ui.write('%s -- %r\n' % (part.type, repr(part.params)))
+        if part.type == 'b2x:changegroup':
+            version = part.params.get('version', '01')
+            cg = changegroup.packermap[version][1](part, 'UN')
+            chunkdata = cg.changelogheader()
+            chain = None
+            while True:
+                chunkdata = cg.deltachunk(chain)
+                if not chunkdata:
+                    break
+                node = chunkdata['node']
+                ui.write("    %s\n" % hex(node))
+                chain = node
+
 @command('debugcheckstate', [], '')
 def debugcheckstate(ui, repo):
     """validate the correctness of the current dirstate"""
diff --git a/tests/test-bundle2-format.t b/tests/test-bundle2-format.t
--- a/tests/test-bundle2-format.t
+++ b/tests/test-bundle2-format.t
@@ -755,6 +755,13 @@ 
   \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02H (esc)
   \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
 
+  $ hg debugbundle ../rev.hg2
+  Stream params: {}
+  b2x:changegroup -- '{}'
+      32af7686d403cf45b5d95f2d70cebea587ac806a
+      9520eea781bcca16c1e15acc0ba14335a0e8e5ba
+      eea13746799a9e0bfd88f29d3c2e9dc9389f524f
+      02de42196ebee42ef284b6780a87cdc96e8eaab6
   $ hg unbundle2 < ../rev.hg2
   adding changesets
   adding manifests