github.com/goreleaser/goreleaser@v1.25.1/internal/gio/hash.go (about) 1 package gio 2 3 import ( 4 "crypto/sha256" 5 "encoding/hex" 6 "fmt" 7 "io" 8 "io/fs" 9 "os" 10 ) 11 12 // EqualFiles returns true if both files sha256sums and their modes are equal. 13 func EqualFiles(a, b string) (bool, error) { 14 am, as, err := sha256sum(a) 15 if err != nil { 16 return false, fmt.Errorf("could not hash %s: %w", a, err) 17 } 18 bm, bs, err := sha256sum(b) 19 if err != nil { 20 return false, fmt.Errorf("could not hash %s: %w", b, err) 21 } 22 return as == bs && am == bm, nil 23 } 24 25 // EqualFileContents returns true if both files contents are equal. 26 func EqualFileContents(a, b string) (bool, error) { 27 _, as, err := sha256sum(a) 28 if err != nil { 29 return false, fmt.Errorf("could not hash %s: %w", a, err) 30 } 31 _, bs, err := sha256sum(b) 32 if err != nil { 33 return false, fmt.Errorf("could not hash %s: %w", b, err) 34 } 35 return as == bs, nil 36 } 37 38 func sha256sum(path string) (fs.FileMode, string, error) { 39 f, err := os.Open(path) 40 if err != nil { 41 return 0, "", err 42 } 43 defer f.Close() 44 45 h := sha256.New() 46 if _, err := io.Copy(h, f); err != nil { 47 return 0, "", err 48 } 49 50 st, err := f.Stat() 51 if err != nil { 52 return 0, "", err 53 } 54 55 return st.Mode(), hex.EncodeToString(h.Sum(nil)), nil 56 }