mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	Update modules: go mod edit -require github.com/moby/buildkit@master go mod tidy -compat=1.17 && ./hack/update-vendor Signed-off-by: Justin Chadwell <me@jedevc.com>
		
			
				
	
	
		
			103 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package progress
 | 
						|
 | 
						|
import (
 | 
						|
	"sort"
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
type rawProgressWriter interface {
 | 
						|
	WriteRawProgress(*Progress) error
 | 
						|
	Close() error
 | 
						|
}
 | 
						|
 | 
						|
type MultiWriter struct {
 | 
						|
	mu      sync.Mutex
 | 
						|
	items   []*Progress
 | 
						|
	writers map[rawProgressWriter]struct{}
 | 
						|
	meta    map[string]interface{}
 | 
						|
}
 | 
						|
 | 
						|
func NewMultiWriter(opts ...WriterOption) *MultiWriter {
 | 
						|
	mw := &MultiWriter{
 | 
						|
		writers: map[rawProgressWriter]struct{}{},
 | 
						|
		meta:    map[string]interface{}{},
 | 
						|
	}
 | 
						|
	for _, o := range opts {
 | 
						|
		o(mw)
 | 
						|
	}
 | 
						|
	return mw
 | 
						|
}
 | 
						|
 | 
						|
func (ps *MultiWriter) Add(pw Writer) {
 | 
						|
	rw, ok := pw.(rawProgressWriter)
 | 
						|
	if !ok {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	ps.mu.Lock()
 | 
						|
	plist := make([]*Progress, 0, len(ps.items))
 | 
						|
	plist = append(plist, ps.items...)
 | 
						|
	sort.Slice(plist, func(i, j int) bool {
 | 
						|
		return plist[i].Timestamp.Before(plist[j].Timestamp)
 | 
						|
	})
 | 
						|
	for _, p := range plist {
 | 
						|
		rw.WriteRawProgress(p)
 | 
						|
	}
 | 
						|
	ps.writers[rw] = struct{}{}
 | 
						|
	ps.mu.Unlock()
 | 
						|
}
 | 
						|
 | 
						|
func (ps *MultiWriter) Delete(pw Writer) {
 | 
						|
	rw, ok := pw.(rawProgressWriter)
 | 
						|
	if !ok {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	ps.mu.Lock()
 | 
						|
	delete(ps.writers, rw)
 | 
						|
	ps.mu.Unlock()
 | 
						|
}
 | 
						|
 | 
						|
func (ps *MultiWriter) Write(id string, v interface{}) error {
 | 
						|
	p := &Progress{
 | 
						|
		ID:        id,
 | 
						|
		Timestamp: time.Now(),
 | 
						|
		Sys:       v,
 | 
						|
		meta:      ps.meta,
 | 
						|
	}
 | 
						|
	return ps.WriteRawProgress(p)
 | 
						|
}
 | 
						|
 | 
						|
func (ps *MultiWriter) WriteRawProgress(p *Progress) error {
 | 
						|
	meta := p.meta
 | 
						|
	if len(ps.meta) > 0 {
 | 
						|
		meta = map[string]interface{}{}
 | 
						|
		for k, v := range p.meta {
 | 
						|
			meta[k] = v
 | 
						|
		}
 | 
						|
		for k, v := range ps.meta {
 | 
						|
			if _, ok := meta[k]; !ok {
 | 
						|
				meta[k] = v
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	p.meta = meta
 | 
						|
	return ps.writeRawProgress(p)
 | 
						|
}
 | 
						|
 | 
						|
func (ps *MultiWriter) writeRawProgress(p *Progress) error {
 | 
						|
	ps.mu.Lock()
 | 
						|
	defer ps.mu.Unlock()
 | 
						|
	ps.items = append(ps.items, p)
 | 
						|
	for w := range ps.writers {
 | 
						|
		if err := w.WriteRawProgress(p); err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (ps *MultiWriter) Close() error {
 | 
						|
	return nil
 | 
						|
}
 |