comparison mercurial/context.py @ 11101:502474839293

context: only scan unknowns when needed
author Matt Mackall <mpm@selenic.com>
date Wed, 05 May 2010 20:21:57 -0500
parents 83968ae4aaf2
children 6f4543842795
comparison
equal deleted inserted replaced
11100:83968ae4aaf2 11101:502474839293
562 if date: 562 if date:
563 self._date = util.parsedate(date) 563 self._date = util.parsedate(date)
564 if user: 564 if user:
565 self._user = user 565 self._user = user
566 if changes: 566 if changes:
567 self._status = list(changes[:5]) 567 self._status = list(changes[:4])
568 self._unknown = changes[4]
568 self._ignored = changes[5] 569 self._ignored = changes[5]
569 self._clean = changes[6] 570 self._clean = changes[6]
570 else: 571 else:
572 self._unknown = None
571 self._ignored = None 573 self._ignored = None
572 self._clean = None 574 self._clean = None
573 575
574 self._extra = {} 576 self._extra = {}
575 if extra: 577 if extra:
594 return self._repo.dirstate[key] not in "?r" 596 return self._repo.dirstate[key] not in "?r"
595 597
596 @propertycache 598 @propertycache
597 def _manifest(self): 599 def _manifest(self):
598 """generate a manifest corresponding to the working directory""" 600 """generate a manifest corresponding to the working directory"""
601
602 if self._unknown is None:
603 self.status(unknown=True)
599 604
600 man = self._parents[0].manifest().copy() 605 man = self._parents[0].manifest().copy()
601 copied = self._repo.dirstate.copies() 606 copied = self._repo.dirstate.copies()
602 if len(self._parents) > 1: 607 if len(self._parents) > 1:
603 man2 = self.p2().manifest() 608 man2 = self.p2().manifest()
609 getman = lambda f: man 614 getman = lambda f: man
610 def cf(f): 615 def cf(f):
611 f = copied.get(f, f) 616 f = copied.get(f, f)
612 return getman(f).flags(f) 617 return getman(f).flags(f)
613 ff = self._repo.dirstate.flagfunc(cf) 618 ff = self._repo.dirstate.flagfunc(cf)
614 modified, added, removed, deleted, unknown = self._status[:5] 619 modified, added, removed, deleted = self._status
620 unknown = self._unknown
615 for i, l in (("a", added), ("m", modified), ("u", unknown)): 621 for i, l in (("a", added), ("m", modified), ("u", unknown)):
616 for f in l: 622 for f in l:
617 orig = copied.get(f, f) 623 orig = copied.get(f, f)
618 man[f] = getman(orig).get(orig, nullid) + i 624 man[f] = getman(orig).get(orig, nullid) + i
619 try: 625 try:
627 633
628 return man 634 return man
629 635
630 @propertycache 636 @propertycache
631 def _status(self): 637 def _status(self):
632 return self._repo.status(unknown=True)[:5] 638 return self._repo.status()[:4]
633 639
634 @propertycache 640 @propertycache
635 def _user(self): 641 def _user(self):
636 return self._repo.ui.username() 642 return self._repo.ui.username()
637 643
651 """Explicit status query 657 """Explicit status query
652 Unless this method is used to query the working copy status, the 658 Unless this method is used to query the working copy status, the
653 _status property will implicitly read the status using its default 659 _status property will implicitly read the status using its default
654 arguments.""" 660 arguments."""
655 stat = self._repo.status(ignored=ignored, clean=clean, unknown=unknown) 661 stat = self._repo.status(ignored=ignored, clean=clean, unknown=unknown)
656 self._ignored = ignored and stat[5] or None 662 self._unknown = self._ignored = self._clean = None
657 self._clean = clean and stat[6] or None 663 if unknown:
658 self._status = stat[:5] 664 self._unknown = stat[4]
659 return self._status 665 if ignored:
666 self._ignored = stat[5]
667 if clean:
668 self._clean = stat[6]
669 self._status = stat[:4]
670 return stat
660 671
661 def manifest(self): 672 def manifest(self):
662 return self._manifest 673 return self._manifest
663 def user(self): 674 def user(self):
664 return self._user or self._repo.ui.username() 675 return self._user or self._repo.ui.username()
676 def removed(self): 687 def removed(self):
677 return self._status[2] 688 return self._status[2]
678 def deleted(self): 689 def deleted(self):
679 return self._status[3] 690 return self._status[3]
680 def unknown(self): 691 def unknown(self):
681 return self._status[4] 692 assert self._unknown is not None # must call status first
693 return self._unknown
682 def ignored(self): 694 def ignored(self):
683 assert self._ignored is not None # must call status first 695 assert self._ignored is not None # must call status first
684 return self._ignored 696 return self._ignored
685 def clean(self): 697 def clean(self):
686 assert self._clean is not None # must call status first 698 assert self._clean is not None # must call status first