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 }