comparison mercurial/revset.py @ 41680:8185c8abce87

revset: add expectsize to check the size of a set `expectsize(<set>, <int>)` revset fails if `<set>` is not exactly `<int>` elements. `expectsize(<set>, <min>:<max>)` revset fails if `<set>` is not exactly between `<min>` and `<max>` inclusive. This then allows an alias for `hg next` to be `update -r one(children(.))` with sane failure behavior, and also makes some other scripting tasks a little less difficult. (Summary from WeShouldDoThat) Differential Revision: https://phab.mercurial-scm.org/D5813
author Navaneeth Suresh <navaneeths1998@gmail.com>
date Sun, 03 Feb 2019 19:10:39 +0530
parents 0531dff73d0b
children 5fe4de392edb
comparison
equal deleted inserted replaced
41679:91701785c2c5 41680:8185c8abce87
859 # i18n: "contentdivergent" is a keyword 859 # i18n: "contentdivergent" is a keyword
860 getargs(x, 0, 0, _("contentdivergent takes no arguments")) 860 getargs(x, 0, 0, _("contentdivergent takes no arguments"))
861 contentdivergent = obsmod.getrevs(repo, 'contentdivergent') 861 contentdivergent = obsmod.getrevs(repo, 'contentdivergent')
862 return subset & contentdivergent 862 return subset & contentdivergent
863 863
864 @predicate('expectsize(set[, size])', safe=True, takeorder=True)
865 def expectsize(repo, subset, x, order):
866 """Abort if the revset doesn't expect given size"""
867 args = getargsdict(x, 'expectsize', 'set size')
868 minsize = 0
869 maxsize = len(repo) + 1
870 err = ''
871 if 'size' not in args or 'set' not in args:
872 raise error.ParseError(_('invalid set of arguments'))
873 minsize, maxsize = getintrange(args['size'],
874 _('expectsize requires a size range'
875 ' or a positive integer'),
876 _('size range bounds must be integers'),
877 minsize, maxsize)
878 if minsize < 0 or maxsize < 0:
879 raise error.ParseError(_('negative size'))
880 rev = getset(repo, fullreposet(repo), args['set'], order=order)
881 if minsize != maxsize and (len(rev) < minsize or len(rev) > maxsize):
882 err = _('revset size mismatch.'
883 ' expected between %d and %d, got %d') % (minsize, maxsize,
884 len(rev))
885 elif minsize == maxsize and len(rev) != minsize:
886 err = _('revset size mismatch.'
887 ' expected %d, got %d') % (minsize, len(rev))
888 if err:
889 raise error.RepoLookupError(err)
890 if order == followorder:
891 return subset & rev
892 else:
893 return rev & subset
894
864 @predicate('extdata(source)', safe=False, weight=100) 895 @predicate('extdata(source)', safe=False, weight=100)
865 def extdata(repo, subset, x): 896 def extdata(repo, subset, x):
866 """Changesets in the specified extdata source. (EXPERIMENTAL)""" 897 """Changesets in the specified extdata source. (EXPERIMENTAL)"""
867 # i18n: "extdata" is a keyword 898 # i18n: "extdata" is a keyword
868 args = getargsdict(x, 'extdata', 'source') 899 args = getargsdict(x, 'extdata', 'source')