Browse Source

Merge pull request #6025 from amikula/issue_6015

Handle case of calling prune_split when there are no archives, #6015
TW 3 years ago
parent
commit
450ab38e42
2 changed files with 16 additions and 1 deletions
  1. 3 1
      src/borg/helpers/misc.py
  2. 13 0
      src/borg/testsuite/helpers.py

+ 3 - 1
src/borg/helpers/misc.py

@@ -49,6 +49,8 @@ def prune_split(archives, rule, n, kept_because=None):
         kept_because = {}
     if n == 0:
         return keep
+
+    a = None
     for a in sorted(archives, key=attrgetter('ts'), reverse=True):
         period = to_localtime(a.ts).strftime(pattern)
         if period != last:
@@ -59,7 +61,7 @@ def prune_split(archives, rule, n, kept_because=None):
                 if len(keep) == n:
                     break
     # Keep oldest archive if we didn't reach the target retention count
-    if len(keep) < n and a.id not in kept_because:
+    if a is not None and len(keep) < n and a.id not in kept_because:
         keep.append(a)
         kept_because[a.id] = (rule+"[oldest]", len(keep))
     return keep

+ 13 - 0
src/borg/testsuite/helpers.py

@@ -439,6 +439,19 @@ def test_prune_split_keep_oldest():
     assert kept_because[4][0] == "yearly"
 
 
+def test_prune_split_no_archives():
+    def subset(lst, ids):
+        return {i for i in lst if i.id in ids}
+
+    archives = []
+
+    kept_because = {}
+    keep = prune_split(archives, "yearly", 3, kept_because)
+
+    assert keep == []
+    assert kept_because == {}
+
+
 class IntervalTestCase(BaseTestCase):
     def test_interval(self):
         self.assert_equal(interval('1H'), 1)