Skip to content
This repository was archived by the owner on Aug 12, 2025. It is now read-only.

Commit 9976abf

Browse files
committed
Fix weekly and yearly retention policies
Closes #13
1 parent 3560e77 commit 9976abf

File tree

1 file changed

+45
-4
lines changed

1 file changed

+45
-4
lines changed

src/commands/prune/find_snapshots_to_keep.rs

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ pub fn find_snapshots_to_keep<'a>(
88
const PATTERNS: &[(&str, &str)] = &[
99
("hourly", "%Y-%m-%d %H"),
1010
("daily", "%Y-%m-%d"),
11-
("weekly", "%Y-%m-%U"),
11+
("weekly", "%Y-%U"),
1212
("monthly", "%Y-%m"),
13-
("yearly", "%Y-%m"),
13+
("yearly", "%Y"),
1414
("last", "%s"),
1515
];
1616

@@ -32,7 +32,11 @@ pub fn find_snapshots_to_keep<'a>(
3232
}
3333

3434
for (pattern_name, pattern_format) in PATTERNS {
35-
let snapshot_date = format!("{}", snapshot.created_at.format(pattern_format));
35+
let snapshot_date = format!(
36+
"{}.{}",
37+
pattern_name,
38+
snapshot.created_at.format(pattern_format)
39+
);
3640

3741
if !alive_dates.contains(&snapshot_date) {
3842
let keep = match *pattern_name {
@@ -222,6 +226,43 @@ mod tests {
222226
test(policy, snapshots, expected);
223227
}
224228

229+
#[test]
230+
fn keep_daily_and_weekly_and_monthly() {
231+
let policy = Policy {
232+
keep_daily: Some(6),
233+
keep_weekly: Some(2),
234+
keep_monthly: Some(1),
235+
..Default::default()
236+
};
237+
238+
let snapshots = vec![
239+
snapshot("snap-10", "2024-08-03 22:00:03"),
240+
snapshot("snap-9", "2024-08-02 22:00:03"),
241+
snapshot("snap-8", "2024-08-01 22:00:04"),
242+
snapshot("snap-7", "2024-07-31 22:00:03"),
243+
snapshot("snap-6", "2024-07-30 22:00:04"),
244+
snapshot("snap-5", "2024-07-29 22:00:04"),
245+
snapshot("snap-4", "2024-07-28 22:00:04"),
246+
snapshot("snap-3", "2024-07-27 22:00:04"),
247+
snapshot("snap-2", "2024-06-30 22:00:03"),
248+
snapshot("snap-1", "2024-05-31 22:00:02"),
249+
];
250+
251+
let expected = vec![
252+
"snap-10", // via keep-daily
253+
"snap-9", // via keep-daily
254+
"snap-8", // via keep-daily
255+
"snap-7", // via keep-daily
256+
"snap-6", // via keep-daily
257+
"snap-5", // via keep-daily
258+
"snap-4", // via keep-weekly (30th week)
259+
"snap-3", // via keep-monthly
260+
"snap-2", // via keep-weekly (26th week)
261+
];
262+
263+
test(policy, snapshots, expected);
264+
}
265+
225266
#[test]
226267
fn keep_yearly() {
227268
let policy = Policy {
@@ -231,7 +272,7 @@ mod tests {
231272

232273
let snapshots = vec![
233274
snapshot("snap-6", "2000-06-10 00:00:00"),
234-
snapshot("snap-5", "2000-06-10 00:00:00"),
275+
snapshot("snap-5", "2000-05-10 00:00:00"),
235276
snapshot("snap-4", "1999-06-10 00:00:00"),
236277
snapshot("snap-3", "1999-06-10 00:00:00"),
237278
snapshot("snap-2", "1998-06-10 00:00:00"),

0 commit comments

Comments
 (0)