comparison mercurial/localrepo.py @ 2474:1e32e2fe8a67

Fix cold cache diff performance cold cache diff performance has regressed in two ways. localrepo.changes has optimizations for diffing against the working dir parent that expect node1 to be None. commands.revpair() usage means that commands.dodiff() never sends node1 == None. This is fixed in localrepo.changes by checking against the dirstate parents. In the non-dirstate parents case, localrepo.changes does a loop comparing files without first sorting the file names, leading to random access across the disk.
author Chris Mason <mason@suse.com>
date Wed, 21 Jun 2006 09:28:48 -0700
parents 6ab016edd5c4
children 7a77934ece46
comparison
equal deleted inserted replaced
2473:30c267cb4c2f 2474:1e32e2fe8a67
616 for fn in mf.keys(): 616 for fn in mf.keys():
617 if not match(fn): 617 if not match(fn):
618 del mf[fn] 618 del mf[fn]
619 return mf 619 return mf
620 620
621 if node1: 621 compareworking = False
622 if not node1 or node1 == self.dirstate.parents()[0]:
623 compareworking = True
624
625 if not compareworking:
622 # read the manifest from node1 before the manifest from node2, 626 # read the manifest from node1 before the manifest from node2,
623 # so that we'll hit the manifest cache if we're going through 627 # so that we'll hit the manifest cache if we're going through
624 # all the revisions in parent->child order. 628 # all the revisions in parent->child order.
625 mf1 = mfmatches(node1) 629 mf1 = mfmatches(node1)
626 630
633 wlock = None 637 wlock = None
634 lookup, modified, added, removed, deleted, unknown, ignored = ( 638 lookup, modified, added, removed, deleted, unknown, ignored = (
635 self.dirstate.changes(files, match, show_ignored)) 639 self.dirstate.changes(files, match, show_ignored))
636 640
637 # are we comparing working dir against its parent? 641 # are we comparing working dir against its parent?
638 if not node1: 642 if compareworking:
639 if lookup: 643 if lookup:
640 # do a full compare of any files that might have changed 644 # do a full compare of any files that might have changed
641 mf2 = mfmatches(self.dirstate.parents()[0]) 645 mf2 = mfmatches(self.dirstate.parents()[0])
642 for f in lookup: 646 for f in lookup:
643 if fcmp(f, mf2): 647 if fcmp(f, mf2):
656 else: 660 else:
657 # we are comparing two revisions 661 # we are comparing two revisions
658 deleted, unknown, ignored = [], [], [] 662 deleted, unknown, ignored = [], [], []
659 mf2 = mfmatches(node2) 663 mf2 = mfmatches(node2)
660 664
661 if node1: 665 if not compareworking:
662 # flush lists from dirstate before comparing manifests 666 # flush lists from dirstate before comparing manifests
663 modified, added = [], [] 667 modified, added = [], []
664 668
665 for fn in mf2: 669 # make sure to sort the files so we talk to the disk in a
670 # reasonable order
671 mf2keys = mf2.keys()
672 mf2keys.sort()
673 for fn in mf2keys:
666 if mf1.has_key(fn): 674 if mf1.has_key(fn):
667 if mf1[fn] != mf2[fn] and (mf2[fn] != "" or fcmp(fn, mf1)): 675 if mf1[fn] != mf2[fn] and (mf2[fn] != "" or fcmp(fn, mf1)):
668 modified.append(fn) 676 modified.append(fn)
669 del mf1[fn] 677 del mf1[fn]
670 else: 678 else: