aboutsummaryrefslogtreecommitdiffstats
path: root/drive/progress.go
diff options
context:
space:
mode:
authorPetter Rasmussen2016-01-24 11:21:38 +0100
committerPetter Rasmussen2016-01-24 11:21:38 +0100
commitb658f83ced4f558a6e23e554965d73bd6d4a04d1 (patch)
tree0d974595cb8669159876f2dba35991cb655148d4 /drive/progress.go
parenta008740722a824e707eea181ce4ae30bfa7d031a (diff)
downloadgdrive-b658f83ced4f558a6e23e554965d73bd6d4a04d1.tar.bz2
Move progress type to own file
Diffstat (limited to 'drive/progress.go')
-rw-r--r--drive/progress.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/drive/progress.go b/drive/progress.go
new file mode 100644
index 0000000..ee63b6c
--- /dev/null
+++ b/drive/progress.go
@@ -0,0 +1,78 @@
+package drive
+
+import (
+ "io"
+ "fmt"
+ "time"
+)
+
+type Progress struct {
+ Writer io.Writer
+ Reader io.Reader
+ Size int64
+ progress int64
+ rate int64
+ rateProgress int64
+ rateUpdated time.Time
+ updated time.Time
+ done bool
+}
+
+func (self *Progress) Read(p []byte) (int, error) {
+ // Read
+ n, err := self.Reader.Read(p)
+
+ now := time.Now()
+ isLast := err != nil
+
+ // Increment progress
+ newProgress := self.progress + int64(n)
+ self.progress = newProgress
+
+ // Initialize rate state
+ if self.rateUpdated.IsZero() {
+ self.rateUpdated = now
+ self.rateProgress = newProgress
+ }
+
+ // Update rate every 3 seconds
+ if self.rateUpdated.Add(time.Second * 3).Before(now) {
+ self.rate = calcRate(newProgress - self.rateProgress, self.rateUpdated, now)
+ self.rateUpdated = now
+ self.rateProgress = newProgress
+ }
+
+ // Draw progress every second
+ if self.updated.Add(time.Second).Before(now) || isLast {
+ self.Draw(isLast)
+ }
+
+ // Update last draw time
+ self.updated = now
+
+ // Mark as done if error occurs
+ self.done = isLast
+
+ return n, err
+}
+
+func (self *Progress) Draw(isLast bool) {
+ if self.done {
+ return
+ }
+
+ // Clear line
+ fmt.Fprintf(self.Writer, "\r%50s", "")
+
+ // Print progress
+ fmt.Fprintf(self.Writer, "\r%s/%s", formatSize(self.progress, false), formatSize(self.Size, false))
+
+ // Print rate
+ if self.rate > 0 {
+ fmt.Fprintf(self.Writer, ", Rate: %s/s", formatSize(self.rate, false))
+ }
+
+ if isLast {
+ fmt.Fprintf(self.Writer, "\n")
+ }
+}