1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-30 18:13:54 +08:00

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

Fix ipfs get progress bar
This commit is contained in:
Jeromy Johnson
2017-03-07 15:39:29 -08:00
committed by GitHub
2 changed files with 34 additions and 7 deletions

View File

@ -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) {

View File

@ -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
}
}
}