in commands/release/download/download.go [85:169]
func downloadRun(opts *DownloadOpts) error {
client, err := opts.HTTPClient()
if err != nil {
return err
}
repo, err := opts.BaseRepo()
if err != nil {
return err
}
color := opts.IO.Color()
var resp *gitlab.Response
var release *gitlab.Release
var downloadableAssets []*upload.ReleaseAsset
if opts.TagName == "" {
opts.IO.Logf("%s fetching latest release %s=%s\n",
color.ProgressIcon(),
color.Blue("repo"), repo.FullName())
releases, _, err := client.Releases.ListReleases(repo.FullName(), &gitlab.ListReleasesOptions{})
if err != nil {
return cmdutils.WrapError(err, "could not fetch latest release.")
}
if len(releases) < 1 {
return cmdutils.WrapError(errors.New("not found"), fmt.Sprintf("no release found for %q", repo.FullName()))
}
release = releases[0]
opts.TagName = release.TagName
} else {
opts.IO.Logf("%s fetching release %s=%s %s=%s.\n",
color.ProgressIcon(),
color.Blue("repo"), repo.FullName(),
color.Blue("tag"), opts.TagName)
release, resp, err = client.Releases.GetRelease(repo.FullName(), opts.TagName)
if err != nil {
if resp != nil && (resp.StatusCode == http.StatusNotFound || resp.StatusCode == http.StatusForbidden) {
return cmdutils.WrapError(err, "release does not exist.")
}
return cmdutils.WrapError(err, "failed to fetch release.")
}
}
for _, link := range release.Assets.Links {
if len(opts.AssetNames) > 0 && (!matchAny(opts.AssetNames, link.Name)) {
continue
}
downloadableAssets = append(downloadableAssets, &upload.ReleaseAsset{
Name: &link.Name,
URL: &link.URL,
})
}
for _, source := range release.Assets.Sources {
source := source
name := path.Base(source.URL)
if len(opts.AssetNames) > 0 && (!matchAny(opts.AssetNames, name)) {
continue
}
downloadableAssets = append(downloadableAssets, &upload.ReleaseAsset{
Name: &name,
URL: &source.URL,
})
}
if len(downloadableAssets) < 1 {
opts.IO.Logf("%s no release assets found!\n",
color.DotWarnIcon())
return nil
}
opts.IO.Logf("%s downloading release assets %s=%s %s=%s\n",
color.ProgressIcon(),
color.Blue("repo"), repo.FullName(),
color.Blue("tag"), opts.TagName)
err = downloadAssets(api.GetClient(), opts.IO, downloadableAssets, opts.Dir)
if err != nil {
return cmdutils.WrapError(err, "failed to download release.")
}
opts.IO.Logf(color.Bold("%s release %q downloaded\n"), color.RedCheck(), release.Name)
return nil
}