72 """is rev from the bundle""" |
72 """is rev from the bundle""" |
73 if rev < 0: |
73 if rev < 0: |
74 return False |
74 return False |
75 return rev in self.basemap |
75 return rev in self.basemap |
76 def bundlebase(self, rev): return self.basemap[rev] |
76 def bundlebase(self, rev): return self.basemap[rev] |
77 def chunk(self, rev, df=None, cachelen=4096): |
77 def _chunk(self, rev): |
78 # Warning: in case of bundle, the diff is against bundlebase, |
78 # Warning: in case of bundle, the diff is against bundlebase, |
79 # not against rev - 1 |
79 # not against rev - 1 |
80 # XXX: could use some caching |
80 # XXX: could use some caching |
81 if not self.bundle(rev): |
81 if not self.bundle(rev): |
82 return revlog.revlog.chunk(self, rev, df) |
82 return revlog.revlog._chunk(self, rev) |
83 self.bundlefile.seek(self.start(rev)) |
83 self.bundlefile.seek(self.start(rev)) |
84 return self.bundlefile.read(self.length(rev)) |
84 return self.bundlefile.read(self.length(rev)) |
85 |
85 |
86 def revdiff(self, rev1, rev2): |
86 def revdiff(self, rev1, rev2): |
87 """return or calculate a delta between two revisions""" |
87 """return or calculate a delta between two revisions""" |
88 if self.bundle(rev1) and self.bundle(rev2): |
88 if self.bundle(rev1) and self.bundle(rev2): |
89 # hot path for bundle |
89 # hot path for bundle |
90 revb = self.rev(self.bundlebase(rev2)) |
90 revb = self.rev(self.bundlebase(rev2)) |
91 if revb == rev1: |
91 if revb == rev1: |
92 return self.chunk(rev2) |
92 return self._chunk(rev2) |
93 elif not self.bundle(rev1) and not self.bundle(rev2): |
93 elif not self.bundle(rev1) and not self.bundle(rev2): |
94 return revlog.revlog.revdiff(self, rev1, rev2) |
94 return revlog.revlog.revdiff(self, rev1, rev2) |
95 |
95 |
96 return mdiff.textdiff(self.revision(self.node(rev1)), |
96 return mdiff.textdiff(self.revision(self.node(rev1)), |
97 self.revision(self.node(rev2))) |
97 self.revision(self.node(rev2))) |
114 rev = self.rev(iter_node) |
114 rev = self.rev(iter_node) |
115 if text is None: |
115 if text is None: |
116 text = revlog.revlog.revision(self, iter_node) |
116 text = revlog.revlog.revision(self, iter_node) |
117 |
117 |
118 while chain: |
118 while chain: |
119 delta = self.chunk(chain.pop()) |
119 delta = self._chunk(chain.pop()) |
120 text = mdiff.patches(text, [delta]) |
120 text = mdiff.patches(text, [delta]) |
121 |
121 |
122 p1, p2 = self.parents(node) |
122 p1, p2 = self.parents(node) |
123 if node != revlog.hash(text, p1, p2): |
123 if node != revlog.hash(text, p1, p2): |
124 raise error.RevlogError(_("integrity check failed on %s:%d") |
124 raise error.RevlogError(_("integrity check failed on %s:%d") |