From ebc36b879d4197a9455b325b529da212539e180c Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 28 Nov 2013 12:37:07 -0800 Subject: [PATCH] add progressbar and time --- utils/jsonmessage.go | 15 +++++++++++---- utils/progressreader.go | 3 ++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/utils/jsonmessage.go b/utils/jsonmessage.go index 93c40116e4..a0aeba2e7a 100644 --- a/utils/jsonmessage.go +++ b/utils/jsonmessage.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io" + "strings" "time" ) @@ -17,8 +18,9 @@ func (e *JSONError) Error() string { } type JSONProgress struct { - Current int `json:"current,omitempty"` - Total int `json:"total,omitempty"` + Current int `json:"current,omitempty"` + Total int `json:"total,omitempty"` + Start int64 `json:"start,omitempty"` } func (p *JSONProgress) String() string { @@ -30,8 +32,13 @@ func (p *JSONProgress) String() string { return fmt.Sprintf("%8v/?", current) } total := HumanSize(int64(p.Total)) - percentage := float64(p.Current) / float64(p.Total) * 100 - return fmt.Sprintf("%8v/%v (%.0f%%)", current, total, percentage) + percentage := int(float64(p.Current)/float64(p.Total)*100) / 2 + + fromStart := time.Now().UTC().Sub(time.Unix(int64(p.Start), 0)) + perEntry := fromStart / time.Duration(p.Current) + left := time.Duration(p.Total-p.Current) * perEntry + left = (left / time.Second) * time.Second + return fmt.Sprintf("[%s>%s] %8v/%v %s", strings.Repeat("=", percentage), strings.Repeat(" ", 50-percentage), current, total, left.String()) } type JSONMessage struct { diff --git a/utils/progressreader.go b/utils/progressreader.go index db332a6d1c..81f076682e 100644 --- a/utils/progressreader.go +++ b/utils/progressreader.go @@ -2,6 +2,7 @@ package utils import ( "io" + "time" ) // Reader with progress bar @@ -48,7 +49,7 @@ func ProgressReader(r io.ReadCloser, size int, output io.Writer, sf *StreamForma output: NewWriteFlusher(output), ID: ID, action: action, - progress: JSONProgress{Total: size}, + progress: JSONProgress{Total: size, Start: time.Now().UTC().Unix()}, sf: sf, newLine: newline, }