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:
@ -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) {
|
||||
|
25
thirdparty/tar/extractor.go
vendored
25
thirdparty/tar/extractor.go
vendored
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user