1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2024-12-25 09:19:31 +00:00

Initial implementation of subcommand "purge"

This commit is contained in:
Jonas Borgström 2011-08-06 23:33:06 +02:00
parent bf08c09dcc
commit 5443441e3f
2 changed files with 61 additions and 4 deletions

View file

@ -334,9 +334,9 @@ def process_file(self, path, st, cache):
self.add_item(item)
@staticmethod
def list_archives(store, key):
def list_archives(store, key, cache=None):
for id in list(store.list(NS_ARCHIVE_METADATA)):
archive = Archive(store, key)
archive = Archive(store, key, cache=cache)
archive.load(id)
yield archive

View file

@ -1,5 +1,5 @@
import argparse
from datetime import datetime
from datetime import datetime, date, timedelta
from operator import attrgetter
import os
import stat
@ -217,6 +217,48 @@ def do_info(self, args):
print 'Unique data:', format_file_size(stats['usize'])
return self.exit_code
def do_purge(self, args):
store = self.open_store(args.store)
key = Key(store)
cache = Cache(store, key)
archives = list(sorted(Archive.list_archives(store, key, cache),
key=attrgetter('ts'), reverse=True))
num_daily = args.daily
num_weekly = args.weekly
num_monthly = args.monthly
if args.daily + args.weekly + args.monthly == 0:
self.print_error('At least one of the "daily", "weekly", "monthly" '
'settings must be specified')
return 1
t0 = date.today() + timedelta(days=1) # Tomorrow
daily = weekly = monthly = 0
for archive in archives:
t = archive.ts.date()
if daily < args.daily and t < t0:
daily += 1
self.print_verbose('Archive "%s" is daily archive number %d',
archive.metadata['name'], daily)
t0 = t
elif weekly < args.weekly and t < t0 and t.weekday() == 1:
weekly += 1
self.print_verbose('Archive "%s" is weekly archive number %d',
archive.metadata['name'], weekly)
t0 = t
elif monthly < args.monthly and t < t0 and t.day == 1:
num_weekly += 1
self.print_verbose('Archive "%s" is monthly archive number %d',
archive.metadata['name'], monthly)
t0 = t
else:
self.print_verbose('Purging archive %s', archive.metadata['name'])
if args.really:
archive.delete(cache)
else:
print ('Archive "%s" marked for deletion. '
'Use the "--really" option to actually delete it'
% archive.metadata['name'])
return self.exit_code
def run(self, args=None):
dot_path = os.path.join(os.path.expanduser('~'), '.darc')
if not os.path.exists(dot_path):
@ -298,6 +340,21 @@ def run(self, args=None):
type=location_validator(archive=True),
help='Archive to display information about')
subparser = subparsers.add_parser('purge')
subparser.set_defaults(func=self.do_purge)
subparser.add_argument('-d', '--daily', dest='daily', type=int, default=0,
help='Number of daily archives to keep')
subparser.add_argument('-w', '--weekly', dest='weekly', type=int, default=0,
help='Number of daily archives to keep')
subparser.add_argument('-m', '--monthly', dest='monthly', type=int, default=0,
help='Number of monthly archives to keep')
subparser.add_argument('-r', '--really', dest='really',
action='store_true', default=False,
help='Actually delete archives')
subparser.add_argument('store', metavar='STORE',
type=location_validator(archive=False),
help='Store to purge')
args = parser.parse_args(args)
self.verbose = args.verbose
return args.func(args)