helpers/archives/path_error_tracker.go (28 lines of code) (raw):
package archives
import (
"os"
"sync"
)
// When extracting an archive, the same PathError.Op may be repeated for every
// file in the archive; use pathErrorTracker to suppress repetitious log output
type pathErrorTracker struct {
sync.Mutex
seenOps map[string]bool
}
// check whether the error is actionable, which is to say, not nil and either
// not a PathError, or a novel PathError
func (p *pathErrorTracker) actionable(e error) bool {
pathErr, isPathErr := e.(*os.PathError)
if e == nil || isPathErr && pathErr == nil {
return false
}
if !isPathErr {
return true
}
p.Lock()
defer p.Unlock()
seen := p.seenOps[pathErr.Op]
p.seenOps[pathErr.Op] = true
// actionable if *not* seen before
return !seen
}
func newPathErrorTracker() *pathErrorTracker {
return &pathErrorTracker{
seenOps: make(map[string]bool),
}
}