github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/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 func sha256sum(path string) (fs.FileMode, string, error) { 26 f, err := os.Open(path) 27 if err != nil { 28 return 0, "", err 29 } 30 defer f.Close() 31 32 h := sha256.New() 33 if _, err := io.Copy(h, f); err != nil { 34 return 0, "", err 35 } 36 37 st, err := f.Stat() 38 if err != nil { 39 return 0, "", err 40 } 41 42 return st.Mode(), hex.EncodeToString(h.Sum(nil)), nil 43 }