Show More
@@ -661,6 +661,55 b' class basefilectx(object):' | |||||
661 |
|
661 | |||
662 | return zip(hist[base][0], hist[base][1].splitlines(True)) |
|
662 | return zip(hist[base][0], hist[base][1].splitlines(True)) | |
663 |
|
663 | |||
|
664 | def ancestor(self, fc2, actx): | |||
|
665 | """ | |||
|
666 | find the common ancestor file context, if any, of self, and fc2 | |||
|
667 | ||||
|
668 | actx must be the changectx of the common ancestor | |||
|
669 | of self's and fc2's respective changesets. | |||
|
670 | """ | |||
|
671 | ||||
|
672 | # the easy case: no (relevant) renames | |||
|
673 | if fc2.path() == self.path() and self.path() in actx: | |||
|
674 | return actx[self.path()] | |||
|
675 | ||||
|
676 | # the next easiest cases: unambiguous predecessor (name trumps | |||
|
677 | # history) | |||
|
678 | if self.path() in actx and fc2.path() not in actx: | |||
|
679 | return actx[self.path()] | |||
|
680 | if fc2.path() in actx and self.path() not in actx: | |||
|
681 | return actx[fc2.path()] | |||
|
682 | ||||
|
683 | # prime the ancestor cache for the working directory | |||
|
684 | acache = {} | |||
|
685 | for c in (self, fc2): | |||
|
686 | if c.filenode() is None: | |||
|
687 | pl = [(n.path(), n.filenode()) for n in c.parents()] | |||
|
688 | acache[(c._path, None)] = pl | |||
|
689 | ||||
|
690 | flcache = {self._repopath:self._filelog, fc2._repopath:fc2._filelog} | |||
|
691 | def parents(vertex): | |||
|
692 | if vertex in acache: | |||
|
693 | return acache[vertex] | |||
|
694 | f, n = vertex | |||
|
695 | if f not in flcache: | |||
|
696 | flcache[f] = self._repo.file(f) | |||
|
697 | fl = flcache[f] | |||
|
698 | pl = [(f, p) for p in fl.parents(n) if p != nullid] | |||
|
699 | re = fl.renamed(n) | |||
|
700 | if re: | |||
|
701 | pl.append(re) | |||
|
702 | acache[vertex] = pl | |||
|
703 | return pl | |||
|
704 | ||||
|
705 | a, b = (self._path, self._filenode), (fc2._path, fc2._filenode) | |||
|
706 | v = ancestor.genericancestor(a, b, parents) | |||
|
707 | if v: | |||
|
708 | f, n = v | |||
|
709 | return filectx(self._repo, f, fileid=n, filelog=flcache[f]) | |||
|
710 | ||||
|
711 | return None | |||
|
712 | ||||
664 | class filectx(basefilectx): |
|
713 | class filectx(basefilectx): | |
665 | """A filecontext object makes access to data related to a particular |
|
714 | """A filecontext object makes access to data related to a particular | |
666 | filerevision convenient.""" |
|
715 | filerevision convenient.""" | |
@@ -752,55 +801,6 b' class filectx(basefilectx):' | |||||
752 | return [filectx(self._repo, self._path, fileid=x, |
|
801 | return [filectx(self._repo, self._path, fileid=x, | |
753 | filelog=self._filelog) for x in c] |
|
802 | filelog=self._filelog) for x in c] | |
754 |
|
803 | |||
755 | def ancestor(self, fc2, actx): |
|
|||
756 | """ |
|
|||
757 | find the common ancestor file context, if any, of self, and fc2 |
|
|||
758 |
|
||||
759 | actx must be the changectx of the common ancestor |
|
|||
760 | of self's and fc2's respective changesets. |
|
|||
761 | """ |
|
|||
762 |
|
||||
763 | # the easy case: no (relevant) renames |
|
|||
764 | if fc2.path() == self.path() and self.path() in actx: |
|
|||
765 | return actx[self.path()] |
|
|||
766 |
|
||||
767 | # the next easiest cases: unambiguous predecessor (name trumps |
|
|||
768 | # history) |
|
|||
769 | if self.path() in actx and fc2.path() not in actx: |
|
|||
770 | return actx[self.path()] |
|
|||
771 | if fc2.path() in actx and self.path() not in actx: |
|
|||
772 | return actx[fc2.path()] |
|
|||
773 |
|
||||
774 | # prime the ancestor cache for the working directory |
|
|||
775 | acache = {} |
|
|||
776 | for c in (self, fc2): |
|
|||
777 | if c.filenode() is None: |
|
|||
778 | pl = [(n.path(), n.filenode()) for n in c.parents()] |
|
|||
779 | acache[(c._path, None)] = pl |
|
|||
780 |
|
||||
781 | flcache = {self._repopath:self._filelog, fc2._repopath:fc2._filelog} |
|
|||
782 | def parents(vertex): |
|
|||
783 | if vertex in acache: |
|
|||
784 | return acache[vertex] |
|
|||
785 | f, n = vertex |
|
|||
786 | if f not in flcache: |
|
|||
787 | flcache[f] = self._repo.file(f) |
|
|||
788 | fl = flcache[f] |
|
|||
789 | pl = [(f, p) for p in fl.parents(n) if p != nullid] |
|
|||
790 | re = fl.renamed(n) |
|
|||
791 | if re: |
|
|||
792 | pl.append(re) |
|
|||
793 | acache[vertex] = pl |
|
|||
794 | return pl |
|
|||
795 |
|
||||
796 | a, b = (self._path, self._filenode), (fc2._path, fc2._filenode) |
|
|||
797 | v = ancestor.genericancestor(a, b, parents) |
|
|||
798 | if v: |
|
|||
799 | f, n = v |
|
|||
800 | return filectx(self._repo, f, fileid=n, filelog=flcache[f]) |
|
|||
801 |
|
||||
802 | return None |
|
|||
803 |
|
||||
804 | def ancestors(self, followfirst=False): |
|
804 | def ancestors(self, followfirst=False): | |
805 | visit = {} |
|
805 | visit = {} | |
806 | c = self |
|
806 | c = self |
General Comments 0
You need to be logged in to leave comments.
Login now