comparison mercurial/streamclone.py @ 38374:800f5a2c869e

progress: make the progress helper a context manager This lets us simplify the use site in streamclone. Differential Revision: https://phab.mercurial-scm.org/D3775
author Martin von Zweigbergk <martinvonz@google.com>
date Sun, 17 Jun 2018 13:48:58 -0700
parents ef692614e601
children e7aa113b14f7
comparison
equal deleted inserted replaced
38373:ef692614e601 38374:800f5a2c869e
493 """actually emit the stream bundle""" 493 """actually emit the stream bundle"""
494 vfsmap = _makemap(repo) 494 vfsmap = _makemap(repo)
495 progress = repo.ui.makeprogress(_('bundle'), total=totalfilesize, 495 progress = repo.ui.makeprogress(_('bundle'), total=totalfilesize,
496 unit=_('bytes')) 496 unit=_('bytes'))
497 progress.update(0) 497 progress.update(0)
498 with maketempcopies() as copy: 498 with maketempcopies() as copy, progress:
499 try: 499 # copy is delayed until we are in the try
500 # copy is delayed until we are in the try 500 entries = [_filterfull(e, copy, vfsmap) for e in entries]
501 entries = [_filterfull(e, copy, vfsmap) for e in entries] 501 yield None # this release the lock on the repository
502 yield None # this release the lock on the repository 502 seen = 0
503 seen = 0 503
504 504 for src, name, ftype, data in entries:
505 for src, name, ftype, data in entries: 505 vfs = vfsmap[src]
506 vfs = vfsmap[src] 506 yield src
507 yield src 507 yield util.uvarintencode(len(name))
508 yield util.uvarintencode(len(name)) 508 if ftype == _fileappend:
509 if ftype == _fileappend: 509 fp = vfs(name)
510 fp = vfs(name) 510 size = data
511 size = data 511 elif ftype == _filefull:
512 elif ftype == _filefull: 512 fp = open(data, 'rb')
513 fp = open(data, 'rb') 513 size = util.fstat(fp).st_size
514 size = util.fstat(fp).st_size 514 try:
515 try: 515 yield util.uvarintencode(size)
516 yield util.uvarintencode(size) 516 yield name
517 yield name 517 if size <= 65536:
518 if size <= 65536: 518 chunks = (fp.read(size),)
519 chunks = (fp.read(size),) 519 else:
520 else: 520 chunks = util.filechunkiter(fp, limit=size)
521 chunks = util.filechunkiter(fp, limit=size) 521 for chunk in chunks:
522 for chunk in chunks: 522 seen += len(chunk)
523 seen += len(chunk) 523 progress.update(seen)
524 progress.update(seen) 524 yield chunk
525 yield chunk 525 finally:
526 finally: 526 fp.close()
527 fp.close()
528 finally:
529 progress.complete()
530 527
531 def generatev2(repo): 528 def generatev2(repo):
532 """Emit content for version 2 of a streaming clone. 529 """Emit content for version 2 of a streaming clone.
533 530
534 the data stream consists the following entries: 531 the data stream consists the following entries: