507 d = self.index[self.rev(node)][5:7] |
507 d = self.index[self.rev(node)][5:7] |
508 return (self.node(d[0]), self.node(d[1])) |
508 return (self.node(d[0]), self.node(d[1])) |
509 def parentrevs(self, rev): |
509 def parentrevs(self, rev): |
510 return self.index[rev][5:7] |
510 return self.index[rev][5:7] |
511 def start(self, rev): |
511 def start(self, rev): |
512 return getoffset(self.index[rev][0]) |
512 return int(self.index[rev][0] >> 16) |
513 def end(self, rev): |
513 def end(self, rev): |
514 return self.start(rev) + self.length(rev) |
514 return self.start(rev) + self.length(rev) |
515 def length(self, rev): |
515 def length(self, rev): |
516 return self.index[rev][1] |
516 return self.index[rev][1] |
517 def base(self, rev): |
517 def base(self, rev): |
843 """compare text with a given file revision""" |
843 """compare text with a given file revision""" |
844 p1, p2 = self.parents(node) |
844 p1, p2 = self.parents(node) |
845 return hash(text, p1, p2) != node |
845 return hash(text, p1, p2) != node |
846 |
846 |
847 def chunk(self, rev, df=None): |
847 def chunk(self, rev, df=None): |
848 start, length = self.start(rev), self.length(rev) |
|
849 if self._inline: |
|
850 start += (rev + 1) * self._io.size |
|
851 end = start + length |
|
852 def loadcache(df): |
848 def loadcache(df): |
853 cache_length = max(65536, length) |
|
854 if not df: |
849 if not df: |
855 if self._inline: |
850 if self._inline: |
856 df = self.opener(self.indexfile) |
851 df = self.opener(self.indexfile) |
857 else: |
852 else: |
858 df = self.opener(self.datafile) |
853 df = self.opener(self.datafile) |
859 df.seek(start) |
854 df.seek(start) |
860 self._chunkcache = (start, df.read(cache_length)) |
855 self._chunkcache = (start, df.read(cache_length)) |
861 |
856 |
|
857 start, length = self.start(rev), self.length(rev) |
|
858 if self._inline: |
|
859 start += (rev + 1) * self._io.size |
|
860 end = start + length |
|
861 |
|
862 offset = 0 |
862 if not self._chunkcache: |
863 if not self._chunkcache: |
|
864 cache_length = max(65536, length) |
863 loadcache(df) |
865 loadcache(df) |
864 |
|
865 cache_start = self._chunkcache[0] |
|
866 cache_end = cache_start + len(self._chunkcache[1]) |
|
867 if start >= cache_start and end <= cache_end: |
|
868 # it is cached |
|
869 offset = start - cache_start |
|
870 else: |
866 else: |
871 loadcache(df) |
867 cache_start = self._chunkcache[0] |
872 offset = 0 |
868 cache_length = len(self._chunkcache[1]) |
|
869 cache_end = cache_start + cache_length |
|
870 if start >= cache_start and end <= cache_end: |
|
871 # it is cached |
|
872 offset = start - cache_start |
|
873 else: |
|
874 cache_length = max(65536, length) |
|
875 loadcache(df) |
873 |
876 |
874 # avoid copying large chunks |
877 # avoid copying large chunks |
875 c = self._chunkcache[1] |
878 c = self._chunkcache[1] |
876 if len(c) > length: |
879 if cache_length != length: |
877 c = c[offset:offset + length] |
880 c = c[offset:offset + length] |
878 |
881 |
879 return decompress(c) |
882 return decompress(c) |
880 |
883 |
881 def delta(self, node): |
884 def delta(self, node): |