Browse Source

Merge pull request #2244 from enkore/f/list-cache

list: only load cache if needed
enkore 8 năm trước cách đây
mục cha
commit
f98151dbd8
2 tập tin đã thay đổi với 25 bổ sung7 xóa
  1. 16 7
      src/borg/archiver.py
  2. 9 0
      src/borg/helpers.py

+ 16 - 7
src/borg/archiver.py

@@ -1032,21 +1032,30 @@ class Archiver:
 
     def _list_archive(self, args, repository, manifest, key, write):
         matcher, _ = self.build_matcher(args.patterns, args.paths)
-        with Cache(repository, key, manifest, lock_wait=self.lock_wait) as cache:
+        if args.format is not None:
+            format = args.format
+        elif args.short:
+            format = "{path}{NL}"
+        else:
+            format = "{mode} {user:6} {group:6} {size:8} {isomtime} {path}{extra}{NL}"
+
+        def _list_inner(cache):
             archive = Archive(repository, key, manifest, args.location.archive, cache=cache,
                               consider_part_files=args.consider_part_files)
-            if args.format is not None:
-                format = args.format
-            elif args.short:
-                format = "{path}{NL}"
-            else:
-                format = "{mode} {user:6} {group:6} {size:8} {isomtime} {path}{extra}{NL}"
 
             formatter = ItemFormatter(archive, format, json=args.json)
             write(safe_encode(formatter.begin()))
             for item in archive.iter_items(lambda item: matcher.match(item.path)):
                 write(safe_encode(formatter.format_item(item)))
             write(safe_encode(formatter.end()))
+
+        # Only load the cache if it will be used
+        if ItemFormatter.format_needs_cache(format):
+            with Cache(repository, key, manifest, lock_wait=self.lock_wait) as cache:
+                _list_inner(cache)
+        else:
+            _list_inner(cache=None)
+
         return self.exit_code
 
     def _list_repository(self, args, manifest, write):

+ 9 - 0
src/borg/helpers.py

@@ -1617,6 +1617,10 @@ class ItemFormatter(BaseFormatter):
         ('health', )
     )
 
+    KEYS_REQUIRING_CACHE = (
+        'dsize', 'dcsize', 'unique_chunks',
+    )
+
     @classmethod
     def available_keys(cls):
         class FakeArchive:
@@ -1648,6 +1652,11 @@ class ItemFormatter(BaseFormatter):
         assert not keys, str(keys)
         return "\n".join(help)
 
+    @classmethod
+    def format_needs_cache(cls, format):
+        format_keys = {f[1] for f in Formatter().parse(format)}
+        return any(key in cls.KEYS_REQUIRING_CACHE for key in format_keys)
+
     def __init__(self, archive, format, *, json=False):
         self.archive = archive
         self.json = json