diff -r 00aa37c65e0a -r e240e914d226 mercurial/revlog.py --- a/mercurial/revlog.py Mon Nov 30 13:47:29 2015 -0600 +++ b/mercurial/revlog.py Thu Dec 17 17:16:02 2015 -0800 @@ -13,6 +13,7 @@ # import stuff from node for others to import from revlog import collections +import os from node import bin, hex, nullid, nullrev from i18n import _ import ancestor, mdiff, parsers, error, util, templatefilters @@ -1426,6 +1427,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)