changeset 29913:9cb950276d27

debugrevspec: add option to print parsed tree at given stages "-p <stage>" is useful for investigating parsing stages. With -p option, a transformed tree is printed no matter if it is changed or not, which allows us to know valid stage names by "-p all".
author Yuya Nishihara <yuya@tcha.org>
date Sun, 21 Aug 2016 12:33:57 +0900
parents 1c1c2bce2f97
children 770128405002
files mercurial/commands.py tests/test-completion.t tests/test-revset.t
diffstat 3 files changed, 79 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Sun Aug 21 12:04:08 2016 +0900
+++ b/mercurial/commands.py	Sun Aug 21 12:33:57 2016 +0900
@@ -3511,13 +3511,16 @@
                                                              numdeltas))
 
 @command('debugrevspec',
-    [('', 'optimize', None, _('print parsed tree after optimizing'))],
+    [('', 'optimize', None, _('print parsed tree after optimizing')),
+     ('p', 'show-stage', [],
+      _('print parsed tree at the given stage'), _('NAME')),
+     ],
     ('REVSPEC'))
 def debugrevspec(ui, repo, expr, **opts):
     """parse and apply a revision specification
 
-    Use --verbose to print the parsed tree before and after aliases
-    expansion.
+    Use -p/--show-stage option to print the parsed tree at the given stages.
+    Use -p all to print tree at every stage.
     """
     stages = [
         ('parsed', lambda tree: tree),
@@ -3526,20 +3529,34 @@
         ('analyzed', revset.analyze),
         ('optimized', revset.optimize),
     ]
-
-    showalways = set(['parsed'])
-    showchanged = set(['expanded', 'concatenated'])
-    if opts['optimize']:
-        showalways.add('optimized')
+    stagenames = set(n for n, f in stages)
+
+    showalways = set()
+    showchanged = set()
+    if ui.verbose and not opts['show_stage']:
+        # show parsed tree by --verbose (deprecated)
+        showalways.add('parsed')
+        showchanged.update(['expanded', 'concatenated'])
+        if opts['optimize']:
+            showalways.add('optimized')
+    if opts['show_stage'] and opts['optimize']:
+        raise error.Abort(_('cannot use --optimize with --show-stage'))
+    if opts['show_stage'] == ['all']:
+        showalways.update(stagenames)
+    else:
+        for n in opts['show_stage']:
+            if n not in stagenames:
+                raise error.Abort(_('invalid stage name: %s') % n)
+        showalways.update(opts['show_stage'])
 
     printedtree = None
     tree = revset.parse(expr, lookup=repo.__contains__)
     for n, f in stages:
         tree = f(tree)
         if n in showalways or (n in showchanged and tree != printedtree):
-            if n != 'parsed':
-                ui.note(("* %s:\n") % n)
-            ui.note(revset.prettyformat(tree), "\n")
+            if opts['show_stage'] or n != 'parsed':
+                ui.write(("* %s:\n") % n)
+            ui.write(revset.prettyformat(tree), "\n")
             printedtree = tree
 
     func = revset.match(ui, expr, repo)
--- a/tests/test-completion.t	Sun Aug 21 12:04:08 2016 +0900
+++ b/tests/test-completion.t	Sun Aug 21 12:33:57 2016 +0900
@@ -269,7 +269,7 @@
   debugrebuildfncache: 
   debugrename: rev
   debugrevlog: changelog, manifest, dir, dump
-  debugrevspec: optimize
+  debugrevspec: optimize, show-stage
   debugsetparents: 
   debugsub: rev
   debugsuccessorssets: 
--- a/tests/test-revset.t	Sun Aug 21 12:04:08 2016 +0900
+++ b/tests/test-revset.t	Sun Aug 21 12:33:57 2016 +0900
@@ -489,6 +489,56 @@
   hg: parse error: can't use a key-value pair in this context
   [255]
 
+parsed tree at stages:
+
+  $ hg debugrevspec -p all '()'
+  * parsed:
+  (group
+    None)
+  * expanded:
+  (group
+    None)
+  * concatenated:
+  (group
+    None)
+  * analyzed:
+  None
+  * optimized:
+  None
+  hg: parse error: missing argument
+  [255]
+
+  $ hg debugrevspec -p parsed -p analyzed -p optimized '(0|1)-1'
+  * parsed:
+  (minus
+    (group
+      (or
+        ('symbol', '0')
+        ('symbol', '1')))
+    ('symbol', '1'))
+  * analyzed:
+  (and
+    (or
+      ('symbol', '0')
+      ('symbol', '1'))
+    (not
+      ('symbol', '1')))
+  * optimized:
+  (difference
+    (func
+      ('symbol', '_list')
+      ('string', '0\x001'))
+    ('symbol', '1'))
+  0
+
+  $ hg debugrevspec -p unknown '0'
+  abort: invalid stage name: unknown
+  [255]
+
+  $ hg debugrevspec -p all --optimize '0'
+  abort: cannot use --optimize with --show-stage
+  [255]
+
 Test that symbols only get parsed as functions if there's an opening
 parenthesis.