Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revset.py @ 18536:ae645d4f084c
revset: change ancestor to accept 0 or more arguments (issue3750)
Change ancestor to accept 0 or more arguments. The greatest common ancestor of a
single changeset is that changeset. If passed no arguments, the empty list is
returned.
author | Paul Cavallaro <ptc@fb.com> |
---|---|
date | Mon, 28 Jan 2013 12:19:21 -0800 |
parents | 8260fa9f30b9 |
children | 9e39a717a23e |
comparison
equal
deleted
inserted
replaced
18535:7068089c95a2 | 18536:ae645d4f084c |
---|---|
275 # i18n: "adds" is a keyword | 275 # i18n: "adds" is a keyword |
276 pat = getstring(x, _("adds requires a pattern")) | 276 pat = getstring(x, _("adds requires a pattern")) |
277 return checkstatus(repo, subset, pat, 1) | 277 return checkstatus(repo, subset, pat, 1) |
278 | 278 |
279 def ancestor(repo, subset, x): | 279 def ancestor(repo, subset, x): |
280 """``ancestor(single, single)`` | 280 """``ancestor(*changeset)`` |
281 Greatest common ancestor of the two changesets. | 281 Greatest common ancestor of the changesets. |
282 | |
283 Accepts 0 or more changesets. | |
284 Will return empty list when passed no args. | |
285 Greatest common ancestor of a single changeset is that changeset. | |
282 """ | 286 """ |
283 # i18n: "ancestor" is a keyword | 287 # i18n: "ancestor" is a keyword |
284 l = getargs(x, 2, 2, _("ancestor requires two arguments")) | 288 l = getlist(x) |
285 r = list(repo) | 289 rl = list(repo) |
286 a = getset(repo, r, l[0]) | 290 anc = None |
287 b = getset(repo, r, l[1]) | 291 |
288 if len(a) != 1 or len(b) != 1: | 292 # (getset(repo, rl, i) for i in l) generates a list of lists |
289 # i18n: "ancestor" is a keyword | 293 rev = repo.changelog.rev |
290 raise error.ParseError(_("ancestor arguments must be single revisions")) | 294 ancestor = repo.changelog.ancestor |
291 an = [repo[a[0]].ancestor(repo[b[0]]).rev()] | 295 node = repo.changelog.node |
292 | 296 for revs in (getset(repo, rl, i) for i in l): |
293 return [r for r in an if r in subset] | 297 for r in revs: |
298 if anc is None: | |
299 anc = r | |
300 else: | |
301 anc = rev(ancestor(node(anc), node(r))) | |
302 | |
303 if anc is not None and anc in subset: | |
304 return [anc] | |
305 return [] | |
294 | 306 |
295 def _ancestors(repo, subset, x, followfirst=False): | 307 def _ancestors(repo, subset, x, followfirst=False): |
296 args = getset(repo, list(repo), x) | 308 args = getset(repo, list(repo), x) |
297 if not args: | 309 if not args: |
298 return [] | 310 return [] |