mercurial/revset.py
changeset 41359 431cf2c8c839
parent 41297 b1ea90613af3
child 41388 ee7791f2515b
equal deleted inserted replaced
41358:0a0927f7549d 41359:431cf2c8c839
   223     return subset - getset(repo, subset, x, anyorder)
   223     return subset - getset(repo, subset, x, anyorder)
   224 
   224 
   225 def relationset(repo, subset, x, y, order):
   225 def relationset(repo, subset, x, y, order):
   226     raise error.ParseError(_("can't use a relation in this context"))
   226     raise error.ParseError(_("can't use a relation in this context"))
   227 
   227 
   228 def generationsrel(repo, subset, x, rel, n, order):
   228 def _splitrange(a, b):
   229     # TODO: support range, rewrite tests, and drop startdepth argument
   229     """Split range with bounds a and b into two ranges at 0 and return two
   230     # from ancestors() and descendants() predicates
   230     tuples of numbers for use as startdepth and stopdepth arguments of
   231     if n <= 0:
   231     revancestors and revdescendants.
   232         n = -n
   232 
   233         return _ancestors(repo, subset, x, startdepth=n, stopdepth=n + 1)
   233     >>> _splitrange(-10, -5)     # [-10:-5]
   234     else:
   234     ((5, 11), (None, None))
   235         return _descendants(repo, subset, x, startdepth=n, stopdepth=n + 1)
   235     >>> _splitrange(5, 10)       # [5:10]
       
   236     ((None, None), (5, 11))
       
   237     >>> _splitrange(-10, 10)     # [-10:10]
       
   238     ((0, 11), (0, 11))
       
   239     >>> _splitrange(-10, 0)      # [-10:0]
       
   240     ((0, 11), (None, None))
       
   241     >>> _splitrange(0, 10)       # [0:10]
       
   242     ((None, None), (0, 11))
       
   243     >>> _splitrange(0, 0)        # [0:0]
       
   244     ((0, 1), (None, None))
       
   245     >>> _splitrange(1, -1)       # [1:-1]
       
   246     ((None, None), (None, None))
       
   247     """
       
   248     ancdepths = (None, None)
       
   249     descdepths = (None, None)
       
   250     if a == b == 0:
       
   251         ancdepths = (0, 1)
       
   252     if a < 0:
       
   253         ancdepths = (-min(b, 0), -a + 1)
       
   254     if b > 0:
       
   255         descdepths = (max(a, 0), b + 1)
       
   256     return ancdepths, descdepths
       
   257 
       
   258 def generationsrel(repo, subset, x, rel, a, b, order):
       
   259     # TODO: rewrite tests, and drop startdepth argument from ancestors() and
       
   260     # descendants() predicates
       
   261     (ancstart, ancstop), (descstart, descstop) = _splitrange(a, b)
       
   262 
       
   263     if ancstart is None and descstart is None:
       
   264         return baseset()
       
   265 
       
   266     revs = getset(repo, fullreposet(repo), x)
       
   267     if not revs:
       
   268         return baseset()
       
   269 
       
   270     if ancstart is not None and descstart is not None:
       
   271         s = dagop.revancestors(repo, revs, False, ancstart, ancstop)
       
   272         s += dagop.revdescendants(repo, revs, False, descstart, descstop)
       
   273     elif ancstart is not None:
       
   274         s = dagop.revancestors(repo, revs, False, ancstart, ancstop)
       
   275     elif descstart is not None:
       
   276         s = dagop.revdescendants(repo, revs, False, descstart, descstop)
       
   277 
       
   278     return subset & s
   236 
   279 
   237 def relsubscriptset(repo, subset, x, y, z, order):
   280 def relsubscriptset(repo, subset, x, y, z, order):
   238     # this is pretty basic implementation of 'x#y[z]' operator, still
   281     # this is pretty basic implementation of 'x#y[z]' operator, still
   239     # experimental so undocumented. see the wiki for further ideas.
   282     # experimental so undocumented. see the wiki for further ideas.
   240     # https://www.mercurial-scm.org/wiki/RevsetOperatorPlan
   283     # https://www.mercurial-scm.org/wiki/RevsetOperatorPlan
   241     rel = getsymbol(y)
   284     rel = getsymbol(y)
   242     n = getinteger(z, _("relation subscript must be an integer"))
   285     try:
       
   286         a, b = getrange(z, '')
       
   287     except error.ParseError:
       
   288         a = getinteger(z, _("relation subscript must be an integer"))
       
   289         b = a
       
   290     else:
       
   291         def getbound(i):
       
   292             if i is None:
       
   293                 return None
       
   294             msg = _("relation subscript bounds must be integers")
       
   295             return getinteger(i, msg)
       
   296         a, b = [getbound(i) for i in (a, b)]
       
   297         if a is None:
       
   298             a = -(dagop.maxlogdepth - 1)
       
   299         if b is None:
       
   300             b = +(dagop.maxlogdepth - 1)
   243 
   301 
   244     if rel in subscriptrelations:
   302     if rel in subscriptrelations:
   245         return subscriptrelations[rel](repo, subset, x, rel, n, order)
   303         return subscriptrelations[rel](repo, subset, x, rel, a, b, order)
   246 
   304 
   247     relnames = [r for r in subscriptrelations.keys() if len(r) > 1]
   305     relnames = [r for r in subscriptrelations.keys() if len(r) > 1]
   248     raise error.UnknownIdentifier(rel, relnames)
   306     raise error.UnknownIdentifier(rel, relnames)
   249 
   307 
   250 def subscriptset(repo, subset, x, y, order):
   308 def subscriptset(repo, subset, x, y, order):