diff --git a/borg/archive.py b/borg/archive.py index 91a15019d..178ad94b8 100644 --- a/borg/archive.py +++ b/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: