Skip to content

Commit e127682

Browse files
authored
feat(cmd/gf): beautify progress bar of cli binary downloading for command gf up (#4094)
1 parent 6bd15b0 commit e127682

File tree

3 files changed

+18
-57
lines changed

3 files changed

+18
-57
lines changed

cmd/gf/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/gogf/gf/v2 v2.8.3
1313
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f
1414
github.com/olekukonko/tablewriter v0.0.5
15+
github.com/schollz/progressbar/v3 v3.15.0
1516
golang.org/x/mod v0.17.0
1617
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d
1718
)
@@ -40,6 +41,7 @@ require (
4041
github.com/mattn/go-isatty v0.0.20 // indirect
4142
github.com/mattn/go-runewidth v0.0.16 // indirect
4243
github.com/microsoft/go-mssqldb v1.7.1 // indirect
44+
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
4345
github.com/paulmach/orb v0.7.1 // indirect
4446
github.com/pierrec/lz4/v4 v4.1.14 // indirect
4547
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
@@ -54,6 +56,7 @@ require (
5456
golang.org/x/net v0.33.0 // indirect
5557
golang.org/x/sync v0.10.0 // indirect
5658
golang.org/x/sys v0.28.0 // indirect
59+
golang.org/x/term v0.27.0 // indirect
5760
golang.org/x/text v0.21.0 // indirect
5861
gopkg.in/yaml.v3 v3.0.1 // indirect
5962
modernc.org/libc v1.22.5 // indirect

cmd/gf/go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn
1818
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
1919
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2020
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
21+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2122
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
2223
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
2324
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
@@ -76,6 +77,7 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
7677
github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
7778
github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc=
7879
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
80+
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
7981
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
8082
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
8183
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
@@ -95,6 +97,8 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh
9597
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
9698
github.com/microsoft/go-mssqldb v1.7.1 h1:KU/g8aWeM3Hx7IMOFpiwYiUkU+9zeISb4+tx3ScVfsM=
9799
github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
100+
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
101+
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
98102
github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM=
99103
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
100104
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
@@ -113,6 +117,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq
113117
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
114118
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
115119
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
120+
github.com/schollz/progressbar/v3 v3.15.0 h1:cNZmcNiVyea6oofBTg80ZhVXxf3wG/JoAhqCCwopkQo=
121+
github.com/schollz/progressbar/v3 v3.15.0/go.mod h1:ncBdc++eweU0dQoeZJ3loXoAc+bjaallHRIm8pVVeQM=
116122
github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
117123
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
118124
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
@@ -173,9 +179,13 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc
173179
golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
174180
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
175181
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
182+
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
176183
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
177184
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
178185
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
186+
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
187+
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
188+
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
179189
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
180190
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
181191
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=

cmd/gf/internal/utility/utils/utils_http_download.go

Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
package utils
88

99
import (
10-
"fmt"
1110
"io"
1211
"net/http"
1312
"os"
14-
"strconv"
1513
"time"
1614

15+
"github.com/schollz/progressbar/v3"
16+
1717
"github.com/gogf/gf/v2/errors/gerror"
1818

1919
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
@@ -34,26 +34,16 @@ func HTTPDownloadFileWithPercent(url string, localSaveFilePath string) error {
3434
}
3535
defer headResp.Body.Close()
3636

37-
size, err := strconv.Atoi(headResp.Header.Get("Content-Length"))
38-
if err != nil {
39-
return gerror.Wrap(err, "retrieve Content-Length failed")
40-
}
41-
doneCh := make(chan int64)
42-
43-
go doPrintDownloadPercent(doneCh, localSaveFilePath, int64(size))
44-
4537
resp, err := http.Get(url)
4638
if err != nil {
4739
return gerror.Wrapf(err, `download "%s" to "%s" failed`, url, localSaveFilePath)
4840
}
4941
defer resp.Body.Close()
5042

51-
wroteBytesCount, err := io.Copy(out, resp.Body)
52-
if err != nil {
53-
return gerror.Wrapf(err, `download "%s" to "%s" failed`, url, localSaveFilePath)
54-
}
43+
bar := progressbar.NewOptions(int(resp.ContentLength), progressbar.OptionShowBytes(true), progressbar.OptionShowCount())
44+
writer := io.MultiWriter(out, bar)
45+
_, err = io.Copy(writer, resp.Body)
5546

56-
doneCh <- wroteBytesCount
5747
elapsed := time.Since(start)
5848
if elapsed > time.Minute {
5949
mlog.Printf(`download completed in %.0fm`, float64(elapsed)/float64(time.Minute))
@@ -63,45 +53,3 @@ func HTTPDownloadFileWithPercent(url string, localSaveFilePath string) error {
6353

6454
return nil
6555
}
66-
67-
func doPrintDownloadPercent(doneCh chan int64, localSaveFilePath string, total int64) {
68-
var (
69-
stop = false
70-
lastPercentFmt string
71-
)
72-
file, err := os.Open(localSaveFilePath)
73-
if err != nil {
74-
mlog.Fatal(err)
75-
}
76-
defer file.Close()
77-
78-
for {
79-
select {
80-
case <-doneCh:
81-
stop = true
82-
83-
default:
84-
fi, err := file.Stat()
85-
if err != nil {
86-
mlog.Fatal(err)
87-
}
88-
size := fi.Size()
89-
if size == 0 {
90-
size = 1
91-
}
92-
var (
93-
percent = float64(size) / float64(total) * 100
94-
percentFmt = fmt.Sprintf(`%.0f`, percent) + "%"
95-
)
96-
if lastPercentFmt != percentFmt {
97-
lastPercentFmt = percentFmt
98-
mlog.Print(percentFmt)
99-
}
100-
}
101-
102-
if stop {
103-
break
104-
}
105-
time.Sleep(time.Second)
106-
}
107-
}

0 commit comments

Comments
 (0)