836 |
836 |
837 def patches(self, t, pl): |
837 def patches(self, t, pl): |
838 """apply a list of patches to a string""" |
838 """apply a list of patches to a string""" |
839 return mdiff.patches(t, pl) |
839 return mdiff.patches(t, pl) |
840 |
840 |
841 def chunk(self, rev, df=None, cachelen=4096): |
841 def chunk(self, rev, df=None): |
842 start, length = self.start(rev), self.length(rev) |
842 start, length = self.start(rev), self.length(rev) |
843 inline = self._inline |
843 if self._inline: |
844 if inline: |
|
845 start += (rev + 1) * self._io.size |
844 start += (rev + 1) * self._io.size |
846 end = start + length |
845 end = start + length |
847 def loadcache(df): |
846 def loadcache(df): |
848 cache_length = max(cachelen, length) # 4k |
847 cache_length = max(65536, length) |
849 if not df: |
848 if not df: |
850 if inline: |
849 if self._inline: |
851 df = self.opener(self.indexfile) |
850 df = self.opener(self.indexfile) |
852 else: |
851 else: |
853 df = self.opener(self.datafile) |
852 df = self.opener(self.datafile) |
854 df.seek(start) |
853 df.seek(start) |
855 self._chunkcache = (start, df.read(cache_length)) |
854 self._chunkcache = (start, df.read(cache_length)) |
864 offset = start - cache_start |
863 offset = start - cache_start |
865 else: |
864 else: |
866 loadcache(df) |
865 loadcache(df) |
867 offset = 0 |
866 offset = 0 |
868 |
867 |
869 return decompress(self._chunkcache[1][offset:offset + length]) |
868 # avoid copying large chunks |
|
869 c = self._chunkcache[1] |
|
870 if len(c) > length: |
|
871 c = c[offset:offset + length] |
|
872 |
|
873 return decompress(c) |
870 |
874 |
871 def delta(self, node): |
875 def delta(self, node): |
872 """return or calculate a delta between a node and its predecessor""" |
876 """return or calculate a delta between a node and its predecessor""" |
873 r = self.rev(node) |
877 r = self.rev(node) |
874 return self.revdiff(r - 1, r) |
878 return self.revdiff(r - 1, r) |