diff --git a/internal/storage/local/local.go b/internal/storage/local/local.go index 8e59dcc1..174eefd5 100644 --- a/internal/storage/local/local.go +++ b/internal/storage/local/local.go @@ -96,7 +96,7 @@ func (b *localStorage) Prune(deadline time.Time, pruningPrefix string) (*storage ) } - if fi.Mode()&os.ModeSymlink != os.ModeSymlink { + if !fi.IsDir() && fi.Mode()&os.ModeSymlink != os.ModeSymlink { candidates = append(candidates, candidate) } } diff --git a/internal/storage/ssh/ssh.go b/internal/storage/ssh/ssh.go index fcdea453..369fb558 100644 --- a/internal/storage/ssh/ssh.go +++ b/internal/storage/ssh/ssh.go @@ -163,21 +163,24 @@ func (b *sshStorage) Prune(deadline time.Time, pruningPrefix string) (*storage.P } var matches []string + var numCandidates int for _, candidate := range candidates { - if !strings.HasPrefix(candidate.Name(), pruningPrefix) { + if candidate.IsDir() || !strings.HasPrefix(candidate.Name(), pruningPrefix) { continue } + + numCandidates++ if candidate.ModTime().Before(deadline) { matches = append(matches, candidate.Name()) } } stats := &storage.PruneStats{ - Total: uint(len(candidates)), + Total: uint(numCandidates), Pruned: uint(len(matches)), } - pruneErr := b.DoPrune(b.Name(), len(matches), len(candidates), deadline, func() error { + pruneErr := b.DoPrune(b.Name(), len(matches), numCandidates, deadline, func() error { for _, match := range matches { if err := b.sftpClient.Remove(path.Join(b.DestinationPath, match)); err != nil { return errwrap.Wrap(err, "error removing file") diff --git a/internal/storage/webdav/webdav.go b/internal/storage/webdav/webdav.go index f655caaf..0924e915 100644 --- a/internal/storage/webdav/webdav.go +++ b/internal/storage/webdav/webdav.go @@ -90,24 +90,25 @@ func (b *webDavStorage) Prune(deadline time.Time, pruningPrefix string) (*storag if err != nil { return nil, errwrap.Wrap(err, "error looking up candidates from remote storage") } + var matches []fs.FileInfo - var lenCandidates int + var numCandidates int for _, candidate := range candidates { - if !strings.HasPrefix(candidate.Name(), pruningPrefix) { + if candidate.IsDir() || !strings.HasPrefix(candidate.Name(), pruningPrefix) { continue } - lenCandidates++ + numCandidates++ if candidate.ModTime().Before(deadline) { matches = append(matches, candidate) } } stats := &storage.PruneStats{ - Total: uint(lenCandidates), + Total: uint(numCandidates), Pruned: uint(len(matches)), } - pruneErr := b.DoPrune(b.Name(), len(matches), lenCandidates, deadline, func() error { + pruneErr := b.DoPrune(b.Name(), len(matches), numCandidates, deadline, func() error { for _, match := range matches { if err := b.client.Remove(path.Join(b.DestinationPath, match.Name())); err != nil { return errwrap.Wrap(err, "error removing file")