Files
gitea-release-resource/check_command.go

116 lines
2.4 KiB
Go

package resource
import (
"sort"
"code.gitea.io/sdk/gitea"
"github.com/cppforlife/go-semi-semantic/version"
)
type CheckCommand struct {
gitea Gitea
}
func NewCheckCommand(gitea Gitea) *CheckCommand {
return &CheckCommand{
gitea: gitea,
}
}
func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
var tags []*gitea.Tag
var err error
if (request.Version == Version{}) {
tags, err = c.gitea.ListTags()
} else {
tags, err = c.gitea.ListTagsUntil(request.Version.Tag)
}
if err != nil {
return []Version{}, err
}
if len(tags) == 0 {
return []Version{}, nil
}
var filteredTags []*gitea.Tag
// TODO: make ListTagsUntil work better with this
versionParser, err := newVersionParser(request.Source.TagFilter)
if err != nil {
return []Version{}, err
}
for _, tag := range tags {
if _, err := version.NewVersionFromString(versionParser.parse(tag.Name)); err != nil {
continue
}
/* if tag.Release == nil {
continue
}*/
filteredTags = append(filteredTags, tag)
}
sort.Slice(filteredTags, func(i, j int) bool {
first, err := version.NewVersionFromString(versionParser.parse(filteredTags[i].Name))
if err != nil {
return true
}
second, err := version.NewVersionFromString(versionParser.parse(filteredTags[j].Name))
if err != nil {
return false
}
return first.IsLt(second)
})
if len(filteredTags) == 0 {
return []Version{}, nil
}
latestTag := filteredTags[len(filteredTags)-1]
latestResource, err := c.gitea.GetReleaseByTag(latestTag.Name)
if err != nil {
return []Version{}, err
}
if (request.Version == Version{}) {
return []Version{versionFromTag(latestResource)}, nil
}
if latestTag.Name == request.Version.Tag {
return []Version{versionFromTag(latestResource)}, nil
}
upToLatest := false
nextVersions := []Version{} // contains the requested version and all newer ones
for _, release := range filteredTags {
if !upToLatest {
version := release.Name
upToLatest = request.Version.Tag == version
}
if upToLatest {
nextVersions = append(nextVersions, Version{Tag: release.Name})
}
}
if !upToLatest {
// current version was removed; start over from latest
resource, err := c.gitea.GetReleaseByTag(filteredTags[len(filteredTags)-1].Name)
if err != nil {
return []Version{}, err
}
nextVersions = append(
nextVersions,
versionFromTag(resource),
)
}
return nextVersions, nil
}