From 9899b4cad260e5574b1df611777dbf11aa26d902 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 19 May 2018 10:56:50 -0400 Subject: cow-dedupe: fixup statusline --- go/src/cow-dedupe/dedupe.go | 10 ++++------ go/src/lib/statusline/async.go | 26 +++++++++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/go/src/cow-dedupe/dedupe.go b/go/src/cow-dedupe/dedupe.go index ba7701c..b67d677 100644 --- a/go/src/cow-dedupe/dedupe.go +++ b/go/src/cow-dedupe/dedupe.go @@ -71,9 +71,8 @@ func getFiemaps(paths []string) map[string][]string { } errhandle(cmd.Wait()) - sl.Put(fmt.Sprintf("Mapping extents... done; mapped %d files", cnt)) sl.End() - io.WriteString(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, "Mapping extents... done; mapped %d files\n", cnt) return ret } @@ -82,7 +81,7 @@ func getChecksums(paths []string) map[string][]string { sl := statusline.NewAsyncStatusLine(os.Stderr, time.Second/2) cnt := 0 - sl.Put(fmt.Sprintf("Generating checksums for files... %d/%d\n", cnt, len(paths))) + sl.Put(fmt.Sprintf("Generating checksums for files... %d/%d", cnt, len(paths))) for len(paths) > 0 { _paths := paths @@ -117,14 +116,13 @@ func getChecksums(paths []string) map[string][]string { ret[checksum] = append(ret[checksum], filename) cnt++ - sl.Put(fmt.Sprintf("Generating checksums for files... %d/%d\n", cnt, len(paths))) + sl.Put(fmt.Sprintf("Generating checksums for files... %d/%d", cnt, len(paths))) } errhandle(cmd.Wait()) } - sl.Put(fmt.Sprintf("Generating checksums for files... done; summed %d files\n", cnt)) sl.End() - io.WriteString(os.Stderr, "\n") + fmt.Fprintf(os.Stderr, "Generating checksums for files... done; summed %d files\n", cnt) return ret } diff --git a/go/src/lib/statusline/async.go b/go/src/lib/statusline/async.go index 32c9a2b..5b509ac 100644 --- a/go/src/lib/statusline/async.go +++ b/go/src/lib/statusline/async.go @@ -7,27 +7,38 @@ import ( type AsyncStatusLine struct { lines chan string - end chan struct{} + end1 chan struct{} + end2 chan struct{} } func NewAsyncStatusLine(out io.Writer, d time.Duration) *AsyncStatusLine { ret := &AsyncStatusLine{ lines: make(chan string), - end: make(chan struct{}), + end1: make(chan struct{}), + end2: make(chan struct{}), } go func() { sl := NewStatusLine(out) ticker := time.NewTicker(d) - var line string + var oldLine string + var newLine string + dirty := false for { select { case <-ticker.C: - sl.Put(line) + if dirty && newLine != oldLine { + sl.Put(newLine) + dirty = false + } case l := <-ret.lines: - line = l - case <-ret.end: + newLine = l + dirty = true + case <-ret.end1: sl.End() ticker.Stop() + end2 <- struct{}{} + close(end2) + return } } }() @@ -39,7 +50,8 @@ func (sl *AsyncStatusLine) Put(line string) { } func (sl *AsyncStatusLine) End() { - sl.end <- struct{}{} + sl.end1 <- struct{}{} close(sl.lines) close(sl.end) + <-sl.end2 } -- cgit v1.2.3