587 def _manifest(self): |
587 def _manifest(self): |
588 """generate a manifest corresponding to the working directory""" |
588 """generate a manifest corresponding to the working directory""" |
589 |
589 |
590 man = self._parents[0].manifest().copy() |
590 man = self._parents[0].manifest().copy() |
591 copied = self._repo.dirstate.copies() |
591 copied = self._repo.dirstate.copies() |
592 cf = lambda x: man.flags(copied.get(x, x)) |
592 if len(self._parents) > 1: |
|
593 man2 = self.p2().manifest() |
|
594 def getman(f): |
|
595 if f in man: |
|
596 return man |
|
597 return man2 |
|
598 else: |
|
599 getman = lambda f: man |
|
600 def cf(f): |
|
601 f = copied.get(f, f) |
|
602 return getman(f).flags(f) |
593 ff = self._repo.dirstate.flagfunc(cf) |
603 ff = self._repo.dirstate.flagfunc(cf) |
594 modified, added, removed, deleted, unknown = self._status[:5] |
604 modified, added, removed, deleted, unknown = self._status[:5] |
595 for i, l in (("a", added), ("m", modified), ("u", unknown)): |
605 for i, l in (("a", added), ("m", modified), ("u", unknown)): |
596 for f in l: |
606 for f in l: |
597 man[f] = man.get(copied.get(f, f), nullid) + i |
607 orig = copied.get(f, f) |
|
608 man[f] = getman(orig).get(orig, nullid) + i |
598 try: |
609 try: |
599 man.set(f, ff(f)) |
610 man.set(f, ff(f)) |
600 except OSError: |
611 except OSError: |
601 pass |
612 pass |
602 |
613 |
667 try: |
678 try: |
668 return self._manifest.flags(path) |
679 return self._manifest.flags(path) |
669 except KeyError: |
680 except KeyError: |
670 return '' |
681 return '' |
671 |
682 |
672 pnode = self._parents[0].changeset()[0] |
|
673 orig = self._repo.dirstate.copies().get(path, path) |
683 orig = self._repo.dirstate.copies().get(path, path) |
674 node, flag = self._repo.manifest.find(pnode, orig) |
684 |
675 try: |
685 def findflag(ctx): |
676 ff = self._repo.dirstate.flagfunc(lambda x: flag or '') |
686 mnode = ctx.changeset()[0] |
677 return ff(path) |
687 node, flag = self._repo.manifest.find(mnode, orig) |
678 except OSError: |
688 ff = self._repo.dirstate.flagfunc(lambda x: flag or None) |
679 pass |
689 try: |
680 |
690 return ff(orig) |
681 if not node or path in self.deleted() or path in self.removed(): |
691 except OSError: |
|
692 pass |
|
693 |
|
694 flag = findflag(self._parents[0]) |
|
695 if flag is None and len(self.parents()) > 1: |
|
696 flag = findflag(self._parents[1]) |
|
697 if flag is None or self._repo.dirstate[path] == 'r': |
682 return '' |
698 return '' |
683 return flag |
699 return flag |
684 |
700 |
685 def filectx(self, path, filelog=None): |
701 def filectx(self, path, filelog=None): |
686 """get a file context from the working directory""" |
702 """get a file context from the working directory""" |