Browse Source

Improve handling of systems with improperly configured file system encoding

Closes #289
Jonas Borgström 10 năm trước cách đây
mục cha
commit
64e8ea72ac
3 tập tin đã thay đổi với 9 bổ sung0 xóa
  1. 1 0
      CHANGES
  2. 6 0
      attic/archive.py
  3. 2 0
      attic/archiver.py

+ 1 - 0
CHANGES

@@ -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)

+ 6 - 0
attic/archive.py

@@ -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']

+ 2 - 0
attic/archiver.py

@@ -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)