From d4e27e2952888d547c54d5b0f4be22892aa9e2f1 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 28 Mar 2017 23:22:25 +0200 Subject: [PATCH] extract: small bugfix and refactoring for parent dir creation make_parent(path) helper to reduce code duplication. also use it for directories although makedirs can also do it. bugfix: also create parent dir for device files, if needed. --- src/borg/archive.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index 6070f3d5b..c24c9faef 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -559,11 +559,16 @@ Utilization of max. archive size: {csize_max:.0%} 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.mode if stat.S_ISREG(mode): with backup_io('makedirs'): - if not os.path.exists(os.path.dirname(path)): - os.makedirs(os.path.dirname(path)) + make_parent(path) # Hard link? if 'source' in item: source = os.path.join(dest, *item.source.split(os.sep)[stripped_components:]) @@ -615,13 +620,13 @@ Utilization of max. archive size: {csize_max:.0%} 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.source if os.path.exists(path): os.unlink(path) @@ -631,11 +636,11 @@ Utilization of max. archive size: {csize_max:.0%} 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.mode, item.rdev) self.restore_attrs(path, item) else: