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

list: only load cache if needed
This commit is contained in:
enkore 2017-03-02 09:54:44 +01:00 committed by GitHub
commit f98151dbd8
2 changed files with 25 additions and 7 deletions

View File

@ -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):

View File

@ -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