merge with stable
authorMatt Mackall <mpm@selenic.com>
Fri, 18 Dec 2015 14:40:11 -0600
changeset 27431 8f016345e6b0
parent 27429 2e31a17ad1bf (current diff)
parent 27430 e240e914d226 (diff)
child 27432 77d25b913f80
merge with stable
mercurial/revlog.py
--- a/mercurial/revlog.py	Mon Dec 14 20:57:21 2015 -0500
+++ b/mercurial/revlog.py	Fri Dec 18 14:40:11 2015 -0600
@@ -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)