74 def inbundle(self, rev): |
74 def inbundle(self, rev): |
75 """is rev from the bundle""" |
75 """is rev from the bundle""" |
76 if rev < 0: |
76 if rev < 0: |
77 return False |
77 return False |
78 return rev in self.basemap |
78 return rev in self.basemap |
79 def bundlebase(self, rev): |
79 |
80 return self.basemap[rev] |
|
81 def _chunk(self, rev): |
80 def _chunk(self, rev): |
82 # Warning: in case of bundle, the diff is against bundlebase, |
81 # Warning: in case of bundle, the diff is against self.basemap, |
83 # not against rev - 1 |
82 # not against rev - 1 |
84 # XXX: could use some caching |
83 # XXX: could use some caching |
85 if not self.inbundle(rev): |
84 if not self.inbundle(rev): |
86 return revlog.revlog._chunk(self, rev) |
85 return revlog.revlog._chunk(self, rev) |
87 self.bundle.seek(self.start(rev)) |
86 self.bundle.seek(self.start(rev)) |
89 |
88 |
90 def revdiff(self, rev1, rev2): |
89 def revdiff(self, rev1, rev2): |
91 """return or calculate a delta between two revisions""" |
90 """return or calculate a delta between two revisions""" |
92 if self.inbundle(rev1) and self.inbundle(rev2): |
91 if self.inbundle(rev1) and self.inbundle(rev2): |
93 # hot path for bundle |
92 # hot path for bundle |
94 revb = self.rev(self.bundlebase(rev2)) |
93 revb = self.rev(self.basemap[rev2]) |
95 if revb == rev1: |
94 if revb == rev1: |
96 return self._chunk(rev2) |
95 return self._chunk(rev2) |
97 elif not self.inbundle(rev1) and not self.inbundle(rev2): |
96 elif not self.inbundle(rev1) and not self.inbundle(rev2): |
98 return revlog.revlog.revdiff(self, rev1, rev2) |
97 return revlog.revlog.revdiff(self, rev1, rev2) |
99 |
98 |
100 return mdiff.textdiff(self.revision(self.node(rev1)), |
99 return mdiff.textdiff(self.revision(self.node(rev1)), |
101 self.revision(self.node(rev2))) |
100 self.revision(self.node(rev2))) |
102 |
101 |
103 def revision(self, nodeorrev): |
102 def revision(self, nodeorrev): |
104 """return an uncompressed revision of a given node or revision |
103 """return an uncompressed revision of a given node or revision |
105 number. |
104 number. |
106 """ |
105 """ |
121 while self.inbundle(rev): |
120 while self.inbundle(rev): |
122 if self._cache and self._cache[0] == iter_node: |
121 if self._cache and self._cache[0] == iter_node: |
123 text = self._cache[2] |
122 text = self._cache[2] |
124 break |
123 break |
125 chain.append(rev) |
124 chain.append(rev) |
126 iter_node = self.bundlebase(rev) |
125 iter_node = self.basemap[rev] |
127 rev = self.rev(iter_node) |
126 rev = self.rev(iter_node) |
128 if text is None: |
127 if text is None: |
129 text = revlog.revlog.revision(self, iter_node) |
128 text = revlog.revlog.revision(self, iter_node) |
130 |
129 |
131 while chain: |
130 while chain: |