From 169f7899ba0cfc9a6e24061790b893e015972998 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 6 Mar 2017 22:58:23 -0800 Subject: [PATCH] fix progress bar on ipfs get License: MIT Signed-off-by: Jeromy --- core/commands/get.go | 16 +++++++++++----- thirdparty/tar/extractor.go | 25 +++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/core/commands/get.go b/core/commands/get.go index 62a040024..9093bc5da 100644 --- a/core/commands/get.go +++ b/core/commands/get.go @@ -143,6 +143,12 @@ func (r *clearlineReader) Read(p []byte) (n int, err error) { } func progressBarForReader(out io.Writer, r io.Reader, l int64) (*pb.ProgressBar, io.Reader) { + bar := makeProgressBar(out, l) + barR := bar.NewProxyReader(r) + return bar, &clearlineReader{barR, out} +} + +func makeProgressBar(out io.Writer, l int64) *pb.ProgressBar { // setup bar reader // TODO: get total length of files bar := pb.New64(l).SetUnits(pb.U_BYTES) @@ -155,8 +161,7 @@ func progressBarForReader(out io.Writer, r io.Reader, l int64) (*pb.ProgressBar, bar.Callback = nil log.Infof("terminal width: %v\n", terminalWidth) } - barR := bar.NewProxyReader(r) - return bar, &clearlineReader{barR, out} + return bar } type getWriter struct { @@ -208,12 +213,13 @@ func (gw *getWriter) writeArchive(r io.Reader, fpath string) error { func (gw *getWriter) writeExtracted(r io.Reader, fpath string) error { fmt.Fprintf(gw.Out, "Saving file(s) to %s\n", fpath) - bar, barR := progressBarForReader(gw.Err, r, gw.Size) + bar := makeProgressBar(gw.Err, gw.Size) bar.Start() defer bar.Finish() + defer bar.Set64(gw.Size) - extractor := &tar.Extractor{fpath} - return extractor.Extract(barR) + extractor := &tar.Extractor{fpath, bar.Add64} + return extractor.Extract(r) } func getCompressOptions(req cmds.Request) (int, error) { diff --git a/thirdparty/tar/extractor.go b/thirdparty/tar/extractor.go index eeeb7415a..ebbedd593 100644 --- a/thirdparty/tar/extractor.go +++ b/thirdparty/tar/extractor.go @@ -11,7 +11,8 @@ import ( ) type Extractor struct { - Path string + Path string + Progress func(int64) int64 } func (te *Extractor) Extract(reader io.Reader) error { @@ -111,10 +112,30 @@ func (te *Extractor) extractFile(h *tar.Header, r *tar.Reader, depth int, rootEx } defer file.Close() - _, err = io.Copy(file, r) + err = copyWithProgress(file, r, te.Progress) if err != nil { return err } return nil } + +func copyWithProgress(to io.Writer, from io.Reader, cb func(int64) int64) error { + buf := make([]byte, 4096) + for { + n, err := from.Read(buf) + if err != nil { + if err == io.EOF { + return nil + } + return err + } + + cb(int64(n)) + _, err = to.Write(buf[:n]) + if err != nil { + return err + } + } + +}