--- a/mercurial/win32.py Thu May 01 17:48:02 2014 -0500
+++ b/mercurial/win32.py Sat May 03 10:33:54 2014 +0200
@@ -25,7 +25,6 @@
# GetLastError
_ERROR_SUCCESS = 0
_ERROR_NO_MORE_FILES = 18
-_ERROR_SHARING_VIOLATION = 32
_ERROR_INVALID_PARAMETER = 87
_ERROR_INSUFFICIENT_BUFFER = 122
@@ -61,9 +60,7 @@
_OPEN_EXISTING = 3
-_FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
_FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
-_FILE_FLAG_DELETE_ON_CLOSE = 0x04000000
# SetFileAttributes
_FILE_ATTRIBUTE_NORMAL = 0x80
@@ -424,18 +421,11 @@
def unlink(f):
'''try to implement POSIX' unlink semantics on Windows'''
- # If we can open f exclusively, no other processes must have open handles
- # for it and we can expect its name will be deleted immediately when we
- # close the handle unless we have another in the same process. We also
- # expect we shall simply fail to open f if it is a directory.
- fh = _kernel32.CreateFileA(f, 0, 0, None, _OPEN_EXISTING,
- _FILE_FLAG_OPEN_REPARSE_POINT | _FILE_FLAG_DELETE_ON_CLOSE, None)
- if fh != _INVALID_HANDLE_VALUE:
- _kernel32.CloseHandle(fh)
- return
- error = _kernel32.GetLastError()
- if error != _ERROR_SHARING_VIOLATION:
- raise ctypes.WinError(error)
+ if os.path.isdir(f):
+ # use EPERM because it is POSIX prescribed value, even though
+ # unlink(2) on directories returns EISDIR on Linux
+ raise IOError(errno.EPERM,
+ "Unlinking directory not permitted: '%s'" % f)
# POSIX allows to unlink and rename open files. Windows has serious
# problems with doing that: