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  }