Mercurial > hgsubversion
comparison hgsubversion/util.py @ 1547:910f56f0d09c
revset: make "fromsvn()" lazy
"fromsvn()" could be a huge revset. Therefore a lazy version makes more
sense. This also resolves a subtle ordering issue. See
https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-August/103368.html
for the context.
author | Jun Wu <quark@fb.com> |
---|---|
date | Tue, 19 Dec 2017 14:18:01 -0800 |
parents | 5adfb81c4680 |
children | 7f83be82d03f |
comparison
equal
deleted
inserted
replaced
1546:ddfd60760fac | 1547:910f56f0d09c |
---|---|
346 '''``fromsvn()`` | 346 '''``fromsvn()`` |
347 Select changesets that originate from Subversion. | 347 Select changesets that originate from Subversion. |
348 ''' | 348 ''' |
349 args = revset.getargs(x, 0, 0, "fromsvn takes no arguments") | 349 args = revset.getargs(x, 0, 0, "fromsvn takes no arguments") |
350 | 350 |
351 rev = repo.changelog.rev | |
352 bin = node.bin | |
353 meta = repo.svnmeta(skiperrorcheck=True) | 351 meta = repo.svnmeta(skiperrorcheck=True) |
354 if not meta.revmapexists: | 352 if not meta.revmapexists: |
355 raise hgutil.Abort("svn metadata is missing - " | 353 raise hgutil.Abort("svn metadata is missing - " |
356 "run 'hg svn rebuildmeta' to reconstruct it") | 354 "run 'hg svn rebuildmeta' to reconstruct it") |
357 svnrevs = set(rev(h) for h in meta.revmap.hashes().keys()) | 355 tonode = repo.changelog.node |
358 filteredrevs = filter(svnrevs.__contains__, subset) | 356 hashes = meta.revmap.hashes() |
359 if smartset is not None: | 357 return subset.filter(lambda r: tonode(r) in hashes) |
360 filteredrevs = smartset.baseset(filteredrevs) | |
361 return filteredrevs | |
362 | 358 |
363 def revset_svnrev(repo, subset, x): | 359 def revset_svnrev(repo, subset, x): |
364 '''``svnrev(number)`` | 360 '''``svnrev(number)`` |
365 Select changesets that originate in the given Subversion revision. | 361 Select changesets that originate in the given Subversion revision. |
366 ''' | 362 ''' |