Dont use pywin32 for share_file.py

This commit is contained in:
Kovid Goyal 2020-10-16 13:10:24 +05:30
parent 6bcbd1b42e
commit c9df881fd9
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 29 additions and 63 deletions

View File

@ -16,7 +16,7 @@ from calibre.srv.errors import HTTPNotFound
from calibre.utils.localization import get_translator
from calibre.utils.socket_inheritance import set_socket_inherit
from calibre.utils.logging import ThreadSafeLog
from calibre.utils.shared_file import share_open, raise_winerror
from calibre.utils.shared_file import share_open
from polyglot.builtins import iteritems, map, range
from polyglot import reprlib
from polyglot.http_cookie import SimpleCookie
@ -334,11 +334,8 @@ class RotatingStream(object):
def rename(self, src, dest):
try:
if iswindows:
import win32file, pywintypes
try:
win32file.MoveFileEx(src, dest, win32file.MOVEFILE_REPLACE_EXISTING|win32file.MOVEFILE_WRITE_THROUGH)
except pywintypes.error as e:
raise_winerror(e)
from calibre_extensions import winutil
winutil.move_file(src, dest)
else:
os.rename(src, dest)
except EnvironmentError as e:

View File

@ -31,8 +31,6 @@ class BuildTest(unittest.TestCase):
self.assertTrue(False, 'Failed to load DLL %s with error: %s' % (x, err))
from Crypto.Cipher import AES
del AES
from pywintypes import error
del error
@unittest.skipUnless(islinux, 'DBUS only used on linux')
def test_dbus(self):

View File

@ -31,55 +31,28 @@ file before deleting it.
if iswindows:
from numbers import Integral
import msvcrt
import win32file, pywintypes
CREATE_NEW = win32file.CREATE_NEW
CREATE_ALWAYS = win32file.CREATE_ALWAYS
OPEN_EXISTING = win32file.OPEN_EXISTING
OPEN_ALWAYS = win32file.OPEN_ALWAYS
TRUNCATE_EXISTING = win32file.TRUNCATE_EXISTING
FILE_SHARE_READ = win32file.FILE_SHARE_READ
FILE_SHARE_WRITE = win32file.FILE_SHARE_WRITE
FILE_SHARE_DELETE = win32file.FILE_SHARE_DELETE
FILE_SHARE_VALID_FLAGS = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
FILE_ATTRIBUTE_READONLY = win32file.FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_NORMAL = win32file.FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_TEMPORARY = win32file.FILE_ATTRIBUTE_TEMPORARY
FILE_FLAG_DELETE_ON_CLOSE = win32file.FILE_FLAG_DELETE_ON_CLOSE
FILE_FLAG_SEQUENTIAL_SCAN = win32file.FILE_FLAG_SEQUENTIAL_SCAN
FILE_FLAG_RANDOM_ACCESS = win32file.FILE_FLAG_RANDOM_ACCESS
GENERIC_READ = win32file.GENERIC_READ & 0xffffffff
GENERIC_WRITE = win32file.GENERIC_WRITE & 0xffffffff
DELETE = 0x00010000
from calibre_extensions import winutil
_ACCESS_MASK = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
_ACCESS_MAP = {
os.O_RDONLY : GENERIC_READ,
os.O_WRONLY : GENERIC_WRITE,
os.O_RDWR : GENERIC_READ | GENERIC_WRITE
os.O_RDONLY : winutil.GENERIC_READ,
os.O_WRONLY : winutil.GENERIC_WRITE,
os.O_RDWR : winutil.GENERIC_READ | winutil.GENERIC_WRITE
}
_CREATE_MASK = os.O_CREAT | os.O_EXCL | os.O_TRUNC
_CREATE_MAP = {
0 : OPEN_EXISTING,
os.O_EXCL : OPEN_EXISTING,
os.O_CREAT : OPEN_ALWAYS,
os.O_CREAT | os.O_EXCL : CREATE_NEW,
os.O_CREAT | os.O_TRUNC | os.O_EXCL : CREATE_NEW,
os.O_TRUNC : TRUNCATE_EXISTING,
os.O_TRUNC | os.O_EXCL : TRUNCATE_EXISTING,
os.O_CREAT | os.O_TRUNC : CREATE_ALWAYS
0 : winutil.OPEN_EXISTING,
os.O_EXCL : winutil.OPEN_EXISTING,
os.O_CREAT : winutil.OPEN_ALWAYS,
os.O_CREAT | os.O_EXCL : winutil.CREATE_NEW,
os.O_CREAT | os.O_TRUNC | os.O_EXCL : winutil.CREATE_NEW,
os.O_TRUNC : winutil.TRUNCATE_EXISTING,
os.O_TRUNC | os.O_EXCL : winutil.TRUNCATE_EXISTING,
os.O_CREAT | os.O_TRUNC : winutil.CREATE_ALWAYS
}
def raise_winerror(pywinerr, path=None):
exc = OSError(
pywinerr.winerror,
(pywinerr.funcname or '') + ': ' + (pywinerr.strerror or ''),
path,
pywinerr.winerror
)
reraise(type(exc), exc, sys.exc_info()[2])
def os_open(path, flags, mode=0o777, share_flags=FILE_SHARE_VALID_FLAGS):
def os_open(path, flags, mode=0o777, share_flags=winutil.FILE_SHARE_VALID_FLAGS):
'''
Replacement for os.open() allowing moving or unlinking before closing
'''
@ -88,36 +61,34 @@ if iswindows:
if not isinstance(mode, Integral):
raise TypeError('mode must be an integer')
if share_flags & ~FILE_SHARE_VALID_FLAGS:
if share_flags & ~winutil.FILE_SHARE_VALID_FLAGS:
raise ValueError('bad share_flags: %r' % share_flags)
access_flags = _ACCESS_MAP[flags & _ACCESS_MASK]
create_flags = _CREATE_MAP[flags & _CREATE_MASK]
attrib_flags = FILE_ATTRIBUTE_NORMAL
attrib_flags = winutil.FILE_ATTRIBUTE_NORMAL
if flags & os.O_CREAT and mode & ~0o444 == 0:
attrib_flags = FILE_ATTRIBUTE_READONLY
attrib_flags = winutil.FILE_ATTRIBUTE_READONLY
if flags & os.O_TEMPORARY:
share_flags |= FILE_SHARE_DELETE
attrib_flags |= FILE_FLAG_DELETE_ON_CLOSE
access_flags |= DELETE
share_flags |= winutil.FILE_SHARE_DELETE
attrib_flags |= winutil.FILE_FLAG_DELETE_ON_CLOSE
access_flags |= winutil.DELETE
if flags & os.O_SHORT_LIVED:
attrib_flags |= FILE_ATTRIBUTE_TEMPORARY
attrib_flags |= winutil.FILE_ATTRIBUTE_TEMPORARY
if flags & os.O_SEQUENTIAL:
attrib_flags |= FILE_FLAG_SEQUENTIAL_SCAN
attrib_flags |= winutil.FILE_FLAG_SEQUENTIAL_SCAN
if flags & os.O_RANDOM:
attrib_flags |= FILE_FLAG_RANDOM_ACCESS
attrib_flags |= winutil.FILE_FLAG_RANDOM_ACCESS
try:
h = win32file.CreateFileW(
path, access_flags, share_flags, None, create_flags, attrib_flags, None)
except pywintypes.error as e:
raise_winerror(e, path)
ans = msvcrt.open_osfhandle(h.Detach(), flags | os.O_NOINHERIT)
h = winutil.create_file(
path, access_flags, share_flags, create_flags, attrib_flags)
ans = msvcrt.open_osfhandle(int(h), flags | os.O_NOINHERIT)
h.detach()
return ans
def share_open(*a, **kw):