D126: phabricator: add status to revision query language
quark (Jun Wu)
phabricator at mercurial-scm.org
Tue Jul 18 09:10:38 UTC 2017
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
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.
EMAIL PREFERENCES
https://phab.mercurial-scm.org/settings/panel/emailpreferences/
To: quark, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list