stablerange: add a proper debugstablerange commands
authorPierre-Yves David <pierre-yves.david@ens-lyon.org>
Fri, 24 Mar 2017 10:12:02 +0100
changeset 2231 f872738bb5b3
parent 2230 a202f3af890c
child 2232 6b95bcc402fe
stablerange: add a proper debugstablerange commands This commands allows to inspect the standard stable range of a range. That should come handy.
hgext3rd/evolve/stablerange.py
tests/test-stablerange.t
--- a/hgext3rd/evolve/stablerange.py	Fri Mar 24 09:49:03 2017 +0100
+++ b/hgext3rd/evolve/stablerange.py	Fri Mar 24 10:12:02 2017 +0100
@@ -156,6 +156,57 @@
     ranges.sort(key=lambda r: (-rangelength(repo, r), n(r[0])))
     return ranges
 
+@eh.command(
+    'debugstablerange',
+    [
+        ('', 'rev', [], 'operate on (rev, 0) ranges for rev in REVS'),
+        ('', 'subranges', False, 'recursively display data for subranges too'),
+    ],
+    _(''))
+def debugstablerange(ui, repo, **opts):
+    """display standard stable subrange for a set of ranges
+
+    Range as displayed as '<node>-<index> (<rev>, <depth>, <length>)', use
+    --verbose to get the extra details in ().
+    """
+    short = nodemod.short
+    revs = scmutil.revrange(repo, opts['rev'])
+    # prewarm depth cache
+    unfi = repo.unfiltered()
+    node = unfi.changelog.node
+    stablerange = unfi.stablerange
+    depth = stablerange.depthrev
+    length = stablerange.rangelength
+    subranges = stablerange.subranges
+    repo.stablerange.warmup(repo, revs)
+    if opts['subranges']:
+        ranges = subrangesclosure(repo, revs)
+    else:
+        ranges = [(r, 0) for r in revs]
+    if ui.verbose:
+        template = '%s-%d (%d, %d, %d)'
+        def _rangestring(repo, rangeid):
+            return template % (
+                short(node(rangeid[0])),
+                rangeid[1],
+                rangeid[0],
+                depth(unfi, rangeid[0]),
+                length(unfi, rangeid)
+            )
+    else:
+        template = '%s-%d'
+        def _rangestring(repo, rangeid):
+            return template % (
+                short(node(rangeid[0])),
+                rangeid[1],
+            )
+
+    for r in ranges:
+        subs = subranges(unfi, r)
+        subsstr = ', '.join(_rangestring(unfi, s) for s in subs)
+        rstr = _rangestring(unfi, r)
+        ui.status('%s - %s\n' % (rstr, subsstr))
+
 class stablerange(object):
 
     def __init__(self):
--- a/tests/test-stablerange.t	Fri Mar 24 09:49:03 2017 +0100
+++ b/tests/test-stablerange.t	Fri Mar 24 10:12:02 2017 +0100
@@ -16,114 +16,107 @@
   $ hg init repo_linear
   $ cd repo_linear
   $ hg debugbuilddag '.+6'
-  $ hg debugobshashrange --subranges --rev 1
-           rev         node        index         size        depth      obshash
-             1 66f7d451a68b            0            2            2 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 1 > 1.range
+  $ hg debugstablerange --verbose --subranges --rev 1
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 1 > 1.range
 
 bigger subset reuse most of the previous one
 
-  $ hg debugobshashrange --subranges --rev 4
-           rev         node        index         size        depth      obshash
-             4 bebd167eb94d            0            5            5 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             4 bebd167eb94d            4            1            5 000000000000
-  $ hg debugobshashrange --subranges --rev 4 > 4.range
+  $ hg debugstablerange --verbose --subranges --rev 4
+  bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  bebd167eb94d-4 (4, 5, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 4 > 4.range
   $ diff -u 1.range 4.range
   --- 1.range	* (glob)
   +++ 4.range	* (glob)
-  @@ -1,4 +1,10 @@
-            rev         node        index         size        depth      obshash
-  +           4 bebd167eb94d            0            5            5 000000000000
-  +           3 2dc09a01254d            0            4            4 000000000000
-  +           3 2dc09a01254d            2            2            4 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-  +           2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-  +           3 2dc09a01254d            3            1            4 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
-  +           4 bebd167eb94d            4            1            5 000000000000
+  @@ -1,3 +1,9 @@
+  +bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  +2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  +01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+  +2dc09a01254d-3 (3, 4, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
+  +bebd167eb94d-4 (4, 5, 1) - 
   [1]
 
 Using a range not ending on 2**N boundary
 we fall back on 2**N as much as possible
 
-  $ hg debugobshashrange --subranges --rev 5
-           rev         node        index         size        depth      obshash
-             5 c8d03c1b5e94            0            6            6 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             5 c8d03c1b5e94            4            2            6 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             4 bebd167eb94d            4            1            5 000000000000
-             5 c8d03c1b5e94            5            1            6 000000000000
-  $ hg debugobshashrange --subranges --rev 5 > 5.range
+  $ hg debugstablerange --verbose --subranges --rev 5
+  c8d03c1b5e94-0 (5, 6, 6) - 2dc09a01254d-0 (3, 4, 4), c8d03c1b5e94-4 (5, 6, 2)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  c8d03c1b5e94-4 (5, 6, 2) - bebd167eb94d-4 (4, 5, 1), c8d03c1b5e94-5 (5, 6, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  bebd167eb94d-4 (4, 5, 1) - 
+  c8d03c1b5e94-5 (5, 6, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 5 > 5.range
   $ diff -u 4.range 5.range
   --- 4.range	* (glob)
   +++ 5.range	* (glob)
-  @@ -1,10 +1,12 @@
-            rev         node        index         size        depth      obshash
-  -           4 bebd167eb94d            0            5            5 000000000000
-  +           5 c8d03c1b5e94            0            6            6 000000000000
-              3 2dc09a01254d            0            4            4 000000000000
-              3 2dc09a01254d            2            2            4 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-  +           5 c8d03c1b5e94            4            2            6 000000000000
-              2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-              3 2dc09a01254d            3            1            4 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
-              4 bebd167eb94d            4            1            5 000000000000
-  +           5 c8d03c1b5e94            5            1            6 000000000000
+  @@ -1,9 +1,11 @@
+  -bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  +c8d03c1b5e94-0 (5, 6, 6) - 2dc09a01254d-0 (3, 4, 4), c8d03c1b5e94-4 (5, 6, 2)
+   2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+   2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  +c8d03c1b5e94-4 (5, 6, 2) - bebd167eb94d-4 (4, 5, 1), c8d03c1b5e94-5 (5, 6, 1)
+   01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+   2dc09a01254d-3 (3, 4, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
+   bebd167eb94d-4 (4, 5, 1) - 
+  +c8d03c1b5e94-5 (5, 6, 1) - 
   [1]
 
 Even two unperfect range overlap a lot
 
-  $ hg debugobshashrange --subranges --rev tip
-           rev         node        index         size        depth      obshash
-             6 f69452c5b1af            0            7            7 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             6 f69452c5b1af            4            3            7 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             5 c8d03c1b5e94            4            2            6 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             4 bebd167eb94d            4            1            5 000000000000
-             5 c8d03c1b5e94            5            1            6 000000000000
-             6 f69452c5b1af            6            1            7 000000000000
-  $ hg debugobshashrange --subranges --rev tip > tip.range
+  $ hg debugstablerange --verbose --subranges --rev tip
+  f69452c5b1af-0 (6, 7, 7) - 2dc09a01254d-0 (3, 4, 4), f69452c5b1af-4 (6, 7, 3)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  f69452c5b1af-4 (6, 7, 3) - c8d03c1b5e94-4 (5, 6, 2), f69452c5b1af-6 (6, 7, 1)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  c8d03c1b5e94-4 (5, 6, 2) - bebd167eb94d-4 (4, 5, 1), c8d03c1b5e94-5 (5, 6, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  bebd167eb94d-4 (4, 5, 1) - 
+  c8d03c1b5e94-5 (5, 6, 1) - 
+  f69452c5b1af-6 (6, 7, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev tip > tip.range
   $ diff -u 5.range tip.range
   --- 5.range	* (glob)
   +++ tip.range	* (glob)
-  @@ -1,6 +1,7 @@
-            rev         node        index         size        depth      obshash
-  -           5 c8d03c1b5e94            0            6            6 000000000000
-  +           6 f69452c5b1af            0            7            7 000000000000
-              3 2dc09a01254d            0            4            4 000000000000
-  +           6 f69452c5b1af            4            3            7 000000000000
-              3 2dc09a01254d            2            2            4 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-              5 c8d03c1b5e94            4            2            6 000000000000
-  @@ -10,3 +11,4 @@
-              1 66f7d451a68b            1            1            2 000000000000
-              4 bebd167eb94d            4            1            5 000000000000
-              5 c8d03c1b5e94            5            1            6 000000000000
-  +           6 f69452c5b1af            6            1            7 000000000000
+  @@ -1,5 +1,6 @@
+  -c8d03c1b5e94-0 (5, 6, 6) - 2dc09a01254d-0 (3, 4, 4), c8d03c1b5e94-4 (5, 6, 2)
+  +f69452c5b1af-0 (6, 7, 7) - 2dc09a01254d-0 (3, 4, 4), f69452c5b1af-4 (6, 7, 3)
+   2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +f69452c5b1af-4 (6, 7, 3) - c8d03c1b5e94-4 (5, 6, 2), f69452c5b1af-6 (6, 7, 1)
+   2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+   c8d03c1b5e94-4 (5, 6, 2) - bebd167eb94d-4 (4, 5, 1), c8d03c1b5e94-5 (5, 6, 1)
+  @@ -9,3 +10,4 @@
+   66f7d451a68b-1 (1, 2, 1) - 
+   bebd167eb94d-4 (4, 5, 1) - 
+   c8d03c1b5e94-5 (5, 6, 1) - 
+  +f69452c5b1af-6 (6, 7, 1) - 
   [1]
 
   $ cd ..
@@ -168,132 +161,123 @@
 
 (left branch)
 
-  $ hg debugobshashrange --subranges --rev 'left~2'
-           rev         node        index         size        depth      obshash
-             1 66f7d451a68b            0            2            2 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'left~2' > left-2.range
-  $ hg debugobshashrange --subranges --rev left
-           rev         node        index         size        depth      obshash
-             3 2dc09a01254d            0            4            4 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'left' > left.range
+  $ hg debugstablerange --verbose --subranges --rev 'left~2'
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'left~2' > left-2.range
+  $ hg debugstablerange --verbose --subranges --rev left
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'left' > left.range
   $ diff -u left-2.range left.range
   --- left-2.range	* (glob)
   +++ left.range	* (glob)
-  @@ -1,4 +1,8 @@
-            rev         node        index         size        depth      obshash
-  +           3 2dc09a01254d            0            4            4 000000000000
-  +           3 2dc09a01254d            2            2            4 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-  +           2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-  +           3 2dc09a01254d            3            1            4 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
+  @@ -1,3 +1,7 @@
+  +2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  +01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+  +2dc09a01254d-3 (3, 4, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
   [1]
 
 (right branch)
 
-  $ hg debugobshashrange --subranges --rev right~2
-           rev         node        index         size        depth      obshash
-             4 e7bd5218ca15            0            2            2 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             4 e7bd5218ca15            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'right~2' > right-2.range
-  $ hg debugobshashrange --subranges --rev right
-           rev         node        index         size        depth      obshash
-             6 a2f58e9c1e56            0            4            4 000000000000
-             6 a2f58e9c1e56            2            2            4 000000000000
-             4 e7bd5218ca15            0            2            2 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             5 3a367db1fabc            2            1            3 000000000000
-             6 a2f58e9c1e56            3            1            4 000000000000
-             4 e7bd5218ca15            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'right' > right.range
+  $ hg debugstablerange --verbose --subranges --rev right~2
+  e7bd5218ca15-0 (4, 2, 2) - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  e7bd5218ca15-1 (4, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'right~2' > right-2.range
+  $ hg debugstablerange --verbose --subranges --rev right
+  a2f58e9c1e56-0 (6, 4, 4) - e7bd5218ca15-0 (4, 2, 2), a2f58e9c1e56-2 (6, 4, 2)
+  a2f58e9c1e56-2 (6, 4, 2) - 3a367db1fabc-2 (5, 3, 1), a2f58e9c1e56-3 (6, 4, 1)
+  e7bd5218ca15-0 (4, 2, 2) - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  3a367db1fabc-2 (5, 3, 1) - 
+  a2f58e9c1e56-3 (6, 4, 1) - 
+  e7bd5218ca15-1 (4, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'right' > right.range
   $ diff -u right-2.range right.range
   --- right-2.range	* (glob)
   +++ right.range	* (glob)
-  @@ -1,4 +1,8 @@
-            rev         node        index         size        depth      obshash
-  +           6 a2f58e9c1e56            0            4            4 000000000000
-  +           6 a2f58e9c1e56            2            2            4 000000000000
-              4 e7bd5218ca15            0            2            2 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-  +           5 3a367db1fabc            2            1            3 000000000000
-  +           6 a2f58e9c1e56            3            1            4 000000000000
-              4 e7bd5218ca15            1            1            2 000000000000
+  @@ -1,3 +1,7 @@
+  +a2f58e9c1e56-0 (6, 4, 4) - e7bd5218ca15-0 (4, 2, 2), a2f58e9c1e56-2 (6, 4, 2)
+  +a2f58e9c1e56-2 (6, 4, 2) - 3a367db1fabc-2 (5, 3, 1), a2f58e9c1e56-3 (6, 4, 1)
+   e7bd5218ca15-0 (4, 2, 2) - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
+   1ea73414a91b-0 (0, 1, 1) - 
+  +3a367db1fabc-2 (5, 3, 1) - 
+  +a2f58e9c1e56-3 (6, 4, 1) - 
+   e7bd5218ca15-1 (4, 2, 1) - 
   [1]
 
 The merge reuse as much of the slicing created for one of the branch
 
-  $ hg debugobshashrange --subranges --rev merge
-           rev         node        index         size        depth      obshash
-             7 5f18015f9110            0            8            8 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             7 5f18015f9110            4            4            8 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             5 3a367db1fabc            1            2            3 000000000000
-             7 5f18015f9110            6            2            8 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             5 3a367db1fabc            2            1            3 000000000000
-             7 5f18015f9110            7            1            8 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             6 a2f58e9c1e56            3            1            4 000000000000
-             4 e7bd5218ca15            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'merge' > merge.range
+  $ hg debugstablerange --verbose --subranges --rev merge
+  5f18015f9110-0 (7, 8, 8) - 2dc09a01254d-0 (3, 4, 4), 5f18015f9110-4 (7, 8, 4)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  5f18015f9110-4 (7, 8, 4) - 3a367db1fabc-1 (5, 3, 2), 5f18015f9110-6 (7, 8, 2)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  3a367db1fabc-1 (5, 3, 2) - e7bd5218ca15-1 (4, 2, 1), 3a367db1fabc-2 (5, 3, 1)
+  5f18015f9110-6 (7, 8, 2) - a2f58e9c1e56-3 (6, 4, 1), 5f18015f9110-7 (7, 8, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  3a367db1fabc-2 (5, 3, 1) - 
+  5f18015f9110-7 (7, 8, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  a2f58e9c1e56-3 (6, 4, 1) - 
+  e7bd5218ca15-1 (4, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'merge' > merge.range
   $ diff -u left.range merge.range
   --- left.range	* (glob)
   +++ merge.range	* (glob)
-  @@ -1,8 +1,16 @@
-            rev         node        index         size        depth      obshash
-  +           7 5f18015f9110            0            8            8 000000000000
-              3 2dc09a01254d            0            4            4 000000000000
-  +           7 5f18015f9110            4            4            8 000000000000
-              3 2dc09a01254d            2            2            4 000000000000
-  +           5 3a367db1fabc            1            2            3 000000000000
-  +           7 5f18015f9110            6            2            8 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-              2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-              3 2dc09a01254d            3            1            4 000000000000
-  +           5 3a367db1fabc            2            1            3 000000000000
-  +           7 5f18015f9110            7            1            8 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
-  +           6 a2f58e9c1e56            3            1            4 000000000000
-  +           4 e7bd5218ca15            1            1            2 000000000000
+  @@ -1,7 +1,15 @@
+  +5f18015f9110-0 (7, 8, 8) - 2dc09a01254d-0 (3, 4, 4), 5f18015f9110-4 (7, 8, 4)
+   2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +5f18015f9110-4 (7, 8, 4) - 3a367db1fabc-1 (5, 3, 2), 5f18015f9110-6 (7, 8, 2)
+   2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  +3a367db1fabc-1 (5, 3, 2) - e7bd5218ca15-1 (4, 2, 1), 3a367db1fabc-2 (5, 3, 1)
+  +5f18015f9110-6 (7, 8, 2) - a2f58e9c1e56-3 (6, 4, 1), 5f18015f9110-7 (7, 8, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+   01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+   2dc09a01254d-3 (3, 4, 1) - 
+  +3a367db1fabc-2 (5, 3, 1) - 
+  +5f18015f9110-7 (7, 8, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
+  +a2f58e9c1e56-3 (6, 4, 1) - 
+  +e7bd5218ca15-1 (4, 2, 1) - 
   [1]
   $ diff -u right.range merge.range
   --- right.range	* (glob)
   +++ merge.range	* (glob)
-  @@ -1,8 +1,16 @@
-            rev         node        index         size        depth      obshash
-  -           6 a2f58e9c1e56            0            4            4 000000000000
-  -           6 a2f58e9c1e56            2            2            4 000000000000
-  -           4 e7bd5218ca15            0            2            2 000000000000
-  +           7 5f18015f9110            0            8            8 000000000000
-  +           3 2dc09a01254d            0            4            4 000000000000
-  +           7 5f18015f9110            4            4            8 000000000000
-  +           3 2dc09a01254d            2            2            4 000000000000
-  +           5 3a367db1fabc            1            2            3 000000000000
-  +           7 5f18015f9110            6            2            8 000000000000
-  +           1 66f7d451a68b            0            2            2 000000000000
-  +           2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-  +           3 2dc09a01254d            3            1            4 000000000000
-              5 3a367db1fabc            2            1            3 000000000000
-  +           7 5f18015f9110            7            1            8 000000000000
-  +           1 66f7d451a68b            1            1            2 000000000000
-              6 a2f58e9c1e56            3            1            4 000000000000
-              4 e7bd5218ca15            1            1            2 000000000000
+  @@ -1,7 +1,15 @@
+  -a2f58e9c1e56-0 (6, 4, 4) - e7bd5218ca15-0 (4, 2, 2), a2f58e9c1e56-2 (6, 4, 2)
+  -a2f58e9c1e56-2 (6, 4, 2) - 3a367db1fabc-2 (5, 3, 1), a2f58e9c1e56-3 (6, 4, 1)
+  -e7bd5218ca15-0 (4, 2, 2) - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
+  +5f18015f9110-0 (7, 8, 8) - 2dc09a01254d-0 (3, 4, 4), 5f18015f9110-4 (7, 8, 4)
+  +2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +5f18015f9110-4 (7, 8, 4) - 3a367db1fabc-1 (5, 3, 2), 5f18015f9110-6 (7, 8, 2)
+  +2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  +3a367db1fabc-1 (5, 3, 2) - e7bd5218ca15-1 (4, 2, 1), 3a367db1fabc-2 (5, 3, 1)
+  +5f18015f9110-6 (7, 8, 2) - a2f58e9c1e56-3 (6, 4, 1), 5f18015f9110-7 (7, 8, 1)
+  +66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  +01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+  +2dc09a01254d-3 (3, 4, 1) - 
+   3a367db1fabc-2 (5, 3, 1) - 
+  +5f18015f9110-7 (7, 8, 1) - 
+  +66f7d451a68b-1 (1, 2, 1) - 
+   a2f58e9c1e56-3 (6, 4, 1) - 
+   e7bd5218ca15-1 (4, 2, 1) - 
   [1]
   $ cd ..
 
@@ -348,85 +332,79 @@
 
 (left branch)
 
-  $ hg debugobshashrange --subranges --rev 'left~2'
-           rev         node        index         size        depth      obshash
-             2 01241442b3c2            0            3            3 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'left~2' > left-2.range
-  $ hg debugobshashrange --subranges --rev left
-           rev         node        index         size        depth      obshash
-             4 bebd167eb94d            0            5            5 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             4 bebd167eb94d            4            1            5 000000000000
-  $ hg debugobshashrange --subranges --rev 'left' > left.range
+  $ hg debugstablerange --verbose --subranges --rev 'left~2'
+  01241442b3c2-0 (2, 3, 3) - 66f7d451a68b-0 (1, 2, 2), 01241442b3c2-2 (2, 3, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'left~2' > left-2.range
+  $ hg debugstablerange --verbose --subranges --rev left
+  bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  bebd167eb94d-4 (4, 5, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'left' > left.range
   $ diff -u left-2.range left.range
   --- left-2.range	* (glob)
   +++ left.range	* (glob)
-  @@ -1,6 +1,10 @@
-            rev         node        index         size        depth      obshash
-  -           2 01241442b3c2            0            3            3 000000000000
-  +           4 bebd167eb94d            0            5            5 000000000000
-  +           3 2dc09a01254d            0            4            4 000000000000
-  +           3 2dc09a01254d            2            2            4 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-              2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-  +           3 2dc09a01254d            3            1            4 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
-  +           4 bebd167eb94d            4            1            5 000000000000
+  @@ -1,5 +1,9 @@
+  -01241442b3c2-0 (2, 3, 3) - 66f7d451a68b-0 (1, 2, 2), 01241442b3c2-2 (2, 3, 1)
+  +bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  +2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+   01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+  +2dc09a01254d-3 (3, 4, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
+  +bebd167eb94d-4 (4, 5, 1) - 
   [1]
 
 (right branch)
 
-  $ hg debugobshashrange --subranges --rev right~2
-           rev         node        index         size        depth      obshash
-             7 42b07e8da27d            0            4            4 000000000000
-             7 42b07e8da27d            2            2            4 000000000000
-             5 de561312eff4            0            2            2 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             7 42b07e8da27d            3            1            4 000000000000
-             6 b9bc20507e0b            2            1            3 000000000000
-             5 de561312eff4            1            1            2 000000000000
-  $ hg debugobshashrange --subranges --rev 'right~2' > right-2.range
-  $ hg debugobshashrange --subranges --rev right
-           rev         node        index         size        depth      obshash
-             9 f4b7da68b467            0            6            6 000000000000
-             7 42b07e8da27d            0            4            4 000000000000
-             7 42b07e8da27d            2            2            4 000000000000
-             5 de561312eff4            0            2            2 000000000000
-             9 f4b7da68b467            4            2            6 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             7 42b07e8da27d            3            1            4 000000000000
-             8 857477a9aebb            4            1            5 000000000000
-             6 b9bc20507e0b            2            1            3 000000000000
-             5 de561312eff4            1            1            2 000000000000
-             9 f4b7da68b467            5            1            6 000000000000
-  $ hg debugobshashrange --subranges --rev 'right' > right.range
+  $ hg debugstablerange --verbose --subranges --rev right~2
+  42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+  de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  42b07e8da27d-3 (7, 4, 1) - 
+  b9bc20507e0b-2 (6, 3, 1) - 
+  de561312eff4-1 (5, 2, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'right~2' > right-2.range
+  $ hg debugstablerange --verbose --subranges --rev right
+  f4b7da68b467-0 (9, 6, 6) - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
+  42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+  de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+  f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  42b07e8da27d-3 (7, 4, 1) - 
+  857477a9aebb-4 (8, 5, 1) - 
+  b9bc20507e0b-2 (6, 3, 1) - 
+  de561312eff4-1 (5, 2, 1) - 
+  f4b7da68b467-5 (9, 6, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'right' > right.range
   $ diff -u right-2.range right.range
   --- right-2.range	* (glob)
   +++ right.range	* (glob)
-  @@ -1,8 +1,12 @@
-            rev         node        index         size        depth      obshash
-  +           9 f4b7da68b467            0            6            6 000000000000
-              7 42b07e8da27d            0            4            4 000000000000
-              7 42b07e8da27d            2            2            4 000000000000
-              5 de561312eff4            0            2            2 000000000000
-  +           9 f4b7da68b467            4            2            6 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-              7 42b07e8da27d            3            1            4 000000000000
-  +           8 857477a9aebb            4            1            5 000000000000
-              6 b9bc20507e0b            2            1            3 000000000000
-              5 de561312eff4            1            1            2 000000000000
-  +           9 f4b7da68b467            5            1            6 000000000000
+  @@ -1,7 +1,11 @@
+  +f4b7da68b467-0 (9, 6, 6) - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
+   42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+   42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+   de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+  +f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+   1ea73414a91b-0 (0, 1, 1) - 
+   42b07e8da27d-3 (7, 4, 1) - 
+  +857477a9aebb-4 (8, 5, 1) - 
+   b9bc20507e0b-2 (6, 3, 1) - 
+   de561312eff4-1 (5, 2, 1) - 
+  +f4b7da68b467-5 (9, 6, 1) - 
   [1]
 
 In this case, the bottom of the split will have multiple heads,
@@ -435,148 +413,143 @@
 
 We are still able to reuse one of the branch however
 
-  $ hg debugobshashrange --subranges --rev merge
-           rev         node        index         size        depth      obshash
-            10 8aca7f8c9bd2            0           11           11 000000000000
-             4 bebd167eb94d            0            5            5 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             7 42b07e8da27d            0            4            4 000000000000
-            10 8aca7f8c9bd2            8            3           11 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             7 42b07e8da27d            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             5 de561312eff4            0            2            2 000000000000
-             9 f4b7da68b467            4            2            6 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             7 42b07e8da27d            3            1            4 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             8 857477a9aebb            4            1            5 000000000000
-            10 8aca7f8c9bd2           10            1           11 000000000000
-             6 b9bc20507e0b            2            1            3 000000000000
-             4 bebd167eb94d            4            1            5 000000000000
-             5 de561312eff4            1            1            2 000000000000
-             9 f4b7da68b467            5            1            6 000000000000
-  $ hg debugobshashrange --subranges --rev 'merge' > merge.range
+  $ hg debugstablerange --verbose --subranges --rev merge
+  8aca7f8c9bd2-0 (10, 11, 11) - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-0 (7, 4, 4), 8aca7f8c9bd2-8 (10, 11, 3)
+  bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  8aca7f8c9bd2-8 (10, 11, 3) - f4b7da68b467-4 (9, 6, 2), 8aca7f8c9bd2-10 (10, 11, 1)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+  f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  42b07e8da27d-3 (7, 4, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  857477a9aebb-4 (8, 5, 1) - 
+  8aca7f8c9bd2-10 (10, 11, 1) - 
+  b9bc20507e0b-2 (6, 3, 1) - 
+  bebd167eb94d-4 (4, 5, 1) - 
+  de561312eff4-1 (5, 2, 1) - 
+  f4b7da68b467-5 (9, 6, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'merge' > merge.range
   $ diff -u left.range merge.range
   --- left.range	* (glob)
   +++ merge.range	* (glob)
-  @@ -1,10 +1,22 @@
-            rev         node        index         size        depth      obshash
-  +          10 8aca7f8c9bd2            0           11           11 000000000000
-              4 bebd167eb94d            0            5            5 000000000000
-              3 2dc09a01254d            0            4            4 000000000000
-  +           7 42b07e8da27d            0            4            4 000000000000
-  +          10 8aca7f8c9bd2            8            3           11 000000000000
-              3 2dc09a01254d            2            2            4 000000000000
-  +           7 42b07e8da27d            2            2            4 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-  +           5 de561312eff4            0            2            2 000000000000
-  +           9 f4b7da68b467            4            2            6 000000000000
-              2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-              3 2dc09a01254d            3            1            4 000000000000
-  +           7 42b07e8da27d            3            1            4 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
-  +           8 857477a9aebb            4            1            5 000000000000
-  +          10 8aca7f8c9bd2           10            1           11 000000000000
-  +           6 b9bc20507e0b            2            1            3 000000000000
-              4 bebd167eb94d            4            1            5 000000000000
-  +           5 de561312eff4            1            1            2 000000000000
-  +           9 f4b7da68b467            5            1            6 000000000000
+  @@ -1,9 +1,21 @@
+  +8aca7f8c9bd2-0 (10, 11, 11) - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-0 (7, 4, 4), 8aca7f8c9bd2-8 (10, 11, 3)
+   bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+   2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  +42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  +8aca7f8c9bd2-8 (10, 11, 3) - f4b7da68b467-4 (9, 6, 2), 8aca7f8c9bd2-10 (10, 11, 1)
+   2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  +42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  +de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+  +f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+   01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+   2dc09a01254d-3 (3, 4, 1) - 
+  +42b07e8da27d-3 (7, 4, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
+  +857477a9aebb-4 (8, 5, 1) - 
+  +8aca7f8c9bd2-10 (10, 11, 1) - 
+  +b9bc20507e0b-2 (6, 3, 1) - 
+   bebd167eb94d-4 (4, 5, 1) - 
+  +de561312eff4-1 (5, 2, 1) - 
+  +f4b7da68b467-5 (9, 6, 1) - 
   [1]
   $ diff -u right.range merge.range
   --- right.range	* (glob)
   +++ merge.range	* (glob)
-  @@ -1,12 +1,22 @@
-            rev         node        index         size        depth      obshash
-  -           9 f4b7da68b467            0            6            6 000000000000
-  +          10 8aca7f8c9bd2            0           11           11 000000000000
-  +           4 bebd167eb94d            0            5            5 000000000000
-  +           3 2dc09a01254d            0            4            4 000000000000
-              7 42b07e8da27d            0            4            4 000000000000
-  +          10 8aca7f8c9bd2            8            3           11 000000000000
-  +           3 2dc09a01254d            2            2            4 000000000000
-              7 42b07e8da27d            2            2            4 000000000000
-  +           1 66f7d451a68b            0            2            2 000000000000
-              5 de561312eff4            0            2            2 000000000000
-              9 f4b7da68b467            4            2            6 000000000000
-  +           2 01241442b3c2            2            1            3 000000000000
-              0 1ea73414a91b            0            1            1 000000000000
-  +           3 2dc09a01254d            3            1            4 000000000000
-              7 42b07e8da27d            3            1            4 000000000000
-  +           1 66f7d451a68b            1            1            2 000000000000
-              8 857477a9aebb            4            1            5 000000000000
-  +          10 8aca7f8c9bd2           10            1           11 000000000000
-              6 b9bc20507e0b            2            1            3 000000000000
-  +           4 bebd167eb94d            4            1            5 000000000000
-              5 de561312eff4            1            1            2 000000000000
-              9 f4b7da68b467            5            1            6 000000000000
+  @@ -1,11 +1,21 @@
+  -f4b7da68b467-0 (9, 6, 6) - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
+  +8aca7f8c9bd2-0 (10, 11, 11) - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-0 (7, 4, 4), 8aca7f8c9bd2-8 (10, 11, 3)
+  +bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  +2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+   42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  +8aca7f8c9bd2-8 (10, 11, 3) - f4b7da68b467-4 (9, 6, 2), 8aca7f8c9bd2-10 (10, 11, 1)
+  +2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+  +66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+   de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+   f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+  +01241442b3c2-2 (2, 3, 1) - 
+   1ea73414a91b-0 (0, 1, 1) - 
+  +2dc09a01254d-3 (3, 4, 1) - 
+   42b07e8da27d-3 (7, 4, 1) - 
+  +66f7d451a68b-1 (1, 2, 1) - 
+   857477a9aebb-4 (8, 5, 1) - 
+  +8aca7f8c9bd2-10 (10, 11, 1) - 
+   b9bc20507e0b-2 (6, 3, 1) - 
+  +bebd167eb94d-4 (4, 5, 1) - 
+   de561312eff4-1 (5, 2, 1) - 
+   f4b7da68b467-5 (9, 6, 1) - 
   [1]
 
 Range above the merge, reuse subrange from the merge
 
-  $ hg debugobshashrange --subranges --rev tip
-           rev         node        index         size        depth      obshash
-            12 e6b8d5b46647            0           13           13 000000000000
-             4 bebd167eb94d            0            5            5 000000000000
-            12 e6b8d5b46647            8            5           13 000000000000
-             3 2dc09a01254d            0            4            4 000000000000
-             7 42b07e8da27d            0            4            4 000000000000
-            11 485383494a89            8            4           12 000000000000
-             3 2dc09a01254d            2            2            4 000000000000
-             7 42b07e8da27d            2            2            4 000000000000
-            11 485383494a89           10            2           12 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             5 de561312eff4            0            2            2 000000000000
-             9 f4b7da68b467            4            2            6 000000000000
-             2 01241442b3c2            2            1            3 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 2dc09a01254d            3            1            4 000000000000
-             7 42b07e8da27d            3            1            4 000000000000
-            11 485383494a89           11            1           12 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             8 857477a9aebb            4            1            5 000000000000
-            10 8aca7f8c9bd2           10            1           11 000000000000
-             6 b9bc20507e0b            2            1            3 000000000000
-             4 bebd167eb94d            4            1            5 000000000000
-             5 de561312eff4            1            1            2 000000000000
-            12 e6b8d5b46647           12            1           13 000000000000
-             9 f4b7da68b467            5            1            6 000000000000
-  $ hg debugobshashrange --subranges --rev 'tip' > tip.range
+  $ hg debugstablerange --verbose --subranges --rev tip
+  e6b8d5b46647-0 (12, 13, 13) - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-0 (7, 4, 4), e6b8d5b46647-8 (12, 13, 5)
+  bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  e6b8d5b46647-8 (12, 13, 5) - 485383494a89-8 (11, 12, 4), e6b8d5b46647-12 (12, 13, 1)
+  2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+  42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  485383494a89-8 (11, 12, 4) - f4b7da68b467-4 (9, 6, 2), 485383494a89-10 (11, 12, 2)
+  2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+  42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+  485383494a89-10 (11, 12, 2) - 8aca7f8c9bd2-10 (10, 11, 1), 485383494a89-11 (11, 12, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+  f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+  01241442b3c2-2 (2, 3, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2dc09a01254d-3 (3, 4, 1) - 
+  42b07e8da27d-3 (7, 4, 1) - 
+  485383494a89-11 (11, 12, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  857477a9aebb-4 (8, 5, 1) - 
+  8aca7f8c9bd2-10 (10, 11, 1) - 
+  b9bc20507e0b-2 (6, 3, 1) - 
+  bebd167eb94d-4 (4, 5, 1) - 
+  de561312eff4-1 (5, 2, 1) - 
+  e6b8d5b46647-12 (12, 13, 1) - 
+  f4b7da68b467-5 (9, 6, 1) - 
+  $ hg debugstablerange --verbose --subranges --rev 'tip' > tip.range
   $ diff -u merge.range tip.range
   --- merge.range	* (glob)
   +++ tip.range	* (glob)
-  @@ -1,11 +1,13 @@
-            rev         node        index         size        depth      obshash
-  -          10 8aca7f8c9bd2            0           11           11 000000000000
-  +          12 e6b8d5b46647            0           13           13 000000000000
-              4 bebd167eb94d            0            5            5 000000000000
-  +          12 e6b8d5b46647            8            5           13 000000000000
-              3 2dc09a01254d            0            4            4 000000000000
-              7 42b07e8da27d            0            4            4 000000000000
-  -          10 8aca7f8c9bd2            8            3           11 000000000000
-  +          11 485383494a89            8            4           12 000000000000
-              3 2dc09a01254d            2            2            4 000000000000
-              7 42b07e8da27d            2            2            4 000000000000
-  +          11 485383494a89           10            2           12 000000000000
-              1 66f7d451a68b            0            2            2 000000000000
-              5 de561312eff4            0            2            2 000000000000
-              9 f4b7da68b467            4            2            6 000000000000
-  @@ -13,10 +15,12 @@
-              0 1ea73414a91b            0            1            1 000000000000
-              3 2dc09a01254d            3            1            4 000000000000
-              7 42b07e8da27d            3            1            4 000000000000
-  +          11 485383494a89           11            1           12 000000000000
-              1 66f7d451a68b            1            1            2 000000000000
-              8 857477a9aebb            4            1            5 000000000000
-             10 8aca7f8c9bd2           10            1           11 000000000000
-              6 b9bc20507e0b            2            1            3 000000000000
-              4 bebd167eb94d            4            1            5 000000000000
-              5 de561312eff4            1            1            2 000000000000
-  +          12 e6b8d5b46647           12            1           13 000000000000
-              9 f4b7da68b467            5            1            6 000000000000
+  @@ -1,10 +1,12 @@
+  -8aca7f8c9bd2-0 (10, 11, 11) - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-0 (7, 4, 4), 8aca7f8c9bd2-8 (10, 11, 3)
+  +e6b8d5b46647-0 (12, 13, 13) - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-0 (7, 4, 4), e6b8d5b46647-8 (12, 13, 5)
+   bebd167eb94d-0 (4, 5, 5) - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
+  +e6b8d5b46647-8 (12, 13, 5) - 485383494a89-8 (11, 12, 4), e6b8d5b46647-12 (12, 13, 1)
+   2dc09a01254d-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
+   42b07e8da27d-0 (7, 4, 4) - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
+  -8aca7f8c9bd2-8 (10, 11, 3) - f4b7da68b467-4 (9, 6, 2), 8aca7f8c9bd2-10 (10, 11, 1)
+  +485383494a89-8 (11, 12, 4) - f4b7da68b467-4 (9, 6, 2), 485383494a89-10 (11, 12, 2)
+   2dc09a01254d-2 (3, 4, 2) - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
+   42b07e8da27d-2 (7, 4, 2) - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
+  +485383494a89-10 (11, 12, 2) - 8aca7f8c9bd2-10 (10, 11, 1), 485383494a89-11 (11, 12, 1)
+   66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+   de561312eff4-0 (5, 2, 2) - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
+   f4b7da68b467-4 (9, 6, 2) - 857477a9aebb-4 (8, 5, 1), f4b7da68b467-5 (9, 6, 1)
+  @@ -12,10 +14,12 @@
+   1ea73414a91b-0 (0, 1, 1) - 
+   2dc09a01254d-3 (3, 4, 1) - 
+   42b07e8da27d-3 (7, 4, 1) - 
+  +485383494a89-11 (11, 12, 1) - 
+   66f7d451a68b-1 (1, 2, 1) - 
+   857477a9aebb-4 (8, 5, 1) - 
+   8aca7f8c9bd2-10 (10, 11, 1) - 
+   b9bc20507e0b-2 (6, 3, 1) - 
+   bebd167eb94d-4 (4, 5, 1) - 
+   de561312eff4-1 (5, 2, 1) - 
+  +e6b8d5b46647-12 (12, 13, 1) - 
+   f4b7da68b467-5 (9, 6, 1) - 
   [1]
 
   $ cd ..
@@ -632,43 +605,42 @@
   |/
   o  0 1ea73414a91b r0
   
-  $ hg debugobshashrange --subranges --rev 'head()'
-           rev         node        index         size        depth      obshash
-            15 1d8d22637c2d            0            8            8 000000000000
-             9 dcbb326fdec2            0            7            7 000000000000
-            10 ff43616e5d0f            0            7            7 000000000000
-            13 b4594d867745            0            6            6 000000000000
-            12 e46a4836065c            0            6            6 000000000000
-             6 2702dd0c91e7            0            5            5 000000000000
-            15 1d8d22637c2d            4            4            8 000000000000
-             3 2b6d669947cd            0            4            4 000000000000
-             5 f0f3ef9a6cd5            0            4            4 000000000000
-             9 dcbb326fdec2            4            3            7 000000000000
-            10 ff43616e5d0f            4            3            7 000000000000
-            15 1d8d22637c2d            6            2            8 000000000000
-             3 2b6d669947cd            2            2            4 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-            13 b4594d867745            4            2            6 000000000000
-             8 d62d843c9a01            4            2            6 000000000000
-            12 e46a4836065c            4            2            6 000000000000
-             5 f0f3ef9a6cd5            2            2            4 000000000000
-             2 fa942426a6fd            0            2            2 000000000000
-            15 1d8d22637c2d            7            1            8 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             6 2702dd0c91e7            4            1            5 000000000000
-             3 2b6d669947cd            3            1            4 000000000000
-            14 43227190fef8            4            1            5 000000000000
-             4 4c748ffd1a46            2            1            3 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-            13 b4594d867745            5            1            6 000000000000
-            11 bab5d5bf48bd            4            1            5 000000000000
-             8 d62d843c9a01            5            1            6 000000000000
-             9 dcbb326fdec2            6            1            7 000000000000
-            12 e46a4836065c            5            1            6 000000000000
-             7 e7d9710d9fc6            4            1            5 000000000000
-             5 f0f3ef9a6cd5            3            1            4 000000000000
-             2 fa942426a6fd            1            1            2 000000000000
-            10 ff43616e5d0f            6            1            7 000000000000
+  $ hg debugstablerange --verbose --subranges --rev 'head()'
+  1d8d22637c2d-0 (15, 8, 8) - 2b6d669947cd-0 (3, 4, 4), 1d8d22637c2d-4 (15, 8, 4)
+  dcbb326fdec2-0 (9, 7, 7) - 2b6d669947cd-0 (3, 4, 4), dcbb326fdec2-4 (9, 7, 3)
+  ff43616e5d0f-0 (10, 7, 7) - 2b6d669947cd-0 (3, 4, 4), ff43616e5d0f-4 (10, 7, 3)
+  b4594d867745-0 (13, 6, 6) - 2b6d669947cd-0 (3, 4, 4), b4594d867745-4 (13, 6, 2)
+  e46a4836065c-0 (12, 6, 6) - 2b6d669947cd-0 (3, 4, 4), e46a4836065c-4 (12, 6, 2)
+  2702dd0c91e7-0 (6, 5, 5) - f0f3ef9a6cd5-0 (5, 4, 4), 2702dd0c91e7-4 (6, 5, 1)
+  1d8d22637c2d-4 (15, 8, 4) - 4c748ffd1a46-2 (4, 3, 1), 43227190fef8-4 (14, 5, 1), 1d8d22637c2d-6 (15, 8, 2)
+  2b6d669947cd-0 (3, 4, 4) - 66f7d451a68b-0 (1, 2, 2), 2b6d669947cd-2 (3, 4, 2)
+  f0f3ef9a6cd5-0 (5, 4, 4) - fa942426a6fd-0 (2, 2, 2), f0f3ef9a6cd5-2 (5, 4, 2)
+  dcbb326fdec2-4 (9, 7, 3) - d62d843c9a01-4 (8, 6, 2), dcbb326fdec2-6 (9, 7, 1)
+  ff43616e5d0f-4 (10, 7, 3) - d62d843c9a01-4 (8, 6, 2), ff43616e5d0f-6 (10, 7, 1)
+  1d8d22637c2d-6 (15, 8, 2) - f0f3ef9a6cd5-3 (5, 4, 1), 1d8d22637c2d-7 (15, 8, 1)
+  2b6d669947cd-2 (3, 4, 2) - fa942426a6fd-1 (2, 2, 1), 2b6d669947cd-3 (3, 4, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  b4594d867745-4 (13, 6, 2) - bab5d5bf48bd-4 (11, 5, 1), b4594d867745-5 (13, 6, 1)
+  d62d843c9a01-4 (8, 6, 2) - e7d9710d9fc6-4 (7, 5, 1), d62d843c9a01-5 (8, 6, 1)
+  e46a4836065c-4 (12, 6, 2) - bab5d5bf48bd-4 (11, 5, 1), e46a4836065c-5 (12, 6, 1)
+  f0f3ef9a6cd5-2 (5, 4, 2) - 4c748ffd1a46-2 (4, 3, 1), f0f3ef9a6cd5-3 (5, 4, 1)
+  fa942426a6fd-0 (2, 2, 2) - 1ea73414a91b-0 (0, 1, 1), fa942426a6fd-1 (2, 2, 1)
+  1d8d22637c2d-7 (15, 8, 1) - 
+  1ea73414a91b-0 (0, 1, 1) - 
+  2702dd0c91e7-4 (6, 5, 1) - 
+  2b6d669947cd-3 (3, 4, 1) - 
+  43227190fef8-4 (14, 5, 1) - 
+  4c748ffd1a46-2 (4, 3, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  b4594d867745-5 (13, 6, 1) - 
+  bab5d5bf48bd-4 (11, 5, 1) - 
+  d62d843c9a01-5 (8, 6, 1) - 
+  dcbb326fdec2-6 (9, 7, 1) - 
+  e46a4836065c-5 (12, 6, 1) - 
+  e7d9710d9fc6-4 (7, 5, 1) - 
+  f0f3ef9a6cd5-3 (5, 4, 1) - 
+  fa942426a6fd-1 (2, 2, 1) - 
+  ff43616e5d0f-6 (10, 7, 1) - 
   $ cd ..
 
 Tests range where a toprange is rooted on a merge
@@ -692,15 +664,14 @@
   |/
   o  0 1ea73414a91b r0
   
-  $ hg debugobshashrange --subranges --rev 'head()'
-           rev         node        index         size        depth      obshash
-             4 f37e476fba9a            0            5            5 000000000000
-             3 36315563e2fa            0            3            3 000000000000
-             1 66f7d451a68b            0            2            2 000000000000
-             2 fa942426a6fd            0            2            2 000000000000
-             0 1ea73414a91b            0            1            1 000000000000
-             3 36315563e2fa            2            1            3 000000000000
-             1 66f7d451a68b            1            1            2 000000000000
-             4 f37e476fba9a            4            1            5 000000000000
-             2 fa942426a6fd            1            1            2 000000000000
+  $ hg debugstablerange --verbose --subranges --rev 'head()'
+  f37e476fba9a-0 (4, 5, 5) - 66f7d451a68b-0 (1, 2, 2), 36315563e2fa-0 (3, 3, 3), f37e476fba9a-4 (4, 5, 1)
+  36315563e2fa-0 (3, 3, 3) - fa942426a6fd-0 (2, 2, 2), 36315563e2fa-2 (3, 3, 1)
+  66f7d451a68b-0 (1, 2, 2) - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
+  fa942426a6fd-0 (2, 2, 2) - 1ea73414a91b-0 (0, 1, 1), fa942426a6fd-1 (2, 2, 1)
+  1ea73414a91b-0 (0, 1, 1) - 
+  36315563e2fa-2 (3, 3, 1) - 
+  66f7d451a68b-1 (1, 2, 1) - 
+  f37e476fba9a-4 (4, 5, 1) - 
+  fa942426a6fd-1 (2, 2, 1) -