Skip to content

Commit a45c5ee

Browse files
authored
move checksums to url_checksums in the config file (#50)
1 parent f1131f9 commit a45c5ee

File tree

7 files changed

+96
-39
lines changed

7 files changed

+96
-39
lines changed

bindown.go

+36-6
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,15 @@ func loadConfigFromJSON(data []byte) (*Config, error) {
8686

8787
//Config is downloaders configuration
8888
type Config struct {
89-
Downloaders map[string][]*Downloader `json:"downloaders,omitempty" yaml:"downloaders"`
89+
Downloaders map[string][]*Downloader `json:"downloaders,omitempty" yaml:"downloaders"`
90+
URLChecksums map[string]string `json:"url_checksums,omitempty" yaml:"url_checksums,omitempty"`
91+
}
92+
93+
func (c *Config) urlChecksum(url string) string {
94+
if c.URLChecksums == nil {
95+
c.URLChecksums = map[string]string{}
96+
}
97+
return c.URLChecksums[url]
9098
}
9199

92100
// Downloader returns a Downloader for the given binary, os and arch.
@@ -106,8 +114,11 @@ func (c *Config) Downloader(binary, os, arch string) *Downloader {
106114
return nil
107115
}
108116

109-
//UpdateChecksums updates checksums
110-
func (c *Config) UpdateChecksums(downloaderName, cellarDir string) error {
117+
//AddDownloaderChecksums adds checksums to c.URLChecksums
118+
func (c *Config) AddDownloaderChecksums(downloaderName, cellarDir string) error {
119+
if c.URLChecksums == nil {
120+
c.URLChecksums = make(map[string]string, 1)
121+
}
111122
names := c.allDownloaderNames()
112123
if downloaderName != "" {
113124
names = []string{downloaderName}
@@ -118,14 +129,25 @@ func (c *Config) UpdateChecksums(downloaderName, cellarDir string) error {
118129
if !ok {
119130
return fmt.Errorf("nothing configured for %q", binary)
120131
}
121-
for _, downloader := range downloaders {
122-
err := downloader.UpdateChecksum(UpdateChecksumOpts{
132+
for i := range downloaders {
133+
url, err := downloaders[i].url()
134+
if err != nil {
135+
return err
136+
}
137+
if c.URLChecksums[url] != "" {
138+
downloaders[i].Checksum = ""
139+
continue
140+
}
141+
sum, err := downloaders[i].getUpdatedChecksum(UpdateChecksumOpts{
123142
CellarDir: cellarDir,
124143
})
125144
if err != nil {
126145
return err
127146
}
147+
downloaders[i].Checksum = ""
148+
c.URLChecksums[url] = sum
128149
}
150+
c.Downloaders[binary] = downloaders
129151
}
130152
return nil
131153
}
@@ -153,7 +175,15 @@ func (c *Config) Validate(downloaderName string, cellarDir string) error {
153175
return fmt.Errorf("nothing configured for %q", binary)
154176
}
155177
for _, downloader := range dls {
156-
err := downloader.Validate(ValidateOpts{
178+
dl := downloader.clone()
179+
url, err := downloader.url()
180+
if err != nil {
181+
return err
182+
}
183+
if dl.Checksum == "" {
184+
dl.Checksum = c.urlChecksum(url)
185+
}
186+
err = dl.Validate(ValidateOpts{
157187
DownloaderName: binary,
158188
CellarDir: cellarDir,
159189
})

bindown.yml

+13-12
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,20 @@ downloaders:
44
arch: amd64
55
url: https://github.com/myitcv/gobin/releases/download/v0.0.10/darwin-amd64
66
archive_path: darwin-amd64
7-
checksum: 84ed966949e06bebd7d006bc343caf9d736932fd8b37df5cb5b268a28d07bd30
87
- os: linux
98
arch: amd64
109
url: https://github.com/myitcv/gobin/releases/download/v0.0.10/linux-amd64
1110
archive_path: linux-amd64
12-
checksum: 415266d9af98578067051653f5057ea267c51ebf085408df48b118a8b978bac6
1311
- os: windows
1412
arch: amd64
1513
url: https://github.com/myitcv/gobin/releases/download/v0.0.13/windows-amd64
1614
archive_path: windows-amd64
17-
checksum: 70d3688c652bba96f377eb5d3a8068a07274024876c6e3b8d3785f0a63348905
1815
golangci-lint:
1916
- os: darwin
2017
arch: amd64
2118
url: https://github.com/golangci/golangci-lint/releases/download/v{{.version}}/golangci-lint-{{.version}}-{{.os}}-{{.arch}}{{.urlsuffix}}
2219
archive_path: golangci-lint-{{.version}}-{{.os}}-{{.arch}}/golangci-lint{{.archivepathsuffix}}
2320
link: true
24-
checksum: 7536c375997cca3d2e1f063958ad0344108ce23aed6bd372b69153bdbda82d13
2521
vars:
2622
archivepathsuffix: ""
2723
urlsuffix: .tar.gz
@@ -31,7 +27,6 @@ downloaders:
3127
url: https://github.com/golangci/golangci-lint/releases/download/v{{.version}}/golangci-lint-{{.version}}-{{.os}}-{{.arch}}{{.urlsuffix}}
3228
archive_path: golangci-lint-{{.version}}-{{.os}}-{{.arch}}/golangci-lint{{.archivepathsuffix}}
3329
link: true
34-
checksum: 34df1794a2ea8e168b3c98eed3cc0f3e13ed4cba735e4e40ef141df5c41bc086
3530
vars:
3631
archivepathsuffix: ""
3732
urlsuffix: .tar.gz
@@ -41,7 +36,6 @@ downloaders:
4136
url: https://github.com/golangci/golangci-lint/releases/download/v{{.version}}/golangci-lint-{{.version}}-{{.os}}-{{.arch}}{{.urlsuffix}}
4237
archive_path: golangci-lint-{{.version}}-{{.os}}-{{.arch}}/golangci-lint{{.archivepathsuffix}}
4338
link: true
44-
checksum: 8ccb76466e4cdaebfc1633c137043c0bec23173749a6bca42846c7350402dcfe
4539
vars:
4640
archivepathsuffix: .exe
4741
urlsuffix: .zip
@@ -50,27 +44,34 @@ downloaders:
5044
- os: darwin
5145
arch: amd64
5246
url: https://github.com/goreleaser/goreleaser/releases/download/v0.120.7/goreleaser_Darwin_x86_64.tar.gz
53-
checksum: 2ec8bb354cca2936d0722e7da770c37e2ba6cc90de4a1cea186e20968c47b663
5447
- os: linux
5548
arch: amd64
5649
url: https://github.com/goreleaser/goreleaser/releases/download/v0.120.7/goreleaser_Linux_x86_64.tar.gz
57-
checksum: 771f2ad8219078b16a3e82097e9805309f6516640f0c6ab6b87f9b085a8ad743
5850
- os: windows
5951
arch: amd64
6052
url: https://github.com/goreleaser/goreleaser/releases/download/v0.120.7/goreleaser_Windows_x86_64.zip
6153
archive_path: goreleaser.exe
62-
checksum: 0e06f50e1b2213a84b493d32a805dd6d8e8ad960ec9526edd8ecd96e2ab91743
6354
semver-next:
6455
- os: darwin
6556
arch: amd64
6657
url: https://github.com/WillAbides/semver-next/releases/download/v0.4.0/semver-next_0.4.0_darwin_amd64.tar.gz
67-
checksum: a519f2c3bbe8972deb094d56c196fec89496f663431321c22be343ced23839fb
6858
- os: linux
6959
arch: amd64
7060
url: https://github.com/WillAbides/semver-next/releases/download/v0.4.0/semver-next_0.4.0_linux_amd64.tar.gz
71-
checksum: 6317c36bec63158038381e8878601151ae996310fef58306f70cb03f1b46ef7f
7261
- os: windows
7362
arch: amd64
7463
url: https://github.com/WillAbides/semver-next/releases/download/v0.4.0/semver-next_0.4.0_windows_amd64.tar.gz
7564
archive_path: semver-next.exe
76-
checksum: 573ea65ef3b40442626fbb19d07880bb4929e7b12fd7161e41732a03f23b2c95
65+
url_checksums:
66+
https://github.com/WillAbides/semver-next/releases/download/v0.4.0/semver-next_0.4.0_darwin_amd64.tar.gz: a519f2c3bbe8972deb094d56c196fec89496f663431321c22be343ced23839fb
67+
https://github.com/WillAbides/semver-next/releases/download/v0.4.0/semver-next_0.4.0_linux_amd64.tar.gz: 6317c36bec63158038381e8878601151ae996310fef58306f70cb03f1b46ef7f
68+
https://github.com/WillAbides/semver-next/releases/download/v0.4.0/semver-next_0.4.0_windows_amd64.tar.gz: 573ea65ef3b40442626fbb19d07880bb4929e7b12fd7161e41732a03f23b2c95
69+
https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-darwin-amd64.tar.gz: 7536c375997cca3d2e1f063958ad0344108ce23aed6bd372b69153bdbda82d13
70+
https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-linux-amd64.tar.gz: 34df1794a2ea8e168b3c98eed3cc0f3e13ed4cba735e4e40ef141df5c41bc086
71+
https://github.com/golangci/golangci-lint/releases/download/v1.23.7/golangci-lint-1.23.7-windows-amd64.zip: 8ccb76466e4cdaebfc1633c137043c0bec23173749a6bca42846c7350402dcfe
72+
https://github.com/goreleaser/goreleaser/releases/download/v0.120.7/goreleaser_Darwin_x86_64.tar.gz: 2ec8bb354cca2936d0722e7da770c37e2ba6cc90de4a1cea186e20968c47b663
73+
https://github.com/goreleaser/goreleaser/releases/download/v0.120.7/goreleaser_Linux_x86_64.tar.gz: 771f2ad8219078b16a3e82097e9805309f6516640f0c6ab6b87f9b085a8ad743
74+
https://github.com/goreleaser/goreleaser/releases/download/v0.120.7/goreleaser_Windows_x86_64.zip: 0e06f50e1b2213a84b493d32a805dd6d8e8ad960ec9526edd8ecd96e2ab91743
75+
https://github.com/myitcv/gobin/releases/download/v0.0.10/darwin-amd64: 84ed966949e06bebd7d006bc343caf9d736932fd8b37df5cb5b268a28d07bd30
76+
https://github.com/myitcv/gobin/releases/download/v0.0.10/linux-amd64: 415266d9af98578067051653f5057ea267c51ebf085408df48b118a8b978bac6
77+
https://github.com/myitcv/gobin/releases/download/v0.0.13/windows-amd64: 70d3688c652bba96f377eb5d3a8068a07274024876c6e3b8d3785f0a63348905

bindown_test.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func TestConfig_Downloader(t *testing.T) {
155155
assert.Nil(t, got)
156156
}
157157

158-
func TestConfig_UpdateChecksums(t *testing.T) {
158+
func TestConfig_AddDownloaderChecksums(t *testing.T) {
159159
ts := testutil.ServeFile(t, testutil.DownloadablesPath("foo.tar.gz"), "/foo/foo.tar.gz", "foo=bar")
160160
dlURL := ts.URL + "/foo/foo.tar.gz?foo=bar"
161161
getConfig := func() Config {
@@ -201,32 +201,38 @@ func TestConfig_UpdateChecksums(t *testing.T) {
201201
t.Run("updates all", func(t *testing.T) {
202202
dir := testutil.TmpDir(t)
203203
config := getConfig()
204-
err := config.UpdateChecksums("", dir)
204+
err := config.AddDownloaderChecksums("", dir)
205205
require.NoError(t, err)
206206
for _, downloaders := range config.Downloaders {
207207
for _, downloader := range downloaders {
208-
require.Equal(t, testutil.FooChecksum, downloader.Checksum)
208+
require.Empty(t, downloader.Checksum)
209+
dlURL, err := downloader.url()
210+
require.NoError(t, err)
211+
require.Equal(t, testutil.FooChecksum, config.URLChecksums[dlURL])
209212
}
210213
}
211214
})
212215

213216
t.Run("updates one", func(t *testing.T) {
214217
dir := testutil.TmpDir(t)
215218
config := getConfig()
216-
err := config.UpdateChecksums("bar", dir)
219+
err := config.AddDownloaderChecksums("bar", dir)
217220
require.NoError(t, err)
218221
for _, downloader := range config.Downloaders["foo"] {
219222
require.Equal(t, "deadbeef", downloader.Checksum)
220223
}
221224
for _, downloader := range config.Downloaders["bar"] {
222-
require.Equal(t, testutil.FooChecksum, downloader.Checksum)
225+
require.Empty(t, downloader.Checksum)
226+
dlURL, err := downloader.url()
227+
require.NoError(t, err)
228+
require.Equal(t, testutil.FooChecksum, config.URLChecksums[dlURL])
223229
}
224230
})
225231

226232
t.Run("downloader doesn't exist", func(t *testing.T) {
227233
dir := testutil.TmpDir(t)
228234
config := getConfig()
229-
err := config.UpdateChecksums("fake", dir)
235+
err := config.AddDownloaderChecksums("fake", dir)
230236
require.EqualError(t, err, `nothing configured for "fake"`)
231237
})
232238

@@ -246,7 +252,7 @@ func TestConfig_UpdateChecksums(t *testing.T) {
246252
},
247253
},
248254
}
249-
err := config.UpdateChecksums("foo", dir)
255+
err := config.AddDownloaderChecksums("foo", dir)
250256
require.Error(t, err)
251257
})
252258
}

downloader.go

+29-10
Original file line numberDiff line numberDiff line change
@@ -194,17 +194,25 @@ func (d *Downloader) setDefaultBinName(defaultName string) {
194194
}
195195
}
196196

197-
func (d *Downloader) validateChecksum(targetDir string) error {
197+
func (d *Downloader) validateChecksum(targetDir string, knownChecksums map[string]string) error {
198198
d.requireApplyTemplates()
199-
targetFile, err := d.downloadablePath(targetDir)
199+
dl := d.clone()
200+
u, err := dl.url()
201+
if err != nil {
202+
return err
203+
}
204+
if knownChecksums != nil && dl.Checksum == "" {
205+
dl.Checksum = knownChecksums[u]
206+
}
207+
targetFile, err := dl.downloadablePath(targetDir)
200208
if err != nil {
201209
return err
202210
}
203211
result, err := fileChecksum(targetFile)
204212
if err != nil {
205213
return err
206214
}
207-
if d.Checksum != result {
215+
if dl.Checksum != result {
208216
defer func() {
209217
delErr := os.RemoveAll(targetFile)
210218
if delErr != nil {
@@ -213,7 +221,7 @@ func (d *Downloader) validateChecksum(targetDir string) error {
213221
}()
214222
return fmt.Errorf(`checksum mismatch in downloaded file %q
215223
wanted: %s
216-
got: %s`, targetFile, d.Checksum, result)
224+
got: %s`, targetFile, dl.Checksum, result)
217225
}
218226
return nil
219227
}
@@ -234,10 +242,19 @@ func (d *Downloader) UpdateChecksum(opts UpdateChecksumOpts) error {
234242
return nil
235243
}
236244

245+
func (d *Downloader) url() (string, error) {
246+
dl := d.clone()
247+
err := dl.applyTemplates()
248+
if err != nil {
249+
return "", err
250+
}
251+
return dl.URL, nil
252+
}
253+
237254
//getUpdatedChecksum downloads the archive and returns its actual checksum.
238255
func (d *Downloader) getUpdatedChecksum(opts UpdateChecksumOpts) (string, error) {
239-
d = d.clone()
240-
err := d.applyTemplates()
256+
dl := d.clone()
257+
err := dl.applyTemplates()
241258
if err != nil {
242259
return "", err
243260
}
@@ -252,15 +269,15 @@ func (d *Downloader) getUpdatedChecksum(opts UpdateChecksumOpts) (string, error)
252269
}()
253270
}
254271

255-
downloadDir := filepath.Join(cellarDir, "downloads", d.downloadsSubName())
272+
downloadDir := filepath.Join(cellarDir, "downloads", dl.downloadsSubName())
256273

257-
err = d.download(downloadDir)
274+
err = dl.download(downloadDir)
258275
if err != nil {
259276
log.Printf("error downloading: %v", err)
260277
return "", err
261278
}
262279

263-
dlPath, err := d.downloadablePath(downloadDir)
280+
dlPath, err := dl.downloadablePath(downloadDir)
264281
if err != nil {
265282
return "", err
266283
}
@@ -278,6 +295,8 @@ type InstallOpts struct {
278295
TargetDir string
279296
// Force - whether to force the install even if it already exists
280297
Force bool
298+
// Map of known checksums to validate against
299+
URLChecksums map[string]string
281300
}
282301

283302
func (d *Downloader) downloadsSubName() string {
@@ -316,7 +335,7 @@ func (d *Downloader) Install(opts InstallOpts) error {
316335
return err
317336
}
318337

319-
err = d.validateChecksum(downloadDir)
338+
err = d.validateChecksum(downloadDir, opts.URLChecksums)
320339
if err != nil {
321340
log.Printf("error validating: %v", err)
322341
return err

downloader_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func Test_Downloader_validateChecksum(t *testing.T) {
5151
tmplApplied: true,
5252
}
5353
require.NoError(t, util.CopyFile(testutil.DownloadablesPath("foo.tar.gz"), filepath.Join(dir, "foo.tar.gz"), nil))
54-
err := d.validateChecksum(dir)
54+
err := d.validateChecksum(dir, nil)
5555
assert.NoError(t, err)
5656
assert.True(t, fileExists(filepath.Join(dir, "foo.tar.gz")))
5757
})
@@ -64,7 +64,7 @@ func Test_Downloader_validateChecksum(t *testing.T) {
6464
tmplApplied: true,
6565
}
6666

67-
err := d.validateChecksum(dir)
67+
err := d.validateChecksum(dir, nil)
6868
assert.Error(t, err)
6969
})
7070

@@ -76,7 +76,7 @@ func Test_Downloader_validateChecksum(t *testing.T) {
7676
tmplApplied: true,
7777
}
7878
require.NoError(t, util.CopyFile(testutil.DownloadablesPath("foo.tar.gz"), filepath.Join(dir, "foo.tar.gz"), nil))
79-
err := d.validateChecksum(dir)
79+
err := d.validateChecksum(dir, nil)
8080
assert.Error(t, err)
8181
assert.False(t, fileExists(filepath.Join(dir, "foo.tar.gz")))
8282
})

internal/cli/config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type configUpdateChecksumsCmd struct {
3737

3838
func (d *configUpdateChecksumsCmd) Run(kctx *kong.Context) error {
3939
config := configFile(kctx)
40-
err := config.UpdateChecksums(d.TargetFile, cli.Config.ConfigOpts.CellarDir)
40+
err := config.AddDownloaderChecksums(d.TargetFile, cli.Config.ConfigOpts.CellarDir)
4141
if err != nil {
4242
return err
4343
}

internal/cli/download.go

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ arch: %s`, binary, d.OS, d.Arch)
4444
TargetDir: binDir,
4545
Force: d.Force,
4646
CellarDir: d.ConfigOpts.CellarDir,
47+
URLChecksums: config.URLChecksums,
4748
}
4849

4950
return downloader.Install(installOpts)

0 commit comments

Comments
 (0)