Forráskód Böngészése

Make purge selection more stable and logic

Jonas Borgström 14 éve
szülő
commit
143a393750
2 módosított fájl, 16 hozzáadás és 28 törlés
  1. 11 19
      darc/archiver.py
  2. 5 9
      darc/helpers.py

+ 11 - 19
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
-
-        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 += purge_split(archives, '%Y', args.weekly, keep)
+
+        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)

+ 5 - 9
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):