changeset 24051:7956d17431bc

windows: seek to the end of posixfile when opening in append mode The position is implementation defined when opening in append mode, and it seems like Linux sets it to EOF while Windows keeps it at zero. This has caused problems in the past when a file is opened and tell() is immediately called, such as 48c232873a54 and 6bf93440a717. Since the only caller of osutil.posixfile is this windows module, this seems like a better place to fix the issue than in osutil.c and pure.osutil.
author Matt Harbison <matt_harbison@yahoo.com>
date Sat, 31 Jan 2015 12:39:44 -0500
parents a9b61dbdb827
children 32a64923d2b7
files mercurial/windows.py
diffstat 1 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/windows.py	Thu Nov 20 12:15:12 2014 -0800
+++ b/mercurial/windows.py	Sat Jan 31 12:39:44 2015 -0500
@@ -26,11 +26,19 @@
 unlink = win32.unlink
 
 umask = 0022
+_SEEK_END = 2 # os.SEEK_END was introduced in Python 2.5
 
 # wrap osutil.posixfile to provide friendlier exceptions
 def posixfile(name, mode='r', buffering=-1):
     try:
-        return osutil.posixfile(name, mode, buffering)
+        fp = osutil.posixfile(name, mode, buffering)
+
+        # The position when opening in append mode is implementation defined, so
+        # make it consistent with other platforms, which position at EOF.
+        if 'a' in mode:
+            fp.seek(0, _SEEK_END)
+
+        return fp
     except WindowsError, err:
         raise IOError(err.errno, '%s: %s' % (name, err.strerror))
 posixfile.__doc__ = osutil.posixfile.__doc__