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):