Mercurial > public > mercurial-scm > hg
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') |