package utils import ( "bufio" "fmt" "io" "math" "os" "os/exec" dio "github.com/aquasecurity/go-dep-parser/pkg/io" ) var ( PathSeparator = fmt.Sprintf("%c", os.PathSeparator) ) func CacheDir() string { cacheDir, err := os.UserCacheDir() if err != nil { cacheDir = os.TempDir() } return cacheDir } func StringInSlice(a string, list []string) bool { for _, b := range list { if b == a { return true } } return false } func IsCommandAvailable(name string) bool { if _, err := exec.LookPath(name); err != nil { return false } return true } func IsGzip(f *bufio.Reader) bool { buf, err := f.Peek(3) if err != nil { return false } return buf[0] == 0x1F && buf[1] == 0x8B && buf[2] == 0x8 } func Keys(m map[string]struct{}) []string { var keys []string for k := range m { keys = append(keys, k) } return keys } func IsExecutable(fileInfo os.FileInfo) bool { mode := fileInfo.Mode() if !mode.IsRegular() { return false } // Check unpackaged file if mode.Perm()&0111 != 0 { return true } return false } func IsBinary(content dio.ReadSeekerAt, fileSize int64) (bool, error) { headSize := int(math.Min(float64(fileSize), 300)) head := make([]byte, headSize) if _, err := content.Read(head); err != nil { return false, err } if _, err := content.Seek(0, io.SeekStart); err != nil { return false, err } // cf. https://github.com/file/file/blob/f2a6e7cb7db9b5fd86100403df6b2f830c7f22ba/src/encoding.c#L151-L228 for _, b := range head { if b < 7 || b == 11 || (13 < b && b < 27) || (27 < b && b < 0x20) || b == 0x7f { return true, nil } } return false, nil }