Make purge selection more stable and logic

This commit is contained in:
Jonas Borgström 2011-08-16 22:02:42 +02:00
parent bb7b64ab8d
commit 143a393750
2 changed files with 15 additions and 27 deletions

View File

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

View File

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