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
This commit is contained in:
Mark Thomas 2017-09-21 05:54:34 -07:00
parent 2dc959255a
commit 31b5590f30

View File

@ -26,6 +26,7 @@ import errno
import gc
import hashlib
import imp
import mmap
import os
import platform as pyplatform
import re as remod
@ -407,6 +408,17 @@ class bufferedinputpipe(object):
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