package healthcheck import ( "bufio" "fmt" "log/slog" "os" "path/filepath" "strings" "unicode" "github.com/go-git/go-billy/v5/memfs" "github.com/go-git/go-git/v5/plumbing/format/gitattributes" ) // getNonAscii retrieves a list of files in the specified root directory that contain non-ASCII characters. // It searches for non-ASCII characters in each file's content and returns a list of paths to files containing non-ASCII characters. func getNonAscii(root string) ([]string, error) { var nonAscii []string fs := memfs.New() rootPath := []string{"./"} var emptyStr []string attribute, err := gitattributes.ReadPatterns(fs, rootPath) if err != nil { return nil, err } matcher := gitattributes.NewMatcher(attribute) err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { if info.Name() == ".git" || info.Name() == ".gitea" { return filepath.SkipDir } else { return nil } } if info.Name() == "healthcheck" { return nil } if _, ret := matcher.Match(rootPath, append(emptyStr, info.Name())); ret { return nil } file, err := os.Open(path) if err != nil { return err } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { cont := true for _, c := range scanner.Text() { if c > unicode.MaxASCII { nonAscii = append(nonAscii, "\t"+path) cont = false break } } if !cont { break } } return nil }) return nonAscii, err } // nonAsciiFiles checks for non-ASCII characters in files within the specified root directory. // It prints a message with the paths to files containing non-ASCII characters, if any. func NonAsciiFiles(root string) error { nonAscii, err := getNonAscii(root) if err != nil { slog.Error("getting non-ascii", "err", err) return fmt.Errorf("error getting non-ascii: %w", err) } if len(nonAscii) > 0 { return fmt.Errorf("Non-ASCII characters found in the following files:\n%s", strings.Join(nonAscii, "\n")) } return nil }