Mercurial > public > mercurial-scm > hg
comparison mercurial/bundlerepo.py @ 2273:f116ddea537f
add support for compressed bundle repositories
we simply create a uncompressed bundle in a tempfile
in .hg
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Fri, 12 May 2006 18:38:56 +0200 |
parents | 8dafccbcede9 |
children | 109a22f5434a |
comparison
equal
deleted
inserted
replaced
2272:e9a0ed9ed4d9 | 2273:f116ddea537f |
---|---|
11 """ | 11 """ |
12 | 12 |
13 from node import * | 13 from node import * |
14 from i18n import gettext as _ | 14 from i18n import gettext as _ |
15 from demandload import demandload | 15 from demandload import demandload |
16 demandload(globals(), "changegroup util os struct") | 16 demandload(globals(), "changegroup util os struct bz2 tempfile") |
17 | 17 |
18 import localrepo, changelog, manifest, filelog, revlog | 18 import localrepo, changelog, manifest, filelog, revlog |
19 | 19 |
20 class bundlerevlog(revlog.revlog): | 20 class bundlerevlog(revlog.revlog): |
21 def __init__(self, opener, indexfile, datafile, bundlefile, | 21 def __init__(self, opener, indexfile, datafile, bundlefile, |
157 bundlefile, linkmapper) | 157 bundlefile, linkmapper) |
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 self.tempfile = None |
163 self.bundlefile = f | 163 self.bundlefile = open(bundlename, "rb") |
164 header = self.bundlefile.read(6) | 164 header = self.bundlefile.read(6) |
165 if not header.startswith("HG"): | 165 if not header.startswith("HG"): |
166 raise util.Abort(_("%s: not a Mercurial bundle file") % bundlename) | 166 raise util.Abort(_("%s: not a Mercurial bundle file") % bundlename) |
167 elif not header.startswith("HG10"): | 167 elif not header.startswith("HG10"): |
168 raise util.Abort(_("%s: unknown bundle version") % bundlename) | 168 raise util.Abort(_("%s: unknown bundle version") % bundlename) |
169 elif header == "HG10BZ": | 169 elif header == "HG10BZ": |
170 raise util.Abort(_("%s: compressed bundle not supported") | 170 fdtemp, temp = tempfile.mkstemp(prefix="hg-bundle-", |
171 % bundlename) | 171 suffix=".hg10un", dir=self.path) |
172 self.tempfile = temp | |
173 fptemp = os.fdopen(fdtemp, 'wb') | |
174 def generator(f): | |
175 zd = bz2.BZ2Decompressor() | |
176 zd.decompress("BZ") | |
177 for chunk in f: | |
178 yield zd.decompress(chunk) | |
179 gen = generator(util.filechunkiter(self.bundlefile, 4096)) | |
180 | |
181 try: | |
182 fptemp.write("HG10UN") | |
183 for chunk in gen: | |
184 fptemp.write(chunk) | |
185 finally: | |
186 fptemp.close() | |
187 self.bundlefile.close() | |
188 | |
189 self.bundlefile = open(self.tempfile, "rb") | |
190 # seek right after the header | |
191 self.bundlefile.seek(6) | |
172 elif header == "HG10UN": | 192 elif header == "HG10UN": |
173 # uncompressed bundle supported | 193 # nothing to do |
174 pass | 194 pass |
175 else: | 195 else: |
176 raise util.Abort(_("%s: unknown bundle compression type") | 196 raise util.Abort(_("%s: unknown bundle compression type") |
177 % bundlename) | 197 % bundlename) |
178 self.changelog = bundlechangelog(self.opener, self.bundlefile) | 198 self.changelog = bundlechangelog(self.opener, self.bundlefile) |
202 return filelog.filelog(self.opener, f) | 222 return filelog.filelog(self.opener, f) |
203 | 223 |
204 def close(self): | 224 def close(self): |
205 """Close assigned bundle file immediately.""" | 225 """Close assigned bundle file immediately.""" |
206 self.bundlefile.close() | 226 self.bundlefile.close() |
227 | |
228 def __del__(self): | |
229 if not self.bundlefile.closed: | |
230 self.bundlefile.close() | |
231 if self.tempfile is not None: | |
232 os.unlink(self.tempfile) |