in internal/platform/commoncontext/configurator.go [58:142]
func recognizeDirLanguages(projectPath string) ([]string, error) {
const limitKb = 64
out := make(map[string]int)
err := filepath.Walk(
projectPath, func(path string, f os.FileInfo, err error) error {
if err != nil {
return filepath.SkipDir
}
if f.Mode().IsDir() && !f.Mode().IsRegular() {
return nil
}
relpath, err := filepath.Rel(projectPath, path)
relpath = filepath.ToSlash(relpath) // enry always uses forward slashes for regex matching
if err != nil {
return nil
}
if relpath == "." {
return nil
}
if f.IsDir() {
relpath += "/"
}
if isInIgnoredDirectory(path) || enry.IsVendor(relpath) || enry.IsDotFile(relpath) ||
enry.IsDocumentation(relpath) || enry.IsConfiguration(relpath) ||
enry.IsGenerated(relpath, nil) {
if f.IsDir() {
return filepath.SkipDir
}
return nil
}
if f.IsDir() {
return nil
}
content, err := readFile(path, limitKb)
if err != nil {
return nil
}
if enry.IsGenerated(relpath, content) {
return nil
}
language := enry.GetLanguage(filepath.Base(path), content)
if language == enry.OtherLanguage {
return nil
}
if enry.GetLanguageType(language) != enry.Programming {
return nil
}
out[language] += 1
return nil
},
)
if err != nil {
return nil, err
}
type languageCount struct {
Language string
Count int
}
langCounts := make([]languageCount, 0, len(out))
for language, count := range out {
langCounts = append(langCounts, languageCount{Language: language, Count: count})
}
sort.Slice(
langCounts, func(i, j int) bool {
return langCounts[i].Count > langCounts[j].Count
},
)
languages := make([]string, 0, len(langCounts))
for _, langCount := range langCounts {
languages = append(languages, langCount.Language)
}
slices.Sort(languages)
return languages, nil
}