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  }