74 """is rev from the bundle""" |
74 """is rev from the bundle""" |
75 if rev < 0: |
75 if rev < 0: |
76 return False |
76 return False |
77 return rev in self.basemap |
77 return rev in self.basemap |
78 def bundlebase(self, rev): return self.basemap[rev] |
78 def bundlebase(self, rev): return self.basemap[rev] |
79 def chunk(self, rev, df=None): |
79 def chunk(self, rev, df=None, cachelen=4096): |
80 # Warning: in case of bundle, the diff is against bundlebase, |
80 # Warning: in case of bundle, the diff is against bundlebase, |
81 # not against rev - 1 |
81 # not against rev - 1 |
82 # XXX: could use some caching |
82 # XXX: could use some caching |
83 if not self.bundle(rev): |
83 if not self.bundle(rev): |
84 return revlog.revlog.chunk(self, rev) |
84 return revlog.revlog.chunk(self, rev, df, cachelen) |
85 self.bundlefile.seek(self.start(rev)) |
85 self.bundlefile.seek(self.start(rev)) |
86 return self.bundlefile.read(self.length(rev)) |
86 return self.bundlefile.read(self.length(rev)) |
87 |
87 |
88 def revdiff(self, rev1, rev2): |
88 def revdiff(self, rev1, rev2): |
89 """return or calculate a delta between two revisions""" |
89 """return or calculate a delta between two revisions""" |
121 delta = self.chunk(chain.pop()) |
121 delta = self.chunk(chain.pop()) |
122 text = self.patches(text, [delta]) |
122 text = self.patches(text, [delta]) |
123 |
123 |
124 p1, p2 = self.parents(node) |
124 p1, p2 = self.parents(node) |
125 if node != revlog.hash(text, p1, p2): |
125 if node != revlog.hash(text, p1, p2): |
126 raise RevlogError(_("integrity check failed on %s:%d") |
126 raise revlog.RevlogError(_("integrity check failed on %s:%d") |
127 % (self.datafile, self.rev(node))) |
127 % (self.datafile, self.rev(node))) |
128 |
128 |
129 self.cache = (node, self.rev(node), text) |
129 self.cache = (node, self.rev(node), text) |
130 return text |
130 return text |
131 |
131 |
158 |
158 |
159 class bundlerepository(localrepo.localrepository): |
159 class bundlerepository(localrepo.localrepository): |
160 def __init__(self, ui, path, bundlename): |
160 def __init__(self, ui, path, bundlename): |
161 localrepo.localrepository.__init__(self, ui, path) |
161 localrepo.localrepository.__init__(self, ui, path) |
162 f = open(bundlename, "rb") |
162 f = open(bundlename, "rb") |
163 s = util.fstat(f) |
|
164 self.bundlefile = f |
163 self.bundlefile = f |
165 header = self.bundlefile.read(6) |
164 header = self.bundlefile.read(6) |
166 if not header.startswith("HG"): |
165 if not header.startswith("HG"): |
167 raise util.Abort(_("%s: not a Mercurial bundle file") % bundlename) |
166 raise util.Abort(_("%s: not a Mercurial bundle file") % bundlename) |
168 elif not header.startswith("HG10"): |
167 elif not header.startswith("HG10"): |