aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drive/progress.go78
-rw-r--r--drive/util.go72
2 files changed, 78 insertions, 72 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")
+ }
+}
diff --git a/drive/util.go b/drive/util.go
index 4103b9d..8b3d171 100644
--- a/drive/util.go
+++ b/drive/util.go
@@ -1,7 +1,6 @@
package drive
import (
- "io"
"os"
"fmt"
"strings"
@@ -126,74 +125,3 @@ func fileExists(path string) bool {
func intMax() int64 {
return 1 << (strconv.IntSize - 1) - 1
}
-
-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")
- }
-}