[PATCH] posixfile: remove posixfile_nt and fix import bug in windows.py

Sune Foldager cryo at cyanite.org
Wed May 13 14:47:16 CDT 2009


# HG changeset patch
# User Sune Foldager <cryo at cyanite.org>
# Date 1242243376 -7200
# Node ID 6b20dcc75ee5f48a3cfda83515c7b06b553a3d2e
# Parent  45ed015b524e44184c92cbe099454190ff4c6049
posixfile: remove posixfile_nt and fix import bug in windows.py

The posixfile_nt class has been superseded by posixfile in osutils.c,
which works on Windows NT and above. All other systems get the regular
python file class which is assigned to posixfile in posix.py (for POSIX)
and in the pure python version of osutils.py (for Win 9x or Windows NT
in pure mode).

diff --git a/mercurial/pure/osutil.py b/mercurial/pure/osutil.py
--- a/mercurial/pure/osutil.py
+++ b/mercurial/pure/osutil.py
@@ -8,6 +8,8 @@
 import os
 import stat as _stat
 
+posixfile = file
+
 def _mode_to_kind(mode):
     if _stat.S_ISREG(mode): return _stat.S_IFREG
     if _stat.S_ISDIR(mode): return _stat.S_IFDIR
@@ -47,3 +49,4 @@
         else:
             result.append((fn, _mode_to_kind(st.st_mode)))
     return result
+
diff --git a/mercurial/win32.py b/mercurial/win32.py
--- a/mercurial/win32.py
+++ b/mercurial/win32.py
@@ -264,114 +264,6 @@
     return [os.path.join(userdir, 'mercurial.ini'),
             os.path.join(userdir, '.hgrc')]
 
-class posixfile_nt(object):
-    '''file object with posix-like semantics.  on windows, normal
-    files can not be deleted or renamed if they are open. must open
-    with win32file.FILE_SHARE_DELETE. this flag does not exist on
-    windows < nt, so do not use this class there.'''
-
-    # ideally, we could use win32file._open_osfhandle and avoid this
-    # class entirely, but we would need the win32 _fdopen function,
-    # which is not exported by the win32file module.
-
-    def __init__(self, name, mode='rb'):
-        self.closed = False
-        self.name = name
-        self.mode = mode
-        access = 0
-        if 'r' in mode or '+' in mode:
-            access |= win32file.GENERIC_READ
-        if 'w' in mode or 'a' in mode or '+' in mode:
-            access |= win32file.GENERIC_WRITE
-        if 'r' in mode:
-            creation = win32file.OPEN_EXISTING
-        elif 'a' in mode:
-            creation = win32file.OPEN_ALWAYS
-        else:
-            creation = win32file.CREATE_ALWAYS
-        try:
-            self.handle = win32file.CreateFile(name,
-                                               access,
-                                               win32file.FILE_SHARE_READ |
-                                               win32file.FILE_SHARE_WRITE |
-                                               win32file.FILE_SHARE_DELETE,
-                                               None,
-                                               creation,
-                                               win32file.FILE_ATTRIBUTE_NORMAL,
-                                               0)
-        except pywintypes.error, err:
-            raise WinIOError(err, name)
-
-    def __iter__(self):
-        for line in self.readlines():
-            yield line
-
-    def read(self, count=-1):
-        try:
-            cs = cStringIO.StringIO()
-            while count:
-                wincount = int(count)
-                if wincount == -1:
-                    wincount = 1048576
-                val, data = win32file.ReadFile(self.handle, wincount)
-                if not data: break
-                cs.write(data)
-                if count != -1:
-                    count -= len(data)
-            return cs.getvalue()
-        except pywintypes.error, err:
-            raise WinIOError(err)
-
-    def readlines(self, sizehint=None):
-        # splitlines() splits on single '\r' while readlines()
-        # does not. cStringIO has a well behaving readlines() and is fast.
-        return cStringIO.StringIO(self.read()).readlines()
-
-    def write(self, data):
-        try:
-            if 'a' in self.mode:
-                win32file.SetFilePointer(self.handle, 0, win32file.FILE_END)
-            nwrit = 0
-            while nwrit < len(data):
-                val, nwrit = win32file.WriteFile(self.handle, data)
-                data = data[nwrit:]
-        except pywintypes.error, err:
-            raise WinIOError(err)
-
-    def writelines(self, sequence):
-        for s in sequence:
-            self.write(s)
-
-    def seek(self, pos, whence=0):
-        try:
-            win32file.SetFilePointer(self.handle, int(pos), whence)
-        except pywintypes.error, err:
-            raise WinIOError(err)
-
-    def tell(self):
-        try:
-            return win32file.SetFilePointer(self.handle, 0,
-                                            win32file.FILE_CURRENT)
-        except pywintypes.error, err:
-            raise WinIOError(err)
-
-    def close(self):
-        if not self.closed:
-            self.handle = None
-            self.closed = True
-
-    def flush(self):
-        # we have no application-level buffering
-        pass
-
-    def truncate(self, pos=0):
-        try:
-            win32file.SetFilePointer(self.handle, int(pos),
-                                     win32file.FILE_BEGIN)
-            win32file.SetEndOfFile(self.handle)
-        except pywintypes.error, err:
-            raise WinIOError(err)
-
 def getuser():
     '''return name of current user'''
     return win32api.GetUserName()
diff --git a/mercurial/windows.py b/mercurial/windows.py
--- a/mercurial/windows.py
+++ b/mercurial/windows.py
@@ -8,9 +8,17 @@
 from i18n import _
 import osutil, error
 import errno, msvcrt, os, re, sys
+
 nulldev = 'NUL:'
+umask = 002
 
-umask = 002
+# wrap osutil.posixfile to provide friendlier exceptions
+def posixfile(name, mode='r', buffering=-1):
+    try:
+        return osutil.posixfile(name, mode, buffering)
+    except WindowsError, err:
+        raise WinIOError(err)
+posixfile.__doc__ = osutil.posixfile.__doc__
 
 class winstdout:
     '''stdout on windows misbehaves if sent through a pipe'''
@@ -270,20 +278,5 @@
 try:
     # override functions with win32 versions if possible
     from win32 import *
-    if not _is_win_9x():
-        posixfile = posixfile_nt
-        try:
-            # fast, buffered POSIX-like file support
-            from osutil import posixfile as _posixfile
-            def posixfile(name, mode='r', buffering=-1):
-                # wrap osutil.posixfile to provide friendlier exceptions
-                try:
-                    return _posixfile(name, mode, buffering)
-                except WindowsError, err:
-                    raise WinIOError(err)
-            posixfile.__doc__ = _posixfile.__doc__
-        except ImportError:
-            # slow, unbuffered POSIX-like file support
-            posixfile = posixfile_nt
 except ImportError:
-    posixfile = file
+    pass


More information about the Mercurial-devel mailing list