mirror of
https://github.com/borgbackup/borg.git
synced 2025-02-22 14:11:27 +00:00
Make purge selection more stable and logic
This commit is contained in:
parent
bb7b64ab8d
commit
143a393750
2 changed files with 15 additions and 27 deletions
|
@ -235,35 +235,27 @@ def do_purge(self, args):
|
||||||
cache = Cache(store, key)
|
cache = Cache(store, key)
|
||||||
archives = list(sorted(Archive.list_archives(store, key, cache),
|
archives = list(sorted(Archive.list_archives(store, key, cache),
|
||||||
key=attrgetter('ts'), reverse=True))
|
key=attrgetter('ts'), reverse=True))
|
||||||
daily = []
|
|
||||||
weekly = []
|
|
||||||
monthly = []
|
|
||||||
yearly = []
|
|
||||||
if args.daily + args.weekly + args.monthly + args.yearly == 0:
|
if args.daily + args.weekly + args.monthly + args.yearly == 0:
|
||||||
self.print_error('At least one of the "daily", "weekly", "monthly" or "yearly" '
|
self.print_error('At least one of the "daily", "weekly", "monthly" or "yearly" '
|
||||||
'settings must be specified')
|
'settings must be specified')
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if args.prefix:
|
if args.prefix:
|
||||||
archives = [archive for archive in archives if archive.name.startswith(args.prefix)]
|
archives = [archive for archive in archives if archive.name.startswith(args.prefix)]
|
||||||
|
keep = []
|
||||||
if args.daily:
|
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:
|
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:
|
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:
|
if args.yearly:
|
||||||
yearly, archives = purge_split(archives, '%Y', args.weekly, reverse=True)
|
keep += purge_split(archives, '%Y', args.weekly, keep)
|
||||||
to_delete = archives
|
|
||||||
|
|
||||||
for i, archive in enumerate(daily):
|
keep.sort(key=attrgetter('ts'), reverse=True)
|
||||||
self.print_verbose('Keeping "%s" as daily archive %d' % (archive.name, i + 1))
|
to_delete = [a for a in archives if a not in keep]
|
||||||
for i, archive in enumerate(weekly):
|
|
||||||
self.print_verbose('Keeping "%s" as weekly archive %d' % (archive.name, i + 1))
|
for archive in keep:
|
||||||
for i, archive in enumerate(monthly):
|
self.print_verbose('Keeping archive "%s"' % archive.name)
|
||||||
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))
|
|
||||||
for archive in to_delete:
|
for archive in to_delete:
|
||||||
if args.really:
|
if args.really:
|
||||||
self.print_verbose('Purging archive "%s"', archive.name)
|
self.print_verbose('Purging archive "%s"', archive.name)
|
||||||
|
|
|
@ -13,23 +13,19 @@
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
|
|
||||||
def purge_split(archives, pattern, n, reverse=False):
|
def purge_split(archives, pattern, n, skip=[]):
|
||||||
items = {}
|
items = {}
|
||||||
keep = []
|
keep = []
|
||||||
delete = []
|
|
||||||
for a in archives:
|
for a in archives:
|
||||||
key = to_localtime(a.ts).strftime(pattern)
|
key = to_localtime(a.ts).strftime(pattern)
|
||||||
items.setdefault(key, [])
|
items.setdefault(key, [])
|
||||||
items[key].append(a)
|
items[key].append(a)
|
||||||
for key, values in sorted(items.items(), reverse=reverse):
|
for key, values in sorted(items.items(), reverse=True):
|
||||||
if n:
|
if n and values[0] not in skip:
|
||||||
values.sort(key=attrgetter('ts'), reverse=reverse)
|
values.sort(key=attrgetter('ts'), reverse=True)
|
||||||
keep.append(values[0])
|
keep.append(values[0])
|
||||||
delete += values[1:]
|
|
||||||
n -= 1
|
n -= 1
|
||||||
else:
|
return keep
|
||||||
delete += values
|
|
||||||
return keep, delete
|
|
||||||
|
|
||||||
|
|
||||||
class Statistics(object):
|
class Statistics(object):
|
||||||
|
|
Loading…
Reference in a new issue