Improve handling of systems with improperly configured file system encoding

Closes #289
This commit is contained in:
Jonas Borgström 2015-04-21 22:29:10 +02:00
parent ed9475d7cd
commit 64e8ea72ac
3 changed files with 9 additions and 0 deletions

View File

@ -7,6 +7,7 @@ Version 0.16
------------
(bugfix release, released on X)
- Improve handling of systems with improperly configured file system encoding (#289)
- Fix "All archives" output for attic info. (#183)
- More user friendly error message when repository key file is not found (#236)
- Fix parsing of iso 8601 timestamps with zero microseconds (#282)

View File

@ -119,6 +119,10 @@ class Archive:
class AlreadyExists(Error):
"""Archive {} already exists"""
class IncompatibleFilesystemEncodingError(Error):
"""Failed to encode filename "{}" into file system encoding "{}". Consider configuring the LANG environment variable."""
def __init__(self, repository, key, manifest, name, cache=None, create=False,
checkpoint_interval=300, numeric_owner=False):
self.cwd = os.getcwd()
@ -247,6 +251,8 @@ class Archive:
os.rmdir(path)
else:
os.unlink(path)
except UnicodeEncodeError:
raise self.IncompatibleFilesystemEncodingError(path, sys.getfilesystemencoding())
except OSError:
pass
mode = item[b'mode']

View File

@ -188,6 +188,8 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
def do_extract(self, args):
"""Extract archive contents"""
# be restrictive when restoring files, restore permissions later
if sys.getfilesystemencoding() == 'ascii':
print('Warning: File system encoding is "ascii", extracting non-ascii filenames will not be supported.')
os.umask(0o077)
repository = self.open_repository(args.archive)
manifest, key = Manifest.load(repository)