diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -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