Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 20457:ed7b674824a3
revset: added lazyset implementation to checkstatus
This improves the performance of the revsets 'adds' 'modifies' and 'removes'
Performance benchmarking:
$ time hg log -qr "first(adds(README))"
0:9117c6561b0b
real 0m2.279s
user 0m2.222s
sys 0m0.053s
$ time ./hg log -qr "first(adds(README))"
0:9117c6561b0b
real 0m0.172s
user 0m0.131s
sys 0m0.041s
$ time hg log -qr "first(modifies(README))"
1:273ce12ad8f1
real 0m2.292s
user 0m2.227s
sys 0m0.061s
$ time ./hg log -qr "first(modifies(README))"
1:273ce12ad8f1
real 0m0.178s
user 0m0.130s
sys 0m0.038s
$ time hg log -qr "first(removes(README))"
2379:e90cff87f871
real 0m2.297s
user 0m2.235s
sys 0m0.058s
$ time ./hg log -qr "first(removes(README))"
2379:e90cff87f871
real 0m0.975s
user 0m0.797s
sys 0m0.056s
author | Lucas Moscovicz <lmoscovicz@fb.com> |
---|---|
date | Fri, 31 Jan 2014 10:47:51 -0800 |
parents | 9a49feb408f3 |
children | 8dabcc889e33 |
comparison
equal
deleted
inserted
replaced
20456:9a49feb408f3 | 20457:ed7b674824a3 |
---|---|
462 except AttributeError: | 462 except AttributeError: |
463 raise util.Abort(_("no bundle provided - specify with -R")) | 463 raise util.Abort(_("no bundle provided - specify with -R")) |
464 return subset & bundlerevs | 464 return subset & bundlerevs |
465 | 465 |
466 def checkstatus(repo, subset, pat, field): | 466 def checkstatus(repo, subset, pat, field): |
467 m = None | |
468 s = [] | |
469 hasset = matchmod.patkind(pat) == 'set' | 467 hasset = matchmod.patkind(pat) == 'set' |
470 fname = None | 468 |
471 for r in subset: | 469 def matches(x): |
472 c = repo[r] | 470 m = None |
471 fname = None | |
472 c = repo[x] | |
473 if not m or hasset: | 473 if not m or hasset: |
474 m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c) | 474 m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c) |
475 if not m.anypats() and len(m.files()) == 1: | 475 if not m.anypats() and len(m.files()) == 1: |
476 fname = m.files()[0] | 476 fname = m.files()[0] |
477 if fname is not None: | 477 if fname is not None: |
478 if fname not in c.files(): | 478 if fname not in c.files(): |
479 continue | 479 return False |
480 else: | 480 else: |
481 for f in c.files(): | 481 for f in c.files(): |
482 if m(f): | 482 if m(f): |
483 break | 483 break |
484 else: | 484 else: |
485 continue | 485 return False |
486 files = repo.status(c.p1().node(), c.node())[field] | 486 files = repo.status(c.p1().node(), c.node())[field] |
487 if fname is not None: | 487 if fname is not None: |
488 if fname in files: | 488 if fname in files: |
489 s.append(r) | 489 return True |
490 else: | 490 else: |
491 for f in files: | 491 for f in files: |
492 if m(f): | 492 if m(f): |
493 s.append(r) | 493 return True |
494 break | 494 |
495 return baseset(s) | 495 return lazyset(subset, matches) |
496 | 496 |
497 def _children(repo, narrow, parentset): | 497 def _children(repo, narrow, parentset): |
498 cs = set() | 498 cs = set() |
499 if not parentset: | 499 if not parentset: |
500 return baseset(cs) | 500 return baseset(cs) |