diff --git a/go.mod b/go.mod index 64a6bc3..a6fe6a7 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,6 @@ go 1.16 require ( github.com/kr/pretty v0.3.0 github.com/rogpeppe/go-internal v1.8.1 + github.com/schollz/progressbar/v3 v3.13.0 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect ) diff --git a/go.sum b/go.sum index 33573aa..db4d15d 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -6,11 +10,31 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/schollz/progressbar/v3 v3.13.0 h1:9TeeWRcjW2qd05I8Kf9knPkW4vLM/hYoa6z9ABvxje8= +github.com/schollz/progressbar/v3 v3.13.0/go.mod h1:ZBYnSuLAX2LU8P8UiKN/KgF2DY58AJC8yfVYLPC8Ly4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/update.go b/update.go index f94d02d..1347ca1 100644 --- a/update.go +++ b/update.go @@ -9,12 +9,15 @@ import ( "encoding/gob" "fmt" "io" - "io/ioutil" "net/http" "os" + "path" "path/filepath" + "runtime" "sort" + "time" + "github.com/schollz/progressbar/v3" "mvdan.cc/fdroidcl/fdroid" ) @@ -81,17 +84,15 @@ var errNotModified = fmt.Errorf("not modified") var httpClient = &http.Client{} -func downloadEtag(url, path string, sum []byte) error { - fmt.Printf("Downloading %s... ", url) - defer fmt.Println() +func downloadEtag(url, target_path string, sum []byte) error { req, err := http.NewRequest("GET", url, nil) if err != nil { return err } - etagPath := path + "-etag" - if _, err := os.Stat(path); err == nil { - etag, _ := ioutil.ReadFile(etagPath) + etagPath := target_path + "-etag" + if _, err := os.Stat(target_path); err == nil { + etag, _ := os.ReadFile(etagPath) req.Header.Add("If-None-Match", string(etag)) } @@ -100,41 +101,54 @@ func downloadEtag(url, path string, sum []byte) error { return err } defer resp.Body.Close() + filename := path.Base(url) if resp.StatusCode >= 400 { - return fmt.Errorf("download failed: %d %s", - resp.StatusCode, http.StatusText(resp.StatusCode)) + return fmt.Errorf("%s download failed: %d %s", + filename, resp.StatusCode, http.StatusText(resp.StatusCode)) } if resp.StatusCode == http.StatusNotModified { - fmt.Printf("not modified") + fmt.Printf("%s not modified\n", filename) return errNotModified } - f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) + f, err := os.OpenFile(target_path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) if err != nil { return err } defer f.Close() + bar := progressbar.NewOptions64( + resp.ContentLength, + progressbar.OptionSetDescription(fmt.Sprintf("%-50s", filename)), + progressbar.OptionSetWriter(os.Stdout), + progressbar.OptionShowBytes(true), + progressbar.OptionThrottle(50*time.Millisecond), + progressbar.OptionShowCount(), + progressbar.OptionOnCompletion(func() { + fmt.Fprint(os.Stdout, "\n") + }), + progressbar.OptionSpinnerType(14), + progressbar.OptionSetRenderBlankState(true), + progressbar.OptionUseANSICodes(runtime.GOOS != "windows"), + progressbar.OptionFullWidth(), + ) if sum == nil { - _, err := io.Copy(f, resp.Body) + _, err := io.Copy(io.MultiWriter(f, bar), resp.Body) if err != nil { return err } } else { - data, err := ioutil.ReadAll(resp.Body) + hash := sha256.New() + _, err := io.Copy(io.MultiWriter(f, bar, hash), resp.Body) if err != nil { return err } - got := sha256.Sum256(data) + got := hash.Sum(nil) if !bytes.Equal(sum, got[:]) { - return fmt.Errorf("sha256 mismatch") - } - if _, err := f.Write(data); err != nil { - return err + return fmt.Errorf("%s sha256 mismatch", filename) } } - if err := ioutil.WriteFile(etagPath, []byte(respEtag(resp)), 0o644); err != nil { + if err := os.WriteFile(etagPath, []byte(respEtag(resp)), 0o644); err != nil { return err } - fmt.Printf("done") return nil }