mercurial/revset.py
changeset 30801 67ee7874e53b
parent 30800 cd23879cbac7
child 30802 5eb3e4568c94
equal deleted inserted replaced
30800:cd23879cbac7 30801:67ee7874e53b
   310 def getstring(x, err):
   310 def getstring(x, err):
   311     if x and (x[0] == 'string' or x[0] == 'symbol'):
   311     if x and (x[0] == 'string' or x[0] == 'symbol'):
   312         return x[1]
   312         return x[1]
   313     raise error.ParseError(err)
   313     raise error.ParseError(err)
   314 
   314 
       
   315 def getinteger(x, err):
       
   316     try:
       
   317         return int(getstring(x, err))
       
   318     except ValueError:
       
   319         raise error.ParseError(err)
       
   320 
   315 def getlist(x):
   321 def getlist(x):
   316     if not x:
   322     if not x:
   317         return []
   323         return []
   318     if x[0] == 'list':
   324     if x[0] == 'list':
   319         return list(x[1:])
   325         return list(x[1:])
   537 def ancestorspec(repo, subset, x, n, order):
   543 def ancestorspec(repo, subset, x, n, order):
   538     """``set~n``
   544     """``set~n``
   539     Changesets that are the Nth ancestor (first parents only) of a changeset
   545     Changesets that are the Nth ancestor (first parents only) of a changeset
   540     in set.
   546     in set.
   541     """
   547     """
   542     try:
   548     n = getinteger(n, _("~ expects a number"))
   543         n = int(n[1])
       
   544     except (TypeError, ValueError):
       
   545         raise error.ParseError(_("~ expects a number"))
       
   546     ps = set()
   549     ps = set()
   547     cl = repo.changelog
   550     cl = repo.changelog
   548     for r in getset(repo, fullreposet(repo), x):
   551     for r in getset(repo, fullreposet(repo), x):
   549         for i in range(n):
   552         for i in range(n):
   550             r = cl.parentrevs(r)[0]
   553             r = cl.parentrevs(r)[0]
  1096         files = [f for f in repo[rev] if m(f)]
  1099         files = [f for f in repo[rev] if m(f)]
  1097         if len(files) != 1:
  1100         if len(files) != 1:
  1098             raise error.ParseError(_("followlines expects exactly one file"))
  1101             raise error.ParseError(_("followlines expects exactly one file"))
  1099         fname = files[0]
  1102         fname = files[0]
  1100 
  1103 
  1101     try:
  1104     fromline, toline = [getinteger(a, _("line range bounds must be integers"))
  1102         fromline, toline = [int(getsymbol(a)) for a in args['lines']]
  1105                         for a in args['lines']]
  1103     except ValueError:
       
  1104         raise error.ParseError(_("line range bounds must be integers"))
       
  1105     if toline - fromline < 0:
  1106     if toline - fromline < 0:
  1106         raise error.ParseError(_("line range must be positive"))
  1107         raise error.ParseError(_("line range must be positive"))
  1107     if fromline < 1:
  1108     if fromline < 1:
  1108         raise error.ParseError(_("fromline must be strictly positive"))
  1109         raise error.ParseError(_("fromline must be strictly positive"))
  1109     fromline -= 1
  1110     fromline -= 1
  1271     """
  1272     """
  1272     args = getargsdict(x, 'limit', 'set n offset')
  1273     args = getargsdict(x, 'limit', 'set n offset')
  1273     if 'set' not in args:
  1274     if 'set' not in args:
  1274         # i18n: "limit" is a keyword
  1275         # i18n: "limit" is a keyword
  1275         raise error.ParseError(_("limit requires one to three arguments"))
  1276         raise error.ParseError(_("limit requires one to three arguments"))
  1276     try:
  1277     lim, ofs = 1, 0
  1277         lim, ofs = 1, 0
  1278     if 'n' in args:
  1278         if 'n' in args:
       
  1279             # i18n: "limit" is a keyword
       
  1280             lim = int(getstring(args['n'], _("limit requires a number")))
       
  1281         if 'offset' in args:
       
  1282             # i18n: "limit" is a keyword
       
  1283             ofs = int(getstring(args['offset'], _("limit requires a number")))
       
  1284         if ofs < 0:
       
  1285             raise error.ParseError(_("negative offset"))
       
  1286     except (TypeError, ValueError):
       
  1287         # i18n: "limit" is a keyword
  1279         # i18n: "limit" is a keyword
  1288         raise error.ParseError(_("limit expects a number"))
  1280         lim = getinteger(args['n'], _("limit expects a number"))
       
  1281     if 'offset' in args:
       
  1282         # i18n: "limit" is a keyword
       
  1283         ofs = getinteger(args['offset'], _("limit expects a number"))
       
  1284     if ofs < 0:
       
  1285         raise error.ParseError(_("negative offset"))
  1289     os = getset(repo, fullreposet(repo), args['set'])
  1286     os = getset(repo, fullreposet(repo), args['set'])
  1290     result = []
  1287     result = []
  1291     it = iter(os)
  1288     it = iter(os)
  1292     for x in xrange(ofs):
  1289     for x in xrange(ofs):
  1293         y = next(it, None)
  1290         y = next(it, None)
  1306 def last(repo, subset, x):
  1303 def last(repo, subset, x):
  1307     """Last n members of set, defaulting to 1.
  1304     """Last n members of set, defaulting to 1.
  1308     """
  1305     """
  1309     # i18n: "last" is a keyword
  1306     # i18n: "last" is a keyword
  1310     l = getargs(x, 1, 2, _("last requires one or two arguments"))
  1307     l = getargs(x, 1, 2, _("last requires one or two arguments"))
  1311     try:
  1308     lim = 1
  1312         lim = 1
  1309     if len(l) == 2:
  1313         if len(l) == 2:
       
  1314             # i18n: "last" is a keyword
       
  1315             lim = int(getstring(l[1], _("last requires a number")))
       
  1316     except (TypeError, ValueError):
       
  1317         # i18n: "last" is a keyword
  1310         # i18n: "last" is a keyword
  1318         raise error.ParseError(_("last expects a number"))
  1311         lim = getinteger(l[1], _("last expects a number"))
  1319     os = getset(repo, fullreposet(repo), l[0])
  1312     os = getset(repo, fullreposet(repo), l[0])
  1320     os.reverse()
  1313     os.reverse()
  1321     result = []
  1314     result = []
  1322     it = iter(os)
  1315     it = iter(os)
  1323     for x in xrange(lim):
  1316     for x in xrange(lim):