func getStatusPrinter(expected uint64) progressreader.Callback { startTime := time.Now() return func(seen uint64) { percent := float64(seen) / float64(expected) * 100 elapsed := time.Now().Sub(startTime) rate := float64(seen) / elapsed.Seconds() status.Printf("%.2f%% of %s (%s/s)...", percent, humanize.Bytes(expected), humanize.Bytes(uint64(rate))) } }
func main() { flag.Usage = func() { fmt.Fprintf(os.Stderr, "usage: %s <dataset> <file>\n", os.Args[0]) flag.PrintDefaults() } spec.RegisterDatabaseFlags(flag.CommandLine) flag.Parse(true) if len(flag.Args()) != 2 { d.CheckError(errors.New("expected dataset and file flags")) } var blob types.Blob path := flag.Arg(0) if db, val, err := spec.GetPath(path); err != nil { d.CheckErrorNoUsage(err) } else if val == nil { d.CheckErrorNoUsage(fmt.Errorf("No value at %s", path)) } else if b, ok := val.(types.Blob); !ok { d.CheckErrorNoUsage(fmt.Errorf("Value at %s is not a blob", path)) } else { defer db.Close() blob = b } filePath := flag.Arg(1) if filePath == "" { d.CheckErrorNoUsage(errors.New("Empty file path")) } // Note: overwrites any existing file. file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0644) d.CheckErrorNoUsage(err) defer file.Close() expected := humanize.Bytes(blob.Len()) start := time.Now() progReader := progressreader.New(blob.Reader(), func(seen uint64) { elapsed := time.Since(start).Seconds() rate := uint64(float64(seen) / elapsed) status.Printf("%s of %s written in %ds (%s/s)...", humanize.Bytes(seen), expected, int(elapsed), humanize.Bytes(rate)) }) io.Copy(file, progReader) status.Done() }
func getStatusPrinter(expectedLen int64) progressreader.Callback { return func(seenLen uint64) { var expected string if expectedLen < 0 { expected = "(unknown)" } else { expected = human.Bytes(uint64(expectedLen)) } elapsed := time.Now().Sub(start) rate := uint64(float64(seenLen) / elapsed.Seconds()) status.Printf("%s of %s written in %ds (%s/s)...", human.Bytes(seenLen), expected, uint64(elapsed.Seconds()), human.Bytes(rate)) } }
func formatStatus(acc diffSummaryProgress, singular, plural string) { pluralize := func(singular, plural string, n uint64) string { var noun string if n != 1 { noun = plural } else { noun = singular } return fmt.Sprintf("%s %s", humanize.Comma(int64(n)), noun) } insertions := pluralize("insertion", "insertions", acc.Adds) deletions := pluralize("deletion", "deletions", acc.Removes) changes := pluralize("change", "changes", acc.Changes) oldValues := pluralize(singular, plural, acc.OldSize) newValues := pluralize(singular, plural, acc.NewSize) status.Printf("%s (%.2f%%), %s (%.2f%%), %s (%.2f%%), (%s vs %s)", insertions, (float64(100*acc.Adds) / float64(acc.OldSize)), deletions, (float64(100*acc.Removes) / float64(acc.OldSize)), changes, (float64(100*acc.Changes) / float64(acc.OldSize)), oldValues, newValues) }