// newProgressBar - instantiate a pbBar. func newProgressBar() barSend { console.SetCustomTheme(map[string]*color.Color{ "Bar": color.New(color.FgGreen, color.Bold), }) cmdCh := make(chan barMsg) finishCh := make(chan bool) go func(cmdCh <-chan barMsg, finishCh chan<- bool) { var started bool var totalBytesRead int64 // total amounts of bytes read bar := pb.New64(0) bar.SetUnits(pb.U_BYTES) bar.SetRefreshRate(time.Millisecond * 125) bar.NotPrint = true bar.ShowSpeed = true bar.Callback = func(s string) { console.Print(console.Colorize("Bar", "\r"+s)) } switch runtime.GOOS { case "linux": bar.Format("┃▓█░┃") // bar.Format("█▓▒░█") case "darwin": bar.Format(" ▓ ░ ") default: bar.Format("[=> ]") } for msg := range cmdCh { switch msg.Op { case pbBarSetCaption: bar.Prefix(fixateBarCaption(msg.Arg.(string), getFixedWidth(bar.GetWidth(), 18))) case pbBarExtend: atomic.AddInt64(&bar.Total, msg.Arg.(int64)) case pbBarProgress: if bar.Total > 0 && !started { started = true bar.Start() } if msg.Arg.(int64) > 0 { totalBytesRead += msg.Arg.(int64) bar.Add64(msg.Arg.(int64)) } case pbBarPutError: if totalBytesRead > msg.Arg.(int64) { bar.Set64(totalBytesRead - msg.Arg.(int64)) } case pbBarGetError: if msg.Arg.(int64) > 0 { bar.Add64(msg.Arg.(int64)) } case pbBarFinish: if started { bar.Finish() } finishCh <- true return } } }(cmdCh, finishCh) return barSend{cmdCh, finishCh} }
// newProgressBar - instantiate a progress bar. func newProgressBar(total int64) *progressBar { // Progress bar speific theme customization. console.SetColor("Bar", color.New(color.FgGreen, color.Bold)) pgbar := progressBar{} // get the new original progress bar. bar := pb.New64(total) // Set new human friendly print units. bar.SetUnits(pb.U_BYTES) // Refresh rate for progress bar is set to 125 milliseconds. bar.SetRefreshRate(time.Millisecond * 125) // Do not print a newline by default handled, it is handled manually. bar.NotPrint = true // Show current speed is true. bar.ShowSpeed = true // Custom callback with colorized bar. bar.Callback = func(s string) { console.Print(console.Colorize("Bar", "\r"+s)) } // Use different unicodes for Linux, OS X and Windows. switch runtime.GOOS { case "linux": // Need to add '\x00' as delimiter for unicode characters. bar.Format("┃\x00▓\x00█\x00░\x00┃") case "darwin": // Need to add '\x00' as delimiter for unicode characters. bar.Format(" \x00▓\x00 \x00░\x00 ") default: // Default to non unicode characters. bar.Format("[=> ]") } // Start the progress bar. if bar.Total > 0 { bar.Start() } // Copy for future pgbar.ProgressBar = bar // Return new progress bar here. return &pgbar }
func listSessions() error { var bySessions []*sessionV2 for _, sid := range getSessionIDs() { s, err := loadSessionV2(sid) if err != nil { return NewIodine(iodine.New(err, nil)) } bySessions = append(bySessions, s) } // sort sessions based on time sort.Sort(bySessionWhen(bySessions)) for _, session := range bySessions { console.Print(session) } return nil }
// doList - list all entities inside a folder func doList(clnt client.Client, recursive bool) error { var err error for contentCh := range clnt.List(recursive) { if contentCh.Err != nil { switch err := iodine.ToError(contentCh.Err).(type) { // handle this specifically for filesystem case client.ISBrokenSymlink: console.Errorln(NewIodine(iodine.New(err, nil)).Error()) continue } if os.IsNotExist(iodine.ToError(contentCh.Err)) || os.IsPermission(iodine.ToError(contentCh.Err)) { console.Errorln(NewIodine(iodine.New(contentCh.Err, nil)).Error()) continue } err = contentCh.Err break } console.Print(parseContent(contentCh.Content)) } if err != nil { return NewIodine(iodine.New(err, map[string]string{"Target": clnt.URL().String()})) } return nil }
// newProgressBar - instantiate a progress bar. func newProgressBar(total int64) *barSend { // Progress bar speific theme customization. console.SetColor("Bar", color.New(color.FgGreen, color.Bold)) cmdCh := make(chan barMsg) finishCh := make(chan bool) go func(total int64, cmdCh <-chan barMsg, finishCh chan<- bool) { var started bool // has the progress bar started? default is false. var totalBytesRead int64 // total amounts of bytes read // get the new original progress bar. bar := pb.New64(total) bar.SetUnits(pb.U_BYTES) // refresh rate for progress bar is set to 125 milliseconds. bar.SetRefreshRate(time.Millisecond * 125) // Do not print a newline by default handled, it is handled manually. bar.NotPrint = true // Show current speed is true. bar.ShowSpeed = true // Custom callback with colorized bar. bar.Callback = func(s string) { console.Print(console.Colorize("Bar", "\r"+s)) } // Use different unicodes for Linux, OS X and Windows. switch runtime.GOOS { case "linux": bar.Format("┃▓█░┃") // bar.Format("█▓▒░█") case "darwin": bar.Format(" ▓ ░ ") default: bar.Format("[=> ]") } // Look for incoming progress bar messages. for msg := range cmdCh { switch msg.Op { case pbBarSetCaption: // Sets a new caption prefixed along with progress bar. bar.Prefix(fixateBarCaption(msg.Arg.(string), getFixedWidth(bar.GetWidth(), 18))) case pbBarProgress: // Initializes the progerss bar, if already started bumps up the totalBytes. if bar.Total > 0 && !started { started = true bar.Start() } if msg.Arg.(int64) > 0 { totalBytesRead += msg.Arg.(int64) bar.Add64(msg.Arg.(int64)) } case pbBarPutError: // Negates any put error of size from totalBytes. if totalBytesRead > msg.Arg.(int64) { bar.Set64(totalBytesRead - msg.Arg.(int64)) } case pbBarGetError: // Retains any size transferred but failed. if msg.Arg.(int64) > 0 { bar.Add64(msg.Arg.(int64)) } case pbBarFinish: // Progress finishes here. if started { bar.Finish() } // All done send true. finishCh <- true return } } }(total, cmdCh, finishCh) return &barSend{cmdCh, finishCh} }