diff --git a/darc/archiver.py b/darc/archiver.py index 0c3fc0066..c41de1ace 100644 --- a/darc/archiver.py +++ b/darc/archiver.py @@ -235,35 +235,27 @@ class Archiver(object): cache = Cache(store, key) archives = list(sorted(Archive.list_archives(store, key, cache), key=attrgetter('ts'), reverse=True)) - daily = [] - weekly = [] - monthly = [] - yearly = [] if args.daily + args.weekly + args.monthly + args.yearly == 0: self.print_error('At least one of the "daily", "weekly", "monthly" or "yearly" ' 'settings must be specified') return 1 - if args.prefix: archives = [archive for archive in archives if archive.name.startswith(args.prefix)] + keep = [] if args.daily: - daily, archives = purge_split(archives, '%Y-%m-%d', args.daily, reverse=True) + keep += purge_split(archives, '%Y-%m-%d', args.daily) if args.weekly: - weekly, archives = purge_split(archives, '%Y-%V', args.weekly, reverse=True) + keep += purge_split(archives, '%Y-%V', args.weekly, keep) if args.monthly: - monthly, archives = purge_split(archives, '%Y-%m', args.monthly, reverse=True) + keep += purge_split(archives, '%Y-%m', args.monthly, keep) if args.yearly: - yearly, archives = purge_split(archives, '%Y', args.weekly, reverse=True) - to_delete = archives + keep += purge_split(archives, '%Y', args.weekly, keep) - for i, archive in enumerate(daily): - self.print_verbose('Keeping "%s" as daily archive %d' % (archive.name, i + 1)) - for i, archive in enumerate(weekly): - self.print_verbose('Keeping "%s" as weekly archive %d' % (archive.name, i + 1)) - for i, archive in enumerate(monthly): - self.print_verbose('Keeping "%s" as monthly archive %d' % (archive.name, i + 1)) - for i, archive in enumerate(yearly): - self.print_verbose('Keeping "%s" as yearly archive %d' % (archive.name, i + 1)) + keep.sort(key=attrgetter('ts'), reverse=True) + to_delete = [a for a in archives if a not in keep] + + for archive in keep: + self.print_verbose('Keeping archive "%s"' % archive.name) for archive in to_delete: if args.really: self.print_verbose('Purging archive "%s"', archive.name) diff --git a/darc/helpers.py b/darc/helpers.py index 048cfd539..f115491f8 100644 --- a/darc/helpers.py +++ b/darc/helpers.py @@ -13,23 +13,19 @@ import time import urllib -def purge_split(archives, pattern, n, reverse=False): +def purge_split(archives, pattern, n, skip=[]): items = {} keep = [] - delete = [] for a in archives: key = to_localtime(a.ts).strftime(pattern) items.setdefault(key, []) items[key].append(a) - for key, values in sorted(items.items(), reverse=reverse): - if n: - values.sort(key=attrgetter('ts'), reverse=reverse) + for key, values in sorted(items.items(), reverse=True): + if n and values[0] not in skip: + values.sort(key=attrgetter('ts'), reverse=True) keep.append(values[0]) - delete += values[1:] n -= 1 - else: - delete += values - return keep, delete + return keep class Statistics(object):