Patchwork D126: phabricator: add status to revision query language

login
register
mail settings
Submitter phabricator
Date July 18, 2017, 9:10 a.m.
Message ID <differential-rev-PHID-DREV-bpa3yw2h64q6yiiwde3y-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/22474/
State Superseded, archived
Headers show

Comments

phabricator - July 18, 2017, 9:10 a.m.
quark created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This patch adds status words (ex. `abandoned`, `accepted`, `needsreview`,
  `needsrevision`, `closed`) to the revision query language so people can
  select revision in a more flexible way.

TEST PLAN
  Try something like `phabread ':2 & accepted'`, `phabread ':105 - closed` and
  make sure they have desired outputs.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D126

AFFECTED FILES
  contrib/phabricator.py

CHANGE DETAILS




EMAIL PREFERENCES
  https://phab.mercurial-scm.org/settings/panel/emailpreferences/

To: quark, #hg-reviewers
Cc: mercurial-devel
phabricator - Aug. 15, 2017, 9:43 p.m.
durin42 accepted this revision.
durin42 added a comment.
This revision is now accepted and ready to land.


  queued, thanks

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D126

To: quark, #hg-reviewers, durin42
Cc: durin42, mercurial-devel

Patch

diff --git a/contrib/phabricator.py b/contrib/phabricator.py
--- a/contrib/phabricator.py
+++ b/contrib/phabricator.py
@@ -439,6 +439,13 @@ 
 _metanamemap = util.sortdict([(r'user', 'User'), (r'date', 'Date'),
                               (r'node', 'Node ID'), (r'parent', 'Parent ')])
 
+_knownstatusnames = {'accepted', 'needsreview', 'needsrevision', 'closed',
+                     'abandoned'}
+
+def _getstatusname(drev):
+    """get normalized status name from a Differential Revision"""
+    return drev[r'statusName'].replace(' ', '').lower()
+
 # Small language to specify differential revisions. Support symbols: (), :X,
 # +, and -.
 
@@ -455,19 +462,19 @@ 
 }
 
 def _tokenize(text):
-    text = text.replace(' ', '') # remove space
     view = memoryview(text) # zero-copy slice
-    special = '():+-&'
+    special = '():+-& '
     pos = 0
     length = len(text)
     while pos < length:
         symbol = ''.join(itertools.takewhile(lambda ch: ch not in special,
                                              view[pos:]))
         if symbol:
             yield ('symbol', symbol, pos)
             pos += len(symbol)
-        else: # special char
-            yield (text[pos], None, pos)
+        else: # special char, ignore space
+            if text[pos] != ' ':
+                yield (text[pos], None, pos)
             pos += 1
     yield ('end', None, pos)
 
@@ -595,15 +602,19 @@ 
         tofetch.update(range(max(1, r - batchsize), r + 1))
     if drevs:
         fetch({r'ids': list(tofetch)})
-    getstack(list(ancestordrevs))
+    validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs))
 
     # Walk through the tree, return smartsets
     def walk(tree):
         op = tree[0]
         if op == 'symbol':
             drev = _parsedrev(tree[1])
             if drev:
                 return smartset.baseset([drev])
+            elif tree[1] in _knownstatusnames:
+                drevs = [r for r in validids
+                         if _getstatusname(prefetched[r]) == tree[1]]
+                return smartset.baseset(drevs)
             else:
                 raise error.Abort(_('unknown symbol: %s') % tree[1])
         elif op in {'and_', 'add', 'sub'}:
@@ -722,8 +733,13 @@ 
     ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to
     select a stack.
 
+    ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision``
+    could be used to filter patches by status. For performance reason, they
+    only represent a subset of non-status selections and cannot be used alone.
+
     For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude
-    D2 and D4.
+    D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a
+    stack up to D9.
 
     If --stack is given, follow dependencies information and read all patches.
     It is equivalent to the ``:`` operator.