Przeglądaj źródła

Merge pull request #2358 from ThomasWaldmann/refactor-extract-1.0

extract: small bugfix and refactoring for parent dir creation
enkore 8 lat temu
rodzic
commit
50b4c9f2f9
1 zmienionych plików z 13 dodań i 12 usunięć
  1. 13 12
      borg/archive.py

+ 13 - 12
borg/archive.py

@@ -389,17 +389,20 @@ Number of files: {0.stats.nfiles}'''.format(
             raise self.IncompatibleFilesystemEncodingError(path, sys.getfilesystemencoding()) from None
         except OSError:
             pass
+
+        def make_parent(path):
+            parent_dir = os.path.dirname(path)
+            if not os.path.exists(parent_dir):
+                os.makedirs(parent_dir)
+
         mode = item[b'mode']
         if stat.S_ISREG(mode):
-            if not os.path.exists(os.path.dirname(path)):
-                with backup_io():
-                    os.makedirs(os.path.dirname(path))
+            with backup_io():
+                make_parent(path)
             # Hard link?
             if b'source' in item:
                 source = os.path.join(dest, item[b'source'])
                 with backup_io():
-                    if os.path.exists(path):
-                        os.unlink(path)
                     os.link(source, path)
             else:
                 with backup_io():
@@ -425,27 +428,25 @@ Number of files: {0.stats.nfiles}'''.format(
         with backup_io():
             # No repository access beyond this point.
             if stat.S_ISDIR(mode):
+                make_parent(path)
                 if not os.path.exists(path):
-                    os.makedirs(path)
+                    os.mkdir(path)
                 if restore_attrs:
                     self.restore_attrs(path, item)
             elif stat.S_ISLNK(mode):
-                if not os.path.exists(os.path.dirname(path)):
-                    os.makedirs(os.path.dirname(path))
+                make_parent(path)
                 source = item[b'source']
-                if os.path.exists(path):
-                    os.unlink(path)
                 try:
                     os.symlink(source, path)
                 except UnicodeEncodeError:
                     raise self.IncompatibleFilesystemEncodingError(source, sys.getfilesystemencoding()) from None
                 self.restore_attrs(path, item, symlink=True)
             elif stat.S_ISFIFO(mode):
-                if not os.path.exists(os.path.dirname(path)):
-                    os.makedirs(os.path.dirname(path))
+                make_parent(path)
                 os.mkfifo(path)
                 self.restore_attrs(path, item)
             elif stat.S_ISCHR(mode) or stat.S_ISBLK(mode):
+                make_parent(path)
                 os.mknod(path, item[b'mode'], item[b'rdev'])
                 self.restore_attrs(path, item)
             else: