comparison mercurial/bundlerepo.py @ 33887:702a26fec3e2

bundlerepo: move temp bundle creation to a separate function A future patch will refactor certain parts of bundlerepo initiatlization such that we need to create temp bundles from another function. Let's move this to another function to support that. Differential Revision: https://phab.mercurial-scm.org/D288
author Durham Goode <durham@fb.com>
date Wed, 23 Aug 2017 12:34:56 -0700
parents 634997248c97
children 891118dcd279
comparison
equal deleted inserted replaced
33886:13dc7f29531e 33887:702a26fec3e2
262 pass 262 pass
263 return bundlefilespos 263 return bundlefilespos
264 264
265 class bundlerepository(localrepo.localrepository): 265 class bundlerepository(localrepo.localrepository):
266 def __init__(self, ui, path, bundlename): 266 def __init__(self, ui, path, bundlename):
267 def _writetempbundle(read, suffix, header=''):
268 """Write a temporary file to disk
269
270 This is closure because we need to make sure this tracked by
271 self.tempfile for cleanup purposes."""
272 fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-",
273 suffix=".hg10un")
274 self.tempfile = temp
275
276 with os.fdopen(fdtemp, pycompat.sysstr('wb')) as fptemp:
277 fptemp.write(header)
278 while True:
279 chunk = read(2**18)
280 if not chunk:
281 break
282 fptemp.write(chunk)
283
284 return self.vfs.open(self.tempfile, mode="rb")
285 self._tempparent = None 267 self._tempparent = None
286 try: 268 try:
287 localrepo.localrepository.__init__(self, ui, path) 269 localrepo.localrepository.__init__(self, ui, path)
288 except error.RepoError: 270 except error.RepoError:
289 self._tempparent = tempfile.mkdtemp() 271 self._tempparent = tempfile.mkdtemp()
312 legalcgvers = changegroup.supportedincomingversions(self) 294 legalcgvers = changegroup.supportedincomingversions(self)
313 if version not in legalcgvers: 295 if version not in legalcgvers:
314 msg = _('Unsupported changegroup version: %s') 296 msg = _('Unsupported changegroup version: %s')
315 raise error.Abort(msg % version) 297 raise error.Abort(msg % version)
316 if self.bundle.compressed(): 298 if self.bundle.compressed():
317 cgstream = _writetempbundle(part.read, 299 cgstream = self._writetempbundle(part.read,
318 ".cg%sun" % version) 300 ".cg%sun" % version)
319 301
320 if cgstream is None: 302 if cgstream is None:
321 raise error.Abort(_('No changegroups found')) 303 raise error.Abort(_('No changegroups found'))
322 cgstream.seek(0) 304 cgstream.seek(0)
323 305
324 self.bundle = changegroup.getunbundler(version, cgstream, 'UN') 306 self.bundle = changegroup.getunbundler(version, cgstream, 'UN')
325 307
326 elif self.bundle.compressed(): 308 elif self.bundle.compressed():
327 f = _writetempbundle(self.bundle.read, '.hg10un', header='HG10UN') 309 f = self._writetempbundle(self.bundle.read, '.hg10un',
310 header='HG10UN')
328 self.bundlefile = self.bundle = exchange.readbundle(ui, f, 311 self.bundlefile = self.bundle = exchange.readbundle(ui, f,
329 bundlename, 312 bundlename,
330 self.vfs) 313 self.vfs)
331 314
332 # dict with the mapping 'filename' -> position in the bundle 315 # dict with the mapping 'filename' -> position in the bundle
333 self.bundlefilespos = {} 316 self.bundlefilespos = {}
334 317
335 self.firstnewrev = self.changelog.repotiprev + 1 318 self.firstnewrev = self.changelog.repotiprev + 1
336 phases.retractboundary(self, None, phases.draft, 319 phases.retractboundary(self, None, phases.draft,
337 [ctx.node() for ctx in self[self.firstnewrev:]]) 320 [ctx.node() for ctx in self[self.firstnewrev:]])
321
322 def _writetempbundle(self, readfn, suffix, header=''):
323 """Write a temporary file to disk
324 """
325 fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-",
326 suffix=".hg10un")
327 self.tempfile = temp
328
329 with os.fdopen(fdtemp, pycompat.sysstr('wb')) as fptemp:
330 fptemp.write(header)
331 while True:
332 chunk = readfn(2**18)
333 if not chunk:
334 break
335 fptemp.write(chunk)
336
337 return self.vfs.open(self.tempfile, mode="rb")
338 338
339 @localrepo.unfilteredpropertycache 339 @localrepo.unfilteredpropertycache
340 def _phasecache(self): 340 def _phasecache(self):
341 return bundlephasecache(self, self._phasedefaults) 341 return bundlephasecache(self, self._phasedefaults)
342 342