package gio import ( "crypto/sha256" "encoding/hex" "fmt" "io" "io/fs" "os" ) // EqualFiles returns true if both files sha256sums and their modes are equal. func EqualFiles(a, b string) (bool, error) { am, as, err := sha256sum(a) if err != nil { return false, fmt.Errorf("could not hash %s: %w", a, err) } bm, bs, err := sha256sum(b) if err != nil { return false, fmt.Errorf("could not hash %s: %w", b, err) } return as == bs && am == bm, nil } // EqualFileContents returns true if both files contents are equal. func EqualFileContents(a, b string) (bool, error) { _, as, err := sha256sum(a) if err != nil { return false, fmt.Errorf("could not hash %s: %w", a, err) } _, bs, err := sha256sum(b) if err != nil { return false, fmt.Errorf("could not hash %s: %w", b, err) } return as == bs, nil } func sha256sum(path string) (fs.FileMode, string, error) { f, err := os.Open(path) if err != nil { return 0, "", err } defer f.Close() h := sha256.New() if _, err := io.Copy(h, f); err != nil { return 0, "", err } st, err := f.Stat() if err != nil { return 0, "", err } return st.Mode(), hex.EncodeToString(h.Sum(nil)), nil }