65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package fsutils
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
|
|
"github.com/golangci/golangci-lint/pkg/logutils"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type FileCache struct {
|
|
files map[string][]byte
|
|
}
|
|
|
|
func NewFileCache() *FileCache {
|
|
return &FileCache{
|
|
files: map[string][]byte{},
|
|
}
|
|
}
|
|
|
|
func (fc *FileCache) GetFileBytes(filePath string) ([]byte, error) {
|
|
cachedBytes := fc.files[filePath]
|
|
if cachedBytes != nil {
|
|
return cachedBytes, nil
|
|
}
|
|
|
|
fileBytes, err := ioutil.ReadFile(filePath)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "can't read file %s", filePath)
|
|
}
|
|
|
|
fc.files[filePath] = fileBytes
|
|
return fileBytes, nil
|
|
}
|
|
|
|
func prettifyBytesCount(n int) 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 int
|
|
for _, fileBytes := range fc.files {
|
|
size += len(fileBytes)
|
|
}
|
|
|
|
log.Infof("File cache stats: %d entries of total size %s", len(fc.files), prettifyBytesCount(size))
|
|
}
|