mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
Move the progress package up into the client as a temporary shared location for common clients like CLI and compose. The progress package is used by the daemon to write progress updates to some sink, typically a streamformatter. This package is of little use to API clients as this package does not provide any facilities to consume the progress updates. Co-authored-by: Cory Snider <csnider@mirantis.com> Signed-off-by: Austin Vazquez <austin.vazquez@docker.com>
94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
package progress
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// Progress represents the progress of a transfer.
|
|
type Progress struct {
|
|
ID string
|
|
|
|
// Progress contains a Message or...
|
|
Message string
|
|
|
|
// ...progress of an action
|
|
Action string
|
|
Current int64
|
|
Total int64
|
|
|
|
// If true, don't show xB/yB
|
|
HideCounts bool
|
|
// If not empty, use units instead of bytes for counts
|
|
Units string
|
|
|
|
// Aux contains extra information not presented to the user, such as
|
|
// digests for push signing.
|
|
Aux any
|
|
|
|
LastUpdate bool
|
|
}
|
|
|
|
// Output is an interface for writing progress information. It's
|
|
// like a writer for progress, but we don't call it Writer because
|
|
// that would be confusing next to ProgressReader (also, because it
|
|
// doesn't implement the io.Writer interface).
|
|
type Output interface {
|
|
WriteProgress(Progress) error
|
|
}
|
|
|
|
type chanOutput chan<- Progress
|
|
|
|
func (out chanOutput) WriteProgress(p Progress) error {
|
|
// FIXME: workaround for panic in #37735
|
|
defer func() {
|
|
recover()
|
|
}()
|
|
out <- p
|
|
return nil
|
|
}
|
|
|
|
// ChanOutput returns an Output that writes progress updates to the
|
|
// supplied channel.
|
|
func ChanOutput(progressChan chan<- Progress) Output {
|
|
return chanOutput(progressChan)
|
|
}
|
|
|
|
type discardOutput struct{}
|
|
|
|
func (discardOutput) WriteProgress(Progress) error {
|
|
return nil
|
|
}
|
|
|
|
// DiscardOutput returns an Output that discards progress
|
|
func DiscardOutput() Output {
|
|
return discardOutput{}
|
|
}
|
|
|
|
// Update is a convenience function to write a progress update to the channel.
|
|
func Update(out Output, id, action string) {
|
|
out.WriteProgress(Progress{ID: id, Action: action})
|
|
}
|
|
|
|
// Updatef is a convenience function to write a printf-formatted progress update
|
|
// to the channel.
|
|
func Updatef(out Output, id, format string, a ...any) {
|
|
Update(out, id, fmt.Sprintf(format, a...))
|
|
}
|
|
|
|
// Message is a convenience function to write a progress message to the channel.
|
|
func Message(out Output, id, message string) {
|
|
out.WriteProgress(Progress{ID: id, Message: message})
|
|
}
|
|
|
|
// Messagef is a convenience function to write a printf-formatted progress
|
|
// message to the channel.
|
|
func Messagef(out Output, id, format string, a ...any) {
|
|
Message(out, id, fmt.Sprintf(format, a...))
|
|
}
|
|
|
|
// Aux sends auxiliary information over a progress interface, which will not be
|
|
// formatted for the UI. This is used for things such as push signing.
|
|
func Aux(out Output, a any) {
|
|
out.WriteProgress(Progress{Aux: a})
|
|
}
|