commands/release/releaseutils/releaseutils.go (111 lines of code) (raw):
package releaseutils
import (
"fmt"
"io"
"os"
"strings"
"gitlab.com/gitlab-org/cli/commands/cmdutils"
"gitlab.com/gitlab-org/cli/commands/release/releaseutils/upload"
"gitlab.com/gitlab-org/cli/internal/glrepo"
"gitlab.com/gitlab-org/cli/pkg/iostreams"
"gitlab.com/gitlab-org/cli/pkg/tableprinter"
"gitlab.com/gitlab-org/cli/pkg/utils"
gitlab "gitlab.com/gitlab-org/api/client-go"
)
func DisplayAllReleases(io *iostreams.IOStreams, releases []*gitlab.Release, repoName string) string {
c := io.Color()
table := tableprinter.NewTablePrinter()
table.AddRow("Name", "Tag", "Created")
for _, r := range releases {
table.AddRow(r.Name, r.TagName, c.Gray(utils.TimeToPrettyTimeAgo(*r.CreatedAt)))
}
return table.Render()
}
func RenderReleaseAssertLinks(assets []*gitlab.ReleaseLink) string {
if len(assets) == 0 {
return "There are no assets for this release"
}
t := tableprinter.NewTablePrinter()
for _, asset := range assets {
t.AddRow(asset.Name, asset.DirectAssetURL)
// assetsPrint += asset.DirectAssetURL + "\n"
}
return t.String()
}
func DisplayRelease(io *iostreams.IOStreams, r *gitlab.Release, repo glrepo.Interface) string {
c := io.Color()
duration := utils.TimeToPrettyTimeAgo(*r.CreatedAt)
description, err := utils.RenderMarkdown(r.Description, io.BackgroundColor())
if err != nil {
description = r.Description
}
var assetsSources string
for _, asset := range r.Assets.Sources {
assetsSources += asset.URL + "\n"
}
footer := fmt.Sprintf(c.Gray("View this release on GitLab at %s"), r.Links.Self)
return fmt.Sprintf("%s\n%s released this %s\n%s - %s\n%s\n%s\n%s\n%s\n%s\n\n%s", // whoops
c.Bold(r.Name), r.Author.Name, duration, r.Commit.ShortID, r.TagName, description, c.Bold("ASSETS"),
RenderReleaseAssertLinks(r.Assets.Links), c.Bold("SOURCES"), assetsSources, footer,
)
}
func AssetsFromArgs(args []string) (assets []*upload.ReleaseFile, err error) {
for _, arg := range args {
var label string
var linkType string
fn := arg
if arr := strings.SplitN(arg, "#", 3); len(arr) > 0 {
fn = arr[0]
if len(arr) > 1 {
label = arr[1]
}
if len(arr) > 2 {
linkType = arr[2]
}
}
var fi os.FileInfo
fi, err = os.Stat(fn)
if err != nil {
return
}
if label == "" {
label = fi.Name()
}
rf := &upload.ReleaseFile{
Open: func() (io.ReadCloser, error) {
return os.Open(fn)
},
Name: fi.Name(),
Label: label,
Path: fn,
}
// Only add a link type if it was specified
// Otherwise the GitLab API will default to 'other' if it was omitted
if linkType != "" {
linkTypeVal := gitlab.LinkTypeValue(linkType)
rf.Type = &linkTypeVal
}
assets = append(assets, rf)
}
return
}
func CreateReleaseAssets(io *iostreams.IOStreams, client *gitlab.Client, assetFiles []*upload.ReleaseFile, assetLinks []*upload.ReleaseAsset, repoName string, tagName string) error {
if assetFiles == nil && assetLinks == nil {
return nil
}
uploadCtx := upload.Context{
IO: io,
Client: client,
AssetsLinks: assetLinks,
AssetFiles: assetFiles,
}
color := io.Color()
io.Logf("%s Uploading release assets %s=%s %s=%s\n",
color.ProgressIcon(),
color.Blue("repo"), repoName,
color.Blue("tag"), tagName)
if err := uploadCtx.UploadFiles(repoName, tagName); err != nil {
return cmdutils.WrapError(err, "upload failed")
}
// create asset link for assets provided as json
if err := uploadCtx.CreateReleaseAssetLinks(repoName, tagName); err != nil {
return cmdutils.WrapError(err, "failed to create release link")
}
return nil
}