File: progress.go

package info (click to toggle)
singularity-container 4.1.5%2Bds4-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 43,876 kB
  • sloc: asm: 14,840; sh: 3,190; ansic: 1,751; awk: 414; makefile: 413; python: 99
file content (93 lines) | stat: -rw-r--r-- 1,695 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package progresswriter

import (
	"time"

	"github.com/moby/buildkit/client"
	"github.com/moby/buildkit/identity"
	digest "github.com/opencontainers/go-digest"
)

type Logger func(*client.SolveStatus)

type SubLogger interface {
	Wrap(name string, fn func() error) error
	Log(stream int, dt []byte)
}

func Wrap(name string, l Logger, fn func(SubLogger) error) (err error) {
	if l == nil {
		return nil
	}
	dgst := digest.FromBytes([]byte(identity.NewID()))
	tm := time.Now()
	l(&client.SolveStatus{
		Vertexes: []*client.Vertex{{
			Digest:  dgst,
			Name:    name,
			Started: &tm,
		}},
	})

	defer func() {
		tm2 := time.Now()
		errMsg := ""
		if err != nil {
			errMsg = err.Error()
		}
		l(&client.SolveStatus{
			Vertexes: []*client.Vertex{{
				Digest:    dgst,
				Name:      name,
				Started:   &tm,
				Completed: &tm2,
				Error:     errMsg,
			}},
		})
	}()

	return fn(&subLogger{dgst, l})
}

type subLogger struct {
	dgst   digest.Digest
	logger Logger
}

func (sl *subLogger) Wrap(name string, fn func() error) (err error) {
	tm := time.Now()
	sl.logger(&client.SolveStatus{
		Statuses: []*client.VertexStatus{{
			Vertex:    sl.dgst,
			ID:        name,
			Timestamp: time.Now(),
			Started:   &tm,
		}},
	})

	defer func() {
		tm2 := time.Now()
		sl.logger(&client.SolveStatus{
			Statuses: []*client.VertexStatus{{
				Vertex:    sl.dgst,
				ID:        name,
				Timestamp: time.Now(),
				Started:   &tm,
				Completed: &tm2,
			}},
		})
	}()

	return fn()
}

func (sl *subLogger) Log(stream int, dt []byte) {
	sl.logger(&client.SolveStatus{
		Logs: []*client.VertexLog{{
			Vertex:    sl.dgst,
			Stream:    stream,
			Data:      dt,
			Timestamp: time.Now(),
		}},
	})
}