github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/util/progress/progress.go (about) 1 package progress 2 3 import ( 4 "time" 5 6 "github.com/moby/buildkit/client" 7 "github.com/moby/buildkit/identity" 8 "github.com/opencontainers/go-digest" 9 ) 10 11 type Logger func(*client.SolveStatus) 12 13 type SubLogger interface { 14 Wrap(name string, fn func() error) error 15 Log(stream int, dt []byte) 16 SetStatus(*client.VertexStatus) 17 } 18 19 func Wrap(name string, l Logger, fn func(SubLogger) error) (err error) { 20 dgst := digest.FromBytes([]byte(identity.NewID())) 21 tm := time.Now() 22 l(&client.SolveStatus{ 23 Vertexes: []*client.Vertex{{ 24 Digest: dgst, 25 Name: name, 26 Started: &tm, 27 }}, 28 }) 29 30 defer func() { 31 tm2 := time.Now() 32 errMsg := "" 33 if err != nil { 34 errMsg = err.Error() 35 } 36 l(&client.SolveStatus{ 37 Vertexes: []*client.Vertex{{ 38 Digest: dgst, 39 Name: name, 40 Started: &tm, 41 Completed: &tm2, 42 Error: errMsg, 43 }}, 44 }) 45 }() 46 47 return fn(&subLogger{dgst, l}) 48 } 49 50 type subLogger struct { 51 dgst digest.Digest 52 logger Logger 53 } 54 55 func (sl *subLogger) Wrap(name string, fn func() error) (err error) { 56 tm := time.Now() 57 sl.logger(&client.SolveStatus{ 58 Statuses: []*client.VertexStatus{{ 59 Vertex: sl.dgst, 60 ID: name, 61 Timestamp: time.Now(), 62 Started: &tm, 63 }}, 64 }) 65 66 defer func() { 67 tm2 := time.Now() 68 sl.logger(&client.SolveStatus{ 69 Statuses: []*client.VertexStatus{{ 70 Vertex: sl.dgst, 71 ID: name, 72 Timestamp: time.Now(), 73 Started: &tm, 74 Completed: &tm2, 75 }}, 76 }) 77 }() 78 79 return fn() 80 } 81 82 func (sl *subLogger) Log(stream int, dt []byte) { 83 sl.logger(&client.SolveStatus{ 84 Logs: []*client.VertexLog{{ 85 Vertex: sl.dgst, 86 Stream: stream, 87 Data: dt, 88 Timestamp: time.Now(), 89 }}, 90 }) 91 } 92 93 func (sl *subLogger) SetStatus(st *client.VertexStatus) { 94 st.Vertex = sl.dgst 95 sl.logger(&client.SolveStatus{ 96 Statuses: []*client.VertexStatus{st}, 97 }) 98 }