package fileops import ( "os" "path/filepath" "runtime" "testing" "time" ) func TestPruneBackupsPreservesNewestAndNonRegularEntries(t *testing.T) { dir := t.TempDir() for index, name := range []string{"old.bak", "new.bak"} { path := filepath.Join(dir, name) if err := os.WriteFile(path, []byte(name), 0o600); err != nil { t.Fatal(err) } stamp := time.Unix(int64(index), 0) if err := os.Chtimes(path, stamp, stamp); err != nil { t.Fatal(err) } } if err := os.Mkdir(filepath.Join(dir, "directory.bak"), 0o700); err != nil { t.Fatal(err) } if runtime.GOOS != "windows" { if err := os.Symlink("old.bak", filepath.Join(dir, "symlink.bak")); err != nil { t.Fatal(err) } } if err := PruneBackups(dir, "*.bak", 1); err != nil { t.Fatal(err) } if _, err := os.Lstat(filepath.Join(dir, "old.bak")); !os.IsNotExist(err) { t.Fatalf("old backup survived: %v", err) } for _, name := range []string{"new.bak", "directory.bak"} { if _, err := os.Lstat(filepath.Join(dir, name)); err != nil { t.Fatal(err) } } if runtime.GOOS != "windows" { if _, err := os.Lstat(filepath.Join(dir, "symlink.bak")); err != nil { t.Fatal(err) } } if err := PruneBackups(dir, "*.bak", -1); err == nil { t.Fatal("negative retention accepted") } } func TestPruneBackupsTreatsBracketDirectoriesLiterally(t *testing.T) { for _, name := range []string{"MPV [test", "MPV [test]"} { t.Run(name, func(t *testing.T) { dir := filepath.Join(t.TempDir(), name) if err := os.Mkdir(dir, 0o700); err != nil { t.Fatal(err) } for index, name := range []string{"first.bak", "second.bak"} { path := filepath.Join(dir, name) if err := os.WriteFile(path, []byte(name), 0o600); err != nil { t.Fatal(err) } stamp := time.Unix(int64(index), 0) if err := os.Chtimes(path, stamp, stamp); err != nil { t.Fatal(err) } } if err := PruneBackups(dir, "*.bak", 1); err != nil { t.Fatal(err) } if _, err := os.Lstat(filepath.Join(dir, "first.bak")); !os.IsNotExist(err) { t.Fatalf("first retained: %v", err) } if _, err := os.Lstat(filepath.Join(dir, "second.bak")); err != nil { t.Fatal(err) } }) } }