mirror of
https://github.com/MedzikUser/go-github-selfupdate.git
synced 2024-08-15 03:25:29 +00:00
refactoring: parse a version when an asset is detected
This commit is contained in:
parent
56328bb821
commit
7bcefbd709
1 changed files with 27 additions and 22 deletions
|
@ -12,32 +12,41 @@ import (
|
||||||
|
|
||||||
var reVersion = regexp.MustCompile(`\d+\.\d+\.\d+`)
|
var reVersion = regexp.MustCompile(`\d+\.\d+\.\d+`)
|
||||||
|
|
||||||
func findAssetFromReleasse(rel *github.RepositoryRelease, suffixes []string) (*github.ReleaseAsset, bool) {
|
func findAssetFromReleasse(rel *github.RepositoryRelease, suffixes []string) (*github.ReleaseAsset, semver.Version, bool) {
|
||||||
if rel.GetDraft() {
|
if rel.GetDraft() {
|
||||||
log.Println("Skip draft version", rel.GetTagName())
|
log.Println("Skip draft version", rel.GetTagName())
|
||||||
return nil, false
|
return nil, semver.Version{}, false
|
||||||
}
|
}
|
||||||
if rel.GetPrerelease() {
|
if rel.GetPrerelease() {
|
||||||
log.Println("Skip pre-release version", rel.GetTagName())
|
log.Println("Skip pre-release version", rel.GetTagName())
|
||||||
return nil, false
|
return nil, semver.Version{}, false
|
||||||
}
|
}
|
||||||
if !reVersion.MatchString(rel.GetTagName()) {
|
|
||||||
|
verText := rel.GetTagName()
|
||||||
|
indices := reVersion.FindStringIndex(verText)
|
||||||
|
if indices == nil {
|
||||||
log.Println("Skip version not adopting semver", rel.GetTagName())
|
log.Println("Skip version not adopting semver", rel.GetTagName())
|
||||||
return nil, false
|
return nil, semver.Version{}, false
|
||||||
}
|
}
|
||||||
|
if indices[0] > 0 {
|
||||||
|
log.Println("Strip prefix of version", verText[:indices[0]], "from", verText)
|
||||||
|
verText = verText[indices[0]:]
|
||||||
|
}
|
||||||
|
|
||||||
for _, asset := range rel.Assets {
|
for _, asset := range rel.Assets {
|
||||||
name := asset.GetName()
|
name := asset.GetName()
|
||||||
for _, s := range suffixes {
|
for _, s := range suffixes {
|
||||||
if strings.HasSuffix(name, s) {
|
if strings.HasSuffix(name, s) {
|
||||||
return &asset, true
|
return &asset, semver.MustParse(verText), true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("No suitable asset was found in release", rel.GetTagName())
|
log.Println("No suitable asset was found in release", rel.GetTagName())
|
||||||
return nil, false
|
return nil, semver.Version{}, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func findReleaseAndAsset(rels []*github.RepositoryRelease) (*github.RepositoryRelease, *github.ReleaseAsset, bool) {
|
func findReleaseAndAsset(rels []*github.RepositoryRelease) (*github.RepositoryRelease, *github.ReleaseAsset, semver.Version, bool) {
|
||||||
// Generate valid suffix candidates to match
|
// Generate valid suffix candidates to match
|
||||||
suffixes := make([]string, 0, 2*7*2)
|
suffixes := make([]string, 0, 2*7*2)
|
||||||
for _, sep := range []rune{'_', '-'} {
|
for _, sep := range []rune{'_', '-'} {
|
||||||
|
@ -51,14 +60,18 @@ func findReleaseAndAsset(rels []*github.RepositoryRelease) (*github.RepositoryRe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// var ver sermver.Version
|
||||||
|
// var asset *github.ReleaseAsset
|
||||||
|
// var release *github.RepositoryRelease
|
||||||
|
|
||||||
for _, rel := range rels {
|
for _, rel := range rels {
|
||||||
if asset, ok := findAssetFromReleasse(rel, suffixes); ok {
|
if asset, ver, ok := findAssetFromReleasse(rel, suffixes); ok {
|
||||||
return rel, asset, true
|
return rel, asset, ver, true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("Could not find any release for", runtime.GOOS, "and", runtime.GOARCH)
|
log.Println("Could not find any release for", runtime.GOOS, "and", runtime.GOARCH)
|
||||||
return nil, nil, false
|
return nil, nil, semver.Version{}, false
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetectLatest tries to get the latest version of the repository on GitHub. 'slug' means 'owner/name' formatted string.
|
// DetectLatest tries to get the latest version of the repository on GitHub. 'slug' means 'owner/name' formatted string.
|
||||||
|
@ -86,20 +99,13 @@ func (up *Updater) DetectLatest(slug string) (release *Release, found bool, err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rel, asset, found := findReleaseAndAsset(rels)
|
rel, asset, ver, found := findReleaseAndAsset(rels)
|
||||||
if !found {
|
if !found {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tag := rel.GetTagName()
|
|
||||||
url := asset.GetBrowserDownloadURL()
|
url := asset.GetBrowserDownloadURL()
|
||||||
log.Println("Successfully fetched the latest release. tag:", tag, ", name:", rel.GetName(), ", URL:", rel.GetURL(), ", Asset:", url)
|
log.Println("Successfully fetched the latest release. tag:", rel.GetTagName(), ", name:", rel.GetName(), ", URL:", rel.GetURL(), ", Asset:", url)
|
||||||
|
|
||||||
// Strip version prefix
|
|
||||||
if indices := reVersion.FindStringIndex(tag); indices != nil && indices[0] > 0 {
|
|
||||||
log.Println("Strip prefix of version:", tag[:indices[0]])
|
|
||||||
tag = tag[indices[0]:]
|
|
||||||
}
|
|
||||||
|
|
||||||
publishedAt := rel.GetPublishedAt().Time
|
publishedAt := rel.GetPublishedAt().Time
|
||||||
release = &Release{
|
release = &Release{
|
||||||
|
@ -112,9 +118,8 @@ func (up *Updater) DetectLatest(slug string) (release *Release, found bool, err
|
||||||
PublishedAt: &publishedAt,
|
PublishedAt: &publishedAt,
|
||||||
RepoOwner: repo[0],
|
RepoOwner: repo[0],
|
||||||
RepoName: repo[1],
|
RepoName: repo[1],
|
||||||
|
Version: ver,
|
||||||
}
|
}
|
||||||
|
|
||||||
release.Version, err = semver.Make(tag)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue