# HG changeset patch # User Matt Mackall # Date 1450471211 21600 # Node ID 8f016345e6b0eb05a0f0ea933baf544dd81c8cac # Parent 2e31a17ad1bfba63741e9eecaa48ae12daded4c4# Parent e240e914d2261788c3ba700401659c11ed820fe3 merge with stable diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -15,6 +15,7 @@ import collections import errno +import os import struct import zlib @@ -1495,6 +1496,20 @@ return node def _writeentry(self, transaction, ifh, dfh, entry, data, link, offset): + # Files opened in a+ mode have inconsistent behavior on various + # platforms. Windows requires that a file positioning call be made + # when the file handle transitions between reads and writes. See + # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other + # platforms, Python or the platform itself can be buggy. Some versions + # of Solaris have been observed to not append at the end of the file + # if the file was seeked to before the end. See issue4943 for more. + # + # We work around this issue by inserting a seek() before writing. + # Note: This is likely not necessary on Python 3. + ifh.seek(0, os.SEEK_END) + if dfh: + dfh.seek(0, os.SEEK_END) + curr = len(self) - 1 if not self._inline: transaction.add(self.datafile, offset)