changeset 35644:7a0a90d63a8c

log: use revsetlang.formatspec() to concatenate list expression This rewrites 'not ancestors(x) and not ...' as 'not (ancestors(x) or ...)' so we can use '%lr'. 'isinstance(val, list)' is replaced with 'listop' to make sure 'listop' is applied.
author Yuya Nishihara <yuya@tcha.org>
date Tue, 02 Jan 2018 17:13:18 +0900
parents 668c5a527eff
children b6b7855c79aa
files mercurial/cmdutil.py tests/test-glog.t
diffstat 2 files changed, 36 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/cmdutil.py	Tue Jan 02 17:00:48 2018 +0900
+++ b/mercurial/cmdutil.py	Tue Jan 02 17:13:18 2018 +0900
@@ -41,6 +41,7 @@
     registrar,
     revlog,
     revset,
+    revsetlang,
     scmutil,
     smartset,
     templatekw,
@@ -2347,13 +2348,13 @@
     '_fdescendants':    ('_firstdescendants(%(val)s)', None),
     '_matchfiles':      ('_matchfiles(%(val)s)', None),
     'date':             ('date(%(val)r)', None),
-    'branch':           ('branch(%(val)r)', ' or '),
-    '_patslog':         ('filelog(%(val)r)', ' or '),
-    '_patsfollow':      ('follow(%(val)r)', ' or '),
-    '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '),
-    'keyword':          ('keyword(%(val)r)', ' or '),
-    'prune':            ('not ancestors(%(val)r)', ' and '),
-    'user':             ('user(%(val)r)', ' or '),
+    'branch':           ('branch(%(val)r)', '%lr'),
+    '_patslog':         ('filelog(%(val)r)', '%lr'),
+    '_patsfollow':      ('follow(%(val)r)', '%lr'),
+    '_patsfollowfirst': ('_followfirst(%(val)r)', '%lr'),
+    'keyword':          ('keyword(%(val)r)', '%lr'),
+    'prune':            ('ancestors(%(val)r)', 'not %lr'),
+    'user':             ('user(%(val)r)', '%lr'),
 }
 
 def _makelogrevset(repo, pats, opts, revs):
@@ -2473,14 +2474,15 @@
             continue
         if op not in _opt2logrevset:
             continue
-        revop, andor = _opt2logrevset[op]
+        revop, listop = _opt2logrevset[op]
         if '%(val)' not in revop:
             expr.append(revop)
         else:
-            if not isinstance(val, list):
+            if not listop:
                 e = revop % {'val': val}
             else:
-                e = '(' + andor.join((revop % {'val': v}) for v in val) + ')'
+                e = [revop % {'val': v} for v in val]
+                e = revsetlang.formatspec(listop, e)
             expr.append(e)
 
     if expr:
--- a/tests/test-glog.t	Tue Jan 02 17:00:48 2018 +0900
+++ b/tests/test-glog.t	Tue Jan 02 17:13:18 2018 +0900
@@ -1500,12 +1500,14 @@
       (func
         (symbol 'branch')
         (string 'default'))
-      (func
-        (symbol 'branch')
-        (string 'branch'))
-      (func
-        (symbol 'branch')
-        (string 'branch'))))
+      (or
+        (list
+          (func
+            (symbol 'branch')
+            (string 'branch'))
+          (func
+            (symbol 'branch')
+            (string 'branch'))))))
   <filteredset
     <spanset- 0:37>,
     <addset
@@ -1571,26 +1573,25 @@
   [255]
   $ testlog --prune 31 --prune 32
   []
-  (and
-    (not
-      (func
-        (symbol 'ancestors')
-        (string '31')))
-    (not
-      (func
-        (symbol 'ancestors')
-        (string '32'))))
+  (not
+    (or
+      (list
+        (func
+          (symbol 'ancestors')
+          (string '31'))
+        (func
+          (symbol 'ancestors')
+          (string '32')))))
   <filteredset
-    <filteredset
-      <spanset- 0:37>,
-      <not
+    <spanset- 0:37>,
+    <not
+      <addset
         <filteredset
           <spanset- 0:37>,
-          <generatorsetdesc+>>>>,
-    <not
-      <filteredset
-        <spanset- 0:37>,
-        <generatorsetdesc+>>>>
+          <generatorsetdesc+>>,
+        <filteredset
+          <spanset- 0:37>,
+          <generatorsetdesc+>>>>>
 
 Dedicated repo for --follow and paths filtering. The g is crafted to
 have 2 filelog topological heads in a linear changeset graph.