Skip to content

Commit 4283738

Browse files
feat: extract batched plugin archive
1 parent 8f1db0a commit 4283738

File tree

3 files changed

+78
-4
lines changed

3 files changed

+78
-4
lines changed

pkg/plugin/discovery/discovery.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ func (d *Discovery) FindPluginsWithBatchResolver(resolverName string, pInfos []*
127127
if err != nil {
128128
return err
129129
}
130-
// TODO
131-
_ = batchDownloadInfo
132-
return nil
130+
131+
return downloadBatchPlugins(missingPlugins, batchDownloadInfo, d.config.ShowProgress)
133132
}

pkg/plugin/discovery/download.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,78 @@ func downloadPlugin(pluginInfo *plugin.Info, downloadInfo *resolver.PluginDownlo
127127
}
128128
return targetFile, nil
129129
}
130+
131+
//gocyclo:ignore
132+
func downloadBatchPlugins(pluginInfos []*plugin.Info, downloadInfo *resolver.BatchPluginDownloadInfo, showProgress bool) error {
133+
req, err := grab.NewRequest(PluginDir, downloadInfo.URL)
134+
if err != nil {
135+
return err
136+
}
137+
if downloadInfo.Checksum != "" {
138+
sum, decErr := hex.DecodeString(downloadInfo.Checksum)
139+
if decErr != nil {
140+
return fmt.Errorf("could not decode checksum: %w", decErr)
141+
}
142+
req.SetChecksum(sha256.New(), sum, true)
143+
}
144+
145+
res := grab.DefaultClient.Do(req)
146+
if showProgress {
147+
showDownloadProgressBar("batched-plugins", res)
148+
}
149+
err = res.Err()
150+
if err != nil {
151+
return err
152+
}
153+
defer os.Remove(res.Filename)
154+
155+
tgzFile, err := os.Open(res.Filename)
156+
if err != nil {
157+
return err
158+
}
159+
defer tgzFile.Close()
160+
161+
gunzip, err := gzip.NewReader(tgzFile)
162+
if err != nil {
163+
return err
164+
}
165+
defer gunzip.Close()
166+
167+
tarReader := tar.NewReader(gunzip)
168+
for {
169+
header, tarErr := tarReader.Next()
170+
if errors.Is(tarErr, io.EOF) {
171+
break
172+
}
173+
if tarErr != nil {
174+
return tarErr
175+
}
176+
if header.Typeflag != tar.TypeReg {
177+
continue
178+
}
179+
180+
outFileName := path.Join(PluginDir, header.Name)
181+
outDirName := path.Dir(outFileName)
182+
if err = os.MkdirAll(outDirName, 0o755); err != nil {
183+
return err
184+
}
185+
186+
outFile, oErr := os.OpenFile(outFileName, os.O_CREATE|os.O_WRONLY, 0o755)
187+
if oErr != nil {
188+
return oErr
189+
}
190+
_, cErr := io.Copy(outFile, tarReader)
191+
_ = outFile.Close()
192+
if cErr != nil {
193+
return cErr
194+
}
195+
196+
for _, pluginInfo := range pluginInfos {
197+
if strings.HasPrefix(path.Join(PluginDir, header.Name), pluginInfo.PluginPath) {
198+
pluginInfo.BinPath = outFileName
199+
}
200+
}
201+
202+
}
203+
return nil
204+
}

pkg/plugin/discovery/local.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const PluginDir = ".semrel"
1717
var osArchDir = runtime.GOOS + "_" + runtime.GOARCH
1818

1919
func setAndEnsurePluginPath(pluginInfo *plugin.Info) error {
20-
pluginPath := path.Join(PluginDir, osArchDir, pluginInfo.NormalizedName)
20+
pluginPath := path.Join(PluginDir, osArchDir, pluginInfo.ShortNormalizedName)
2121
if _, err := os.Stat(pluginPath); os.IsNotExist(err) {
2222
err = os.MkdirAll(pluginPath, 0o755)
2323
if err != nil {

0 commit comments

Comments
 (0)