From ceaf4a8fcfdee348428c945617ac77d9623e3cad Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 28 Mar 2017 22:02:54 +0200 Subject: [PATCH 1/2] extract: small bugfix and optimization for hardlink masters if a hardlink master is not in the to-be-extracted subset, the "x" status was not displayed for it. also, the matcher was called twice for matching items. --- src/borg/archive.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index bfc2d533c..6070f3d5b 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -1614,15 +1614,13 @@ class ArchiveRecreater: return (target_is_subset and stat.S_ISREG(item.mode) and item.get('hardlink_master', True) and - 'source' not in item and - not matcher.match(item.path)) + 'source' not in item) for item in archive.iter_items(): - if item_is_hardlink_master(item): - hardlink_masters[item.path] = (item.get('chunks'), None) - continue if not matcher.match(item.path): self.print_file_status('x', item.path) + if item_is_hardlink_master(item): + hardlink_masters[item.path] = (item.get('chunks'), None) continue if target_is_subset and stat.S_ISREG(item.mode) and item.get('source') in hardlink_masters: # master of this hard link is outside the target subset From d4e27e2952888d547c54d5b0f4be22892aa9e2f1 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 28 Mar 2017 23:22:25 +0200 Subject: [PATCH 2/2] 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: