"""
# end of bup preamble
-from __future__ import print_function
+from __future__ import absolute_import, print_function
from collections import defaultdict
from itertools import groupby
from sys import stderr
from bup import git, options
from bup.gc import bup_gc
from bup.helpers import die_if_errors, log, partition, period_as_secs
+from bup.repo import LocalRepo
from bup.rm import bup_rm
def branches(refnames=()):
- return ((name[11:], sha) for (name,sha)
- in git.list_refs(refnames=('refs/heads/' + n for n in refnames),
+ return ((name[11:], sha.encode('hex')) for (name,sha)
+ in git.list_refs(patterns=('refs/heads/' + n for n in refnames),
limit_to_heads=True))
def save_name(branch, utc):
(period_start['monthlies'], lambda s: localtime(s[0]).tm_mon),
(period_start['yearlies'], lambda s: localtime(s[0]).tm_year))
- # Foreach period, seek back from now to the period's starting time, and
- # collect the most recent saves
+ # Break the decreasing utc sorted saves up into the respective
+ # period ranges (dailies, monthlies, ...). Within each range,
+ # group the saves by the period scale (days, months, ...), and
+ # then yield a "keep" action (True, utc) for the newest save in
+ # each group, and a "drop" action (False, utc) for the rest.
for pstart, time_region_id in tm_ranges:
matches, rest = partition(lambda s: s[0] >= pstart, rest)
for region_id, region_saves in groupby(matches, time_region_id):
for action in retain_newest_in_region(list(region_saves)):
yield action
+ # Finally, drop any saves older than the specified periods
for save in rest:
yield False, save
# This could be more efficient, but for now just build the whole list
# in memory and let bup_rm() do some redundant work.
+def parse_info(f):
+ author_secs = f.readline().strip()
+ return int(author_secs)
+
removals = []
for branch, branch_id in branches(roots):
die_if_errors()
- saves = git.rev_list(branch_id.encode('hex'))
+ saves = ((utc, oidx.decode('hex')) for (oidx, utc) in
+ git.rev_list(branch_id, format='%at', parse=parse_info))
for keep_save, (utc, id) in classify_saves(saves, period_start):
assert(keep_save in (False, True))
# FIXME: base removals on hashes
if not opt.pretend:
die_if_errors()
- bup_rm(removals, compression=opt.compress, verbosity=opt.verbose)
+ repo = LocalRepo()
+ bup_rm(repo, removals, compression=opt.compress, verbosity=opt.verbose)
if opt.gc:
die_if_errors()
bup_gc(threshold=opt.gc_threshold,