From 31894509d503df68be49b244b55d8f97311d76ed Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Tue, 11 Sep 2018 12:09:34 +0200 Subject: Updater: add --dry-run parameter - go fmt pass --- tools/updater/download.go | 118 ++++++++++++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 45 deletions(-) (limited to 'tools/updater/download.go') diff --git a/tools/updater/download.go b/tools/updater/download.go index b89703b..2adfe41 100644 --- a/tools/updater/download.go +++ b/tools/updater/download.go @@ -1,62 +1,90 @@ package main import ( - "fmt" - "strings" - "os" - "io" - "net/http" - "path/filepath" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strings" ) +func Min(x, y int64) int64 { + if x < y { + return x + } + return y +} + +func Max(x, y int64) int64 { + if x > y { + return x + } + return y +} + // WriteCounter counts the number of bytes written to it type WriteCounter struct { - Filepath string - Total uint64 + ContentLength int64 + BytesWritten uint64 + + Step int64 +} + +func NewWriteCounter(contentLength int64) *WriteCounter { + ptr := new(WriteCounter) + ptr.ContentLength = contentLength + ptr.Step = Max(contentLength/20, 1) + + return ptr } func (wc *WriteCounter) Write(p []byte) (int, error) { - n := len(p) - wc.Total += uint64(n) - wc.PrintProgress() - return n, nil + n := len(p) + wc.BytesWritten += uint64(n) + wc.PrintProgress() + return n, nil } func (wc *WriteCounter) PrintProgress() { - // clear the line by using a character return to go back to the start of the - // line and remove the remaining characters - fmt.Printf("\r%s", strings.Repeat(" ", 35)) - fmt.Printf("\r[%s]... %d bytes complete", wc.Filepath, wc.Total) + // clear the line by using a character return to go back to the start of the + // line and remove the remaining characters + fmt.Printf("\r%s", strings.Repeat(" ", 35)) + + // steps can be at most 20 -> get the minimum of (n_steps) and 20 + steps := int(Min(int64(wc.BytesWritten)/wc.Step, 20)) + + fmt.Printf("\r[%s%s] %d/%d bytes complete", strings.Repeat("#", steps), strings.Repeat(" ", 20-steps), wc.BytesWritten, wc.ContentLength) } func downloadFile(path string, url string) error { - // make sure dir exists - os.MkdirAll(filepath.Dir(path), 0777) - - // create .part file - output, err := os.Create(path + ".part") - if err != nil { - return err - } - defer output.Close() - - // get data - response, err := http.Get(url) - if err != nil { - return err - } - defer response.Body.Close() - - // create progress reporter - counter := &WriteCounter{path, 0} - _, err = io.Copy(output, io.TeeReader(response.Body, counter)) - if err != nil { - return err - } - - fmt.Printf("\n") - //fmt.Printf("\r%s", strings.Repeat(" ", 40)) - os.Rename(path + ".part", path) - //fmt.Printf("\r[%s] complete\n", path) - return nil + // make sure dir exists + os.MkdirAll(filepath.Dir(path), 0755) + + // create .part file + output, err := os.Create(path + ".part") + if err != nil { + return err + } + defer output.Close() + + // get data + response, err := http.Get(url) + if err != nil { + return err + } + defer response.Body.Close() + + // create progress reporter + counter := NewWriteCounter(response.ContentLength) + _, err = io.Copy(output, io.TeeReader(response.Body, counter)) + if err != nil { + return err + } + + fmt.Printf("\n") + //fmt.Printf("\r%s", strings.Repeat(" ", 40)) + os.Rename(path+".part", path) + //fmt.Printf("\r[%s] complete\n", path) + return nil } -- cgit v1.2.1