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)