golangci-lint/pkg/fsutils/filecache.go
Denis Isaev 3d2dfac47e Support excluding issues by source line regexp
See issues.exclude-rules[i].source.
Also introduced file data and file lines cache.
2019-03-17 15:17:29 +03:00

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))
}