提交 18a392a0 作者: Jeromy Johnson 提交者: GitHub

Merge pull request #3758 from ipfs/fix/ipfs-get-progress

Fix ipfs get progress bar
...@@ -143,6 +143,12 @@ func (r *clearlineReader) Read(p []byte) (n int, err error) { ...@@ -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) { 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 // setup bar reader
// TODO: get total length of files // TODO: get total length of files
bar := pb.New64(l).SetUnits(pb.U_BYTES) bar := pb.New64(l).SetUnits(pb.U_BYTES)
...@@ -155,8 +161,7 @@ func progressBarForReader(out io.Writer, r io.Reader, l int64) (*pb.ProgressBar, ...@@ -155,8 +161,7 @@ func progressBarForReader(out io.Writer, r io.Reader, l int64) (*pb.ProgressBar,
bar.Callback = nil bar.Callback = nil
log.Infof("terminal width: %v\n", terminalWidth) log.Infof("terminal width: %v\n", terminalWidth)
} }
barR := bar.NewProxyReader(r) return bar
return bar, &clearlineReader{barR, out}
} }
type getWriter struct { type getWriter struct {
...@@ -208,12 +213,13 @@ func (gw *getWriter) writeArchive(r io.Reader, fpath string) error { ...@@ -208,12 +213,13 @@ func (gw *getWriter) writeArchive(r io.Reader, fpath string) error {
func (gw *getWriter) writeExtracted(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) 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() bar.Start()
defer bar.Finish() defer bar.Finish()
defer bar.Set64(gw.Size)
extractor := &tar.Extractor{fpath} extractor := &tar.Extractor{fpath, bar.Add64}
return extractor.Extract(barR) return extractor.Extract(r)
} }
func getCompressOptions(req cmds.Request) (int, error) { func getCompressOptions(req cmds.Request) (int, error) {
......
...@@ -11,7 +11,8 @@ import ( ...@@ -11,7 +11,8 @@ import (
) )
type Extractor struct { type Extractor struct {
Path string Path string
Progress func(int64) int64
} }
func (te *Extractor) Extract(reader io.Reader) error { 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 ...@@ -111,10 +112,30 @@ func (te *Extractor) extractFile(h *tar.Header, r *tar.Reader, depth int, rootEx
} }
defer file.Close() defer file.Close()
_, err = io.Copy(file, r) err = copyWithProgress(file, r, te.Progress)
if err != nil { if err != nil {
return err return err
} }
return nil 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
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论