func progressBarForReader(out io.Writer, r io.Reader) (*pb.ProgressBar, *pb.Reader) { // setup bar reader // TODO: get total length of files bar := pb.New(0).SetUnits(pb.U_BYTES) bar.Output = out barR := bar.NewProxyReader(r) return bar, barR }
func main() { count := 5000 bar := pb.New(count) // show percents (by default already true) bar.ShowPercent = true // show bar (by default already true) bar.ShowPercent = true // no need counters bar.ShowCounters = true bar.ShowTimeLeft = true // and start bar.Start() for i := 0; i < count; i++ { bar.Increment() time.Sleep(time.Millisecond) } bar.FinishPrint("The End!") }
if err != nil { res.SetError(err, cmds.ErrNormal) return } res.SetLength(length) reader := io.MultiReader(readers...) res.SetOutput(reader) }, PostRun: func(req cmds.Request, res cmds.Response) { if res.Length() < progressBarMinSize { return } bar := pb.New(int(res.Length())).SetUnits(pb.U_BYTES) bar.Output = res.Stderr() bar.Start() reader := bar.NewProxyReader(res.Output().(io.Reader)) res.SetOutput(&clearlineReader{reader, res.Stderr()}) }, } func cat(ctx context.Context, node *core.IpfsNode, paths []string) ([]io.Reader, uint64, error) { readers := make([]io.Reader, 0, len(paths)) length := uint64(0) for _, fpath := range paths { read, err := coreunix.Cat(ctx, node, fpath) if err != nil { return nil, 0, err
func main() { // check args if len(os.Args) < 3 { printUsage() return } sourceName, destName := os.Args[1], os.Args[2] // check source var source io.Reader var sourceSize int64 if strings.HasPrefix(sourceName, "http://") { // open as url resp, err := http.Get(sourceName) if err != nil { fmt.Printf("Can't get %s: %v\n", sourceName, err) return } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { fmt.Printf("Server return non-200 status: %v\n", resp.Status) return } i, _ := strconv.Atoi(resp.Header.Get("Content-Length")) sourceSize = int64(i) source = resp.Body } else { // open as file s, err := os.Open(sourceName) if err != nil { fmt.Printf("Can't open %s: %v\n", sourceName, err) return } defer s.Close() // get source size sourceStat, err := s.Stat() if err != nil { fmt.Printf("Can't stat %s: %v\n", sourceName, err) return } sourceSize = sourceStat.Size() source = s } // create dest dest, err := os.Create(destName) if err != nil { fmt.Printf("Can't create %s: %v\n", destName, err) return } defer dest.Close() // create bar bar := pb.New(int(sourceSize)).SetUnits(pb.U_BYTES).SetRefreshRate(time.Millisecond * 10) bar.ShowSpeed = true bar.Start() // create multi writer writer := io.MultiWriter(dest, bar) // and copy io.Copy(writer, source) bar.Finish() }
if archive && !strings.HasSuffix(outPath, ".tar") { outPath += ".tar" } if cmplvl != gzip.NoCompression { outPath += ".gz" } fmt.Printf("Saving archive to %s\n", outPath) file, err := os.Create(outPath) if err != nil { res.SetError(err, cmds.ErrNormal) return } defer file.Close() bar := pb.New(0).SetUnits(pb.U_BYTES) bar.Output = os.Stderr pbReader := bar.NewProxyReader(outReader) bar.Start() defer bar.Finish() if _, err := io.Copy(file, pbReader); err != nil { res.SetError(err, cmds.ErrNormal) return } return } fmt.Printf("Saving file(s) to %s\n", outPath)