diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -583,7 +583,7 @@ # copy is delayed until we are in the try entries = [_filterfull(e, copy, vfsmap) for e in entries] yield None # this release the lock on the repository - seen = 0 + totalbytecount = 0 for src, name, ftype, data in entries: vfs = vfsmap[src] @@ -595,6 +595,7 @@ elif ftype == _filefull: fp = open(data, b'rb') size = util.fstat(fp).st_size + bytecount = 0 try: yield util.uvarintencode(size) yield name @@ -603,9 +604,20 @@ else: chunks = util.filechunkiter(fp, limit=size) for chunk in chunks: - seen += len(chunk) - progress.update(seen) + bytecount += len(chunk) + totalbytecount += len(chunk) + progress.update(totalbytecount) yield chunk + if bytecount != size: + # Would most likely be caused by a race due to `hg strip` or + # a revlog split + raise error.Abort( + _( + b'clone could only read %d bytes from %s, but ' + b'expected %d bytes' + ) + % (bytecount, name, size) + ) finally: fp.close()