mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Edit Book: More descriptive error message when saving fails because of a bad umask
This commit is contained in:
parent
37352fefd7
commit
d96714ed24
@ -16,7 +16,7 @@ from calibre.constants import iswindows
|
|||||||
from calibre.ptempfile import PersistentTemporaryFile
|
from calibre.ptempfile import PersistentTemporaryFile
|
||||||
from calibre.gui2.progress_indicator import ProgressIndicator
|
from calibre.gui2.progress_indicator import ProgressIndicator
|
||||||
from calibre.utils import join_with_timeout
|
from calibre.utils import join_with_timeout
|
||||||
from calibre.utils.filenames import atomic_rename
|
from calibre.utils.filenames import atomic_rename, format_permissions
|
||||||
from calibre.utils.ipc import RC
|
from calibre.utils.ipc import RC
|
||||||
|
|
||||||
def save_container(container, path):
|
def save_container(container, path):
|
||||||
@ -33,7 +33,13 @@ def save_container(container, path):
|
|||||||
# path may not exist if we are saving a copy, in which case we use
|
# path may not exist if we are saving a copy, in which case we use
|
||||||
# the metadata from the original book
|
# the metadata from the original book
|
||||||
st = os.stat(container.path_to_ebook)
|
st = os.stat(container.path_to_ebook)
|
||||||
os.fchmod(fno, st.st_mode)
|
try:
|
||||||
|
os.fchmod(fno, st.st_mode)
|
||||||
|
except EnvironmentError as err:
|
||||||
|
if err.errno != errno.EPERM:
|
||||||
|
raise
|
||||||
|
raise EnvironmentError('Failed to change permissions of %s to %s (%s), with error: %s. Most likely the %s directory has a restrictive umask' % (
|
||||||
|
temp.name, oct(st.st_mode), format_permissions(st.st_mode), errno.errorcode[err.errno], os.path.dirname(temp.name)))
|
||||||
try:
|
try:
|
||||||
os.fchown(fno, st.st_uid, st.st_gid)
|
os.fchown(fno, st.st_uid, st.st_gid)
|
||||||
except EnvironmentError as err:
|
except EnvironmentError as err:
|
||||||
|
@ -506,3 +506,20 @@ if iswindows:
|
|||||||
return userhome + path[i:]
|
return userhome + path[i:]
|
||||||
else:
|
else:
|
||||||
expanduser = os.path.expanduser
|
expanduser = os.path.expanduser
|
||||||
|
|
||||||
|
def format_permissions(st_mode):
|
||||||
|
import stat
|
||||||
|
for func, letter in (x.split(':') for x in 'REG:- DIR:d BLK:b CHR:c FIFO:p LNK:l SOCK:s'.split()):
|
||||||
|
if getattr(stat, 'S_IS' + func)(st_mode):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
letter = '?'
|
||||||
|
rwx = ('---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx')
|
||||||
|
ans = [letter] + list(rwx[(st_mode >> 6) & 7]) + list(rwx[(st_mode >> 3) & 7]) + list(rwx[(st_mode & 7)])
|
||||||
|
if st_mode & stat.S_ISUID:
|
||||||
|
ans[3] = 's' if (st_mode & stat.S_IXUSR) else 'S'
|
||||||
|
if st_mode & stat.S_ISGID:
|
||||||
|
ans[6] = 's' if (st_mode & stat.S_IXGRP) else 'l'
|
||||||
|
if st_mode & stat.S_ISVTX:
|
||||||
|
ans[9] = 't' if (st_mode & stat.S_IXUSR) else 'T'
|
||||||
|
return ''.join(ans)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user