[PATCH 2 of 3] win32: remove READONLY attribute on unlink
Adrian Buehlmann
adrian at cadifra.com
Sun Mar 27 06:01:38 CDT 2011
# HG changeset patch
# User Adrian Buehlmann <adrian at cadifra.com>
# Date 1301186878 -3600
# Node ID 880472ae524d2fa412676459dbed80f22d4e47fb
# Parent f2b6e6c8a6ee51882c62e69c2c7b71fae4545098
win32: remove READONLY attribute on unlink
diff --git a/mercurial/win32.py b/mercurial/win32.py
--- a/mercurial/win32.py
+++ b/mercurial/win32.py
@@ -56,6 +56,9 @@ _FILE_SHARE_DELETE = 0x00000004
_OPEN_EXISTING = 3
+# SetFileAttributes
+_FILE_ATTRIBUTE_NORMAL = 0x80
+
# Process Security and Access Rights
_PROCESS_QUERY_INFORMATION = 0x0400
@@ -350,9 +353,15 @@ def unlink(f):
try:
os.unlink(temp)
- except:
- # Some very rude AV-scanners on Windows may cause this unlink to fail.
- # Not aborting here just leaks the temp file, whereas aborting at this
- # point may leave serious inconsistencies. Ideally, we would notify
- # the user in this case here.
- pass
+ except OSError:
+ # The unlink might have failed because the READONLY attribute may heave
+ # been set on the original file. Rename works fine with READONLY set,
+ # but not os.unlink. Reset all attributes and try again.
+ _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
+ try:
+ os.unlink(temp)
+ except OSError:
+ # The unlink might have failed due to some very rude AV-Scanners.
+ # Leaking a tempfile is the lesser evil than aborting here and
+ # leaving some potentially serious inconsistencies.
+ pass
More information about the Mercurial-devel
mailing list