From 85f9b778f54a823566dd5d81e0e0a9875a64569d Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 19 Dec 2013 12:32:58 -0800 Subject: [PATCH] fix progressbar in docker push --- registry/registry.go | 5 +++++ server.go | 1 + utils/jsonmessage.go | 2 +- utils/progressreader.go | 19 +++++++++---------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/registry/registry.go b/registry/registry.go index 6c9255aa46..3c793cf08c 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -448,6 +448,11 @@ func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registr if err != nil { return "", fmt.Errorf("Failed to upload layer: %s", err) } + if rc, ok := layer.(io.Closer); ok { + if err := rc.Close(); err != nil { + return "", err + } + } defer res.Body.Close() if res.StatusCode != 200 { diff --git a/server.go b/server.go index 51e0aac4db..201fd83ab8 100644 --- a/server.go +++ b/server.go @@ -1272,6 +1272,7 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID, return "", err } + out.Write(sf.FormatProgress(utils.TruncateID(imgData.ID), "Image successfully pushed", nil)) return imgData.Checksum, nil } diff --git a/utils/jsonmessage.go b/utils/jsonmessage.go index cc467162f9..6c8711b266 100644 --- a/utils/jsonmessage.go +++ b/utils/jsonmessage.go @@ -52,7 +52,7 @@ func (p *JSONProgress) String() string { } numbersBox = fmt.Sprintf("%8v/%v", current, total) - if p.Start > 0 { + if p.Start > 0 && percentage < 50 { 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 diff --git a/utils/progressreader.go b/utils/progressreader.go index 81f076682e..a43ee55b0f 100644 --- a/utils/progressreader.go +++ b/utils/progressreader.go @@ -7,21 +7,18 @@ import ( // Reader with progress bar type progressReader struct { - reader io.ReadCloser // Stream to read from - output io.Writer // Where to send progress bar to - progress JSONProgress - // readTotal int // Expected stream length (bytes) - // readProgress int // How much has been read so far (bytes) + reader io.ReadCloser // Stream to read from + output io.Writer // Where to send progress bar to + progress JSONProgress lastUpdate int // How many bytes read at least update ID string action string - // template string // Template to print. Default "%v/%v (%v)" - sf *StreamFormatter - newLine bool + sf *StreamFormatter + newLine bool } func (r *progressReader) Read(p []byte) (n int, err error) { - read, err := io.ReadCloser(r.reader).Read(p) + read, err := r.reader.Read(p) r.progress.Current += read updateEvery := 1024 * 512 //512kB if r.progress.Total > 0 { @@ -41,7 +38,9 @@ func (r *progressReader) Read(p []byte) (n int, err error) { return read, err } func (r *progressReader) Close() error { - return io.ReadCloser(r.reader).Close() + r.progress.Current = r.progress.Total + r.output.Write(r.sf.FormatProgress(r.ID, r.action, &r.progress)) + return r.reader.Close() } func ProgressReader(r io.ReadCloser, size int, output io.Writer, sf *StreamFormatter, newline bool, ID, action string) *progressReader { return &progressReader{