116 lines
2.4 KiB
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
|
|
}
|