# HG changeset patch # User Franz Glasner # Date 1650560018 -7200 # Node ID 59253a1e6ef2dcb64d8234748c709d2966fa86a1 # Parent fc2dd6afd59419c5a3cfab6d487d8dfe82b1085f Employ .readinto() on Python 3 diff -r fc2dd6afd594 -r 59253a1e6ef2 cutils/shasum.py --- a/cutils/shasum.py Thu Apr 21 18:52:53 2022 +0200 +++ b/cutils/shasum.py Thu Apr 21 18:53:38 2022 +0200 @@ -600,17 +600,39 @@ fadvise = getattr(os, "posix_fadvise", None) if fadvise: fadvise(fd, 0, 0, os.POSIX_FADV_SEQUENTIAL) - while True: - try: - buf = os.read(fd, READ_CHUNK_SIZE) - except OSError as e: - if e.errno not in (errno.EAGAIN, errno.EWOULDBLOCK, - errno.EINTR): - raise - else: - if len(buf) == 0: - break - h.update(buf) + if not PY2: + fileobj = io.FileIO(fd, mode="r", closefd=False) + buf = bytearray(READ_CHUNK_SIZE) + with memoryview(buf) as full_view: + while True: + try: + n = fileobj.readinto(buf) + except OSError as e: + if e.errno not in (errno.EAGAIN, + errno.EWOULDBLOCK, + errno.EINTR): + raise + else: + if n == 0: + break + if n == READ_CHUNK_SIZE: + h.update(buf) + else: + with full_view[:n] as partial_view: + h.update(partial_view) + else: + while True: + try: + buf = os.read(fd, READ_CHUNK_SIZE) + except OSError as e: + if e.errno not in (errno.EAGAIN, + errno.EWOULDBLOCK, + errno.EINTR): + raise + else: + if len(buf) == 0: + break + h.update(buf) else: # # Use mmap