# HG changeset patch # User Mark Thomas # Date 1505998474 25200 # Node ID 3bb2a9f25fe98c62076d2eae1b783ba5640685d5 # Parent 05131c963767faaac6a66b2c658659bfbb4db29b util: add an mmapread method This is useful for large files that are only partly touched. Test Plan: Will be used and tested in a later patch. Differential Revision: https://phab.mercurial-scm.org/D476 diff -r 05131c963767 -r 3bb2a9f25fe9 mercurial/util.py --- a/mercurial/util.py Wed Sep 20 09:35:45 2017 -0700 +++ b/mercurial/util.py Thu Sep 21 05:54:34 2017 -0700 @@ -26,6 +26,7 @@ import gc import hashlib import imp +import mmap import os import platform as pyplatform import re as remod @@ -407,6 +408,17 @@ self._lenbuf += len(data) self._buffer.append(data) +def mmapread(fp): + try: + fd = getattr(fp, 'fileno', lambda: fp)() + return mmap.mmap(fd, 0, access=mmap.ACCESS_READ) + except ValueError: + # Empty files cannot be mmapped, but mmapread should still work. Check + # if the file is empty, and if so, return an empty buffer. + if os.fstat(fd).st_size == 0: + return '' + raise + def popen2(cmd, env=None, newlines=False): # Setting bufsize to -1 lets the system decide the buffer size. # The default for bufsize is 0, meaning unbuffered. This leads to