Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/bundlerepo.py @ 26800:7cac6ee41be7
bundlerepo: move temp-bundle writing logic into a closure
We will reuse this logic for bundle2
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Mon, 19 Oct 2015 17:58:04 +0200 |
parents | 56b2bcea2529 |
children | 73bf76bf6f14 |
comparison
equal
deleted
inserted
replaced
26799:ae03d4190321 | 26800:7cac6ee41be7 |
---|---|
235 self.invalidate() | 235 self.invalidate() |
236 self.dirty = True | 236 self.dirty = True |
237 | 237 |
238 class bundlerepository(localrepo.localrepository): | 238 class bundlerepository(localrepo.localrepository): |
239 def __init__(self, ui, path, bundlename): | 239 def __init__(self, ui, path, bundlename): |
240 def _writetempbundle(read, suffix, header=''): | |
241 """Write a temporary file to disk | |
242 | |
243 This is closure because we need to make sure this tracked by | |
244 self.tempfile for cleanup purposes.""" | |
245 fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-", | |
246 suffix=".hg10un") | |
247 self.tempfile = temp | |
248 fptemp = os.fdopen(fdtemp, 'wb') | |
249 | |
250 try: | |
251 fptemp.write(header) | |
252 while True: | |
253 chunk = read(2**18) | |
254 if not chunk: | |
255 break | |
256 fptemp.write(chunk) | |
257 finally: | |
258 fptemp.close() | |
259 | |
260 return self.vfs.open(self.tempfile, mode="rb") | |
240 self._tempparent = None | 261 self._tempparent = None |
241 try: | 262 try: |
242 localrepo.localrepository.__init__(self, ui, path) | 263 localrepo.localrepository.__init__(self, ui, path) |
243 except error.RepoError: | 264 except error.RepoError: |
244 self._tempparent = tempfile.mkdtemp() | 265 self._tempparent = tempfile.mkdtemp() |
253 | 274 |
254 self.tempfile = None | 275 self.tempfile = None |
255 f = util.posixfile(bundlename, "rb") | 276 f = util.posixfile(bundlename, "rb") |
256 self.bundlefile = self.bundle = exchange.readbundle(ui, f, bundlename) | 277 self.bundlefile = self.bundle = exchange.readbundle(ui, f, bundlename) |
257 if self.bundle.compressed(): | 278 if self.bundle.compressed(): |
258 fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-", | 279 f = _writetempbundle(self.bundle.read, '.hg10un', header='HG10UN') |
259 suffix=".hg10un") | |
260 self.tempfile = temp | |
261 fptemp = os.fdopen(fdtemp, 'wb') | |
262 | |
263 try: | |
264 fptemp.write("HG10UN") | |
265 while True: | |
266 chunk = self.bundle.read(2**18) | |
267 if not chunk: | |
268 break | |
269 fptemp.write(chunk) | |
270 finally: | |
271 fptemp.close() | |
272 | |
273 f = self.vfs.open(self.tempfile, mode="rb") | |
274 self.bundlefile = self.bundle = exchange.readbundle(ui, f, | 280 self.bundlefile = self.bundle = exchange.readbundle(ui, f, |
275 bundlename, | 281 bundlename, |
276 self.vfs) | 282 self.vfs) |
277 | 283 |
278 if isinstance(self.bundle, bundle2.unbundle20): | 284 if isinstance(self.bundle, bundle2.unbundle20): |