978 err = b'' |
978 err = b'' |
979 if b'size' not in args or b'set' not in args: |
979 if b'size' not in args or b'set' not in args: |
980 raise error.ParseError(_(b'invalid set of arguments')) |
980 raise error.ParseError(_(b'invalid set of arguments')) |
981 minsize, maxsize = getintrange( |
981 minsize, maxsize = getintrange( |
982 args[b'size'], |
982 args[b'size'], |
983 _(b'expectsize requires a size range' b' or a positive integer'), |
983 _(b'expectsize requires a size range or a positive integer'), |
984 _(b'size range bounds must be integers'), |
984 _(b'size range bounds must be integers'), |
985 minsize, |
985 minsize, |
986 maxsize, |
986 maxsize, |
987 ) |
987 ) |
988 if minsize < 0 or maxsize < 0: |
988 if minsize < 0 or maxsize < 0: |
989 raise error.ParseError(_(b'negative size')) |
989 raise error.ParseError(_(b'negative size')) |
990 rev = getset(repo, fullreposet(repo), args[b'set'], order=order) |
990 rev = getset(repo, fullreposet(repo), args[b'set'], order=order) |
991 if minsize != maxsize and (len(rev) < minsize or len(rev) > maxsize): |
991 if minsize != maxsize and (len(rev) < minsize or len(rev) > maxsize): |
992 err = _( |
992 err = _(b'revset size mismatch. expected between %d and %d, got %d') % ( |
993 b'revset size mismatch.' b' expected between %d and %d, got %d' |
993 minsize, |
994 ) % (minsize, maxsize, len(rev)) |
994 maxsize, |
|
995 len(rev), |
|
996 ) |
995 elif minsize == maxsize and len(rev) != minsize: |
997 elif minsize == maxsize and len(rev) != minsize: |
996 err = _(b'revset size mismatch.' b' expected %d, got %d') % ( |
998 err = _(b'revset size mismatch. expected %d, got %d') % ( |
997 minsize, |
999 minsize, |
998 len(rev), |
1000 len(rev), |
999 ) |
1001 ) |
1000 if err: |
1002 if err: |
1001 raise error.RepoLookupError(err) |
1003 raise error.RepoLookupError(err) |
1041 if b'label' not in args: |
1043 if b'label' not in args: |
1042 # i18n: "extra" is a keyword |
1044 # i18n: "extra" is a keyword |
1043 raise error.ParseError(_(b'extra takes at least 1 argument')) |
1045 raise error.ParseError(_(b'extra takes at least 1 argument')) |
1044 # i18n: "extra" is a keyword |
1046 # i18n: "extra" is a keyword |
1045 label = getstring( |
1047 label = getstring( |
1046 args[b'label'], _(b'first argument to extra must be ' b'a string') |
1048 args[b'label'], _(b'first argument to extra must be a string') |
1047 ) |
1049 ) |
1048 value = None |
1050 value = None |
1049 |
1051 |
1050 if b'value' in args: |
1052 if b'value' in args: |
1051 # i18n: "extra" is a keyword |
1053 # i18n: "extra" is a keyword |
1052 value = getstring( |
1054 value = getstring( |
1053 args[b'value'], _(b'second argument to extra must be ' b'a string') |
1055 args[b'value'], _(b'second argument to extra must be a string') |
1054 ) |
1056 ) |
1055 kind, value, matcher = stringutil.stringmatcher(value) |
1057 kind, value, matcher = stringutil.stringmatcher(value) |
1056 |
1058 |
1057 def _matchvalue(r): |
1059 def _matchvalue(r): |
1058 extra = repo[r].extra() |
1060 extra = repo[r].extra() |
1312 elif prefix == b'x:': |
1314 elif prefix == b'x:': |
1313 exc.append(value) |
1315 exc.append(value) |
1314 elif prefix == b'r:': |
1316 elif prefix == b'r:': |
1315 if rev is not None: |
1317 if rev is not None: |
1316 raise error.ParseError( |
1318 raise error.ParseError( |
1317 b'_matchfiles expected at most one ' b'revision' |
1319 b'_matchfiles expected at most one revision' |
1318 ) |
1320 ) |
1319 if value == b'': # empty means working directory |
1321 if value == b'': # empty means working directory |
1320 rev = node.wdirrev |
1322 rev = node.wdirrev |
1321 else: |
1323 else: |
1322 rev = value |
1324 rev = value |
1323 elif prefix == b'd:': |
1325 elif prefix == b'd:': |
1324 if default is not None: |
1326 if default is not None: |
1325 raise error.ParseError( |
1327 raise error.ParseError( |
1326 b'_matchfiles expected at most one ' b'default mode' |
1328 b'_matchfiles expected at most one default mode' |
1327 ) |
1329 ) |
1328 default = value |
1330 default = value |
1329 else: |
1331 else: |
1330 raise error.ParseError(b'invalid _matchfiles prefix: %s' % prefix) |
1332 raise error.ParseError(b'invalid _matchfiles prefix: %s' % prefix) |
1331 if not default: |
1333 if not default: |
2125 fieldlist = [b'metadata'] |
2127 fieldlist = [b'metadata'] |
2126 if len(l) > 1: |
2128 if len(l) > 1: |
2127 fieldlist = getstring( |
2129 fieldlist = getstring( |
2128 l[1], |
2130 l[1], |
2129 # i18n: "matching" is a keyword |
2131 # i18n: "matching" is a keyword |
2130 _(b"matching requires a string " b"as its second argument"), |
2132 _(b"matching requires a string as its second argument"), |
2131 ).split() |
2133 ).split() |
2132 |
2134 |
2133 # Make sure that there are no repeated fields, |
2135 # Make sure that there are no repeated fields, |
2134 # expand the 'special' 'metadata' field type |
2136 # expand the 'special' 'metadata' field type |
2135 # and check the 'files' whenever we check the 'diff' |
2137 # and check the 'files' whenever we check the 'diff' |
2282 keyflags.append((k, reverse)) |
2284 keyflags.append((k, reverse)) |
2283 |
2285 |
2284 if len(keyflags) > 1 and any(k == b'topo' for k, reverse in keyflags): |
2286 if len(keyflags) > 1 and any(k == b'topo' for k, reverse in keyflags): |
2285 # i18n: "topo" is a keyword |
2287 # i18n: "topo" is a keyword |
2286 raise error.ParseError( |
2288 raise error.ParseError( |
2287 _(b'topo sort order cannot be combined ' b'with other sort keys') |
2289 _(b'topo sort order cannot be combined with other sort keys') |
2288 ) |
2290 ) |
2289 |
2291 |
2290 opts = {} |
2292 opts = {} |
2291 if b'topo.firstbranch' in args: |
2293 if b'topo.firstbranch' in args: |
2292 if any(k == b'topo' for k, reverse in keyflags): |
2294 if any(k == b'topo' for k, reverse in keyflags): |