D5813: revset: add expect to check the size of a set
navaneeth.suresh (Navaneeth Suresh)
phabricator at mercurial-scm.org
Tue Feb 12 07:51:11 EST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG8185c8abce87: revset: add expectsize to check the size of a set (authored by navaneeth.suresh, committed by ).
CHANGED PRIOR TO COMMIT
https://phab.mercurial-scm.org/D5813?vs=14029&id=14043#toc
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D5813?vs=14029&id=14043
REVISION DETAIL
https://phab.mercurial-scm.org/D5813
AFFECTED FILES
mercurial/revset.py
tests/test-revset.t
CHANGE DETAILS
diff --git a/tests/test-revset.t b/tests/test-revset.t
--- a/tests/test-revset.t
+++ b/tests/test-revset.t
@@ -2978,3 +2978,63 @@
* set:
<baseset+ [0]>
0
+
+abort if the revset doesn't expect given size
+ $ log 'expectsize()'
+ hg: parse error: invalid set of arguments
+ [255]
+ $ log 'expectsize(0:2, a)'
+ hg: parse error: expectsize requires a size range or a positive integer
+ [255]
+ $ log 'expectsize(0:2, 3)'
+ 0
+ 1
+ 2
+
+ $ log 'expectsize(2:0, 3)'
+ 2
+ 1
+ 0
+ $ log 'expectsize(0:1, 1)'
+ abort: revset size mismatch. expected 1, got 2!
+ [255]
+ $ log 'expectsize(0:4, -1)'
+ hg: parse error: negative size
+ [255]
+ $ log 'expectsize(0:2, 2:4)'
+ 0
+ 1
+ 2
+ $ log 'expectsize(0:1, 3:5)'
+ abort: revset size mismatch. expected between 3 and 5, got 2!
+ [255]
+ $ log 'expectsize(0:1, -1:2)'
+ hg: parse error: negative size
+ [255]
+ $ log 'expectsize(0:1, 1:-2)'
+ hg: parse error: negative size
+ [255]
+ $ log 'expectsize(0:2, a:4)'
+ hg: parse error: size range bounds must be integers
+ [255]
+ $ log 'expectsize(0:2, 2:b)'
+ hg: parse error: size range bounds must be integers
+ [255]
+ $ log 'expectsize(0:2, 2:)'
+ 0
+ 1
+ 2
+ $ log 'expectsize(0:2, :5)'
+ 0
+ 1
+ 2
+ $ log 'expectsize(0:2, :)'
+ 0
+ 1
+ 2
+ $ log 'expectsize(0:2, 4:)'
+ abort: revset size mismatch. expected between 4 and 11, got 3!
+ [255]
+ $ log 'expectsize(0:2, :2)'
+ abort: revset size mismatch. expected between 0 and 2, got 3!
+ [255]
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -861,6 +861,37 @@
contentdivergent = obsmod.getrevs(repo, 'contentdivergent')
return subset & contentdivergent
+ at predicate('expectsize(set[, size])', safe=True, takeorder=True)
+def expectsize(repo, subset, x, order):
+ """Abort if the revset doesn't expect given size"""
+ args = getargsdict(x, 'expectsize', 'set size')
+ minsize = 0
+ maxsize = len(repo) + 1
+ err = ''
+ if 'size' not in args or 'set' not in args:
+ raise error.ParseError(_('invalid set of arguments'))
+ minsize, maxsize = getintrange(args['size'],
+ _('expectsize requires a size range'
+ ' or a positive integer'),
+ _('size range bounds must be integers'),
+ minsize, maxsize)
+ if minsize < 0 or maxsize < 0:
+ raise error.ParseError(_('negative size'))
+ rev = getset(repo, fullreposet(repo), args['set'], order=order)
+ if minsize != maxsize and (len(rev) < minsize or len(rev) > maxsize):
+ err = _('revset size mismatch.'
+ ' expected between %d and %d, got %d') % (minsize, maxsize,
+ len(rev))
+ elif minsize == maxsize and len(rev) != minsize:
+ err = _('revset size mismatch.'
+ ' expected %d, got %d') % (minsize, len(rev))
+ if err:
+ raise error.RepoLookupError(err)
+ if order == followorder:
+ return subset & rev
+ else:
+ return rev & subset
+
@predicate('extdata(source)', safe=False, weight=100)
def extdata(repo, subset, x):
"""Changesets in the specified extdata source. (EXPERIMENTAL)"""
To: navaneeth.suresh, #hg-reviewers
Cc: yuja, pulkit, durin42, mjpieters, mercurial-devel
More information about the Mercurial-devel
mailing list