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): |