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  }