mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-12-14 12:36:30 +00:00
c28f7cb29f
Initial part of #435
67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package fsutils
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"sync"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/golangci/golangci-lint/pkg/logutils"
|
|
)
|
|
|
|
type FileCache struct {
|
|
files sync.Map
|
|
}
|
|
|
|
func NewFileCache() *FileCache {
|
|
return &FileCache{}
|
|
}
|
|
|
|
func (fc *FileCache) GetFileBytes(filePath string) ([]byte, error) {
|
|
cachedBytes, ok := fc.files.Load(filePath)
|
|
if ok {
|
|
return cachedBytes.([]byte), nil
|
|
}
|
|
|
|
fileBytes, err := ioutil.ReadFile(filePath)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "can't read file %s", filePath)
|
|
}
|
|
|
|
fc.files.Store(filePath, fileBytes)
|
|
return fileBytes, nil
|
|
}
|
|
|
|
func PrettifyBytesCount(n int64) string {
|
|
const (
|
|
Multiplexer = 1024
|
|
KiB = 1 * Multiplexer
|
|
MiB = KiB * Multiplexer
|
|
GiB = MiB * Multiplexer
|
|
)
|
|
|
|
if n >= GiB {
|
|
return fmt.Sprintf("%.1fGiB", float64(n)/GiB)
|
|
}
|
|
if n >= MiB {
|
|
return fmt.Sprintf("%.1fMiB", float64(n)/MiB)
|
|
}
|
|
if n >= KiB {
|
|
return fmt.Sprintf("%.1fKiB", float64(n)/KiB)
|
|
}
|
|
return fmt.Sprintf("%dB", n)
|
|
}
|
|
|
|
func (fc *FileCache) PrintStats(log logutils.Log) {
|
|
var size int64
|
|
var mapLen int
|
|
fc.files.Range(func(_, fileBytes interface{}) bool {
|
|
mapLen++
|
|
size += int64(len(fileBytes.([]byte)))
|
|
|
|
return true
|
|
})
|
|
|
|
log.Infof("File cache stats: %d entries of total size %s", mapLen, PrettifyBytesCount(size))
|
|
}
|