github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/store/dockercomposeservices/hash.go (about)

     1  package dockercomposeservices
     2  
     3  import (
     4  	"crypto"
     5  	"encoding/base64"
     6  	"fmt"
     7  	"hash"
     8  
     9  	jsoniter "github.com/json-iterator/go"
    10  	"github.com/pkg/errors"
    11  
    12  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    13  )
    14  
    15  var defaultJSONIterator = createDefaultJSONIterator()
    16  
    17  func createDefaultJSONIterator() jsoniter.API {
    18  	return jsoniter.Config{
    19  		EscapeHTML:             true,
    20  		SortMapKeys:            true,
    21  		ValidateJsonRawMessage: true,
    22  		CaseSensitive:          true,
    23  	}.Froze()
    24  }
    25  
    26  // Compute the hash of a dockercompose project.
    27  func MustHashProject(p v1alpha1.DockerComposeProject) string {
    28  	w := newHashWriter()
    29  	err := w.append(p)
    30  	if err != nil {
    31  		panic(fmt.Errorf("hashing %v", p))
    32  	}
    33  	return w.done()
    34  }
    35  
    36  type hashWriter struct {
    37  	h hash.Hash
    38  }
    39  
    40  func newHashWriter() *hashWriter {
    41  	return &hashWriter{h: crypto.SHA1.New()}
    42  }
    43  
    44  func (w hashWriter) append(o interface{}) error {
    45  	data, err := defaultJSONIterator.Marshal(o)
    46  	if err != nil {
    47  		return errors.Wrap(err, "serializing object for hash")
    48  	}
    49  	_, err = w.h.Write(data)
    50  	if err != nil {
    51  		return errors.Wrap(err, "computing hash")
    52  	}
    53  	return nil
    54  }
    55  
    56  func (w hashWriter) done() string {
    57  	return base64.URLEncoding.EncodeToString(w.h.Sum(nil))
    58  }