linkwallet/version/version.go

94 lines
1.8 KiB
Go

package version
import (
"context"
"fmt"
"log"
"strings"
"sync"
"github.com/google/go-github/v44/github"
"golang.org/x/mod/semver"
)
var version string // populated by goreleaser, without leading 'v'
var commit string
var date string
var VersionInfo Info
func init() {
VersionInfo.Remote.Valid = false
VersionInfo.Local.Version = "v" + version
}
type Info struct {
Local struct {
Version string
}
Remote struct {
Valid bool
Tag string
}
UpgradeReleaseNotes string
m sync.Mutex
}
func (vi *Info) UpgradeAvailable() bool {
vi.m.Lock()
defer vi.m.Unlock()
if !vi.Remote.Valid {
return false
}
log.Printf("checking if upgrade available - local %s remote %s", vi.Local.Version, vi.Remote.Tag)
localValid := semver.IsValid(vi.Local.Version)
remoteValid := semver.IsValid(vi.Remote.Tag)
if !localValid {
log.Printf("version %s invalid", vi.Local.Version)
}
if !remoteValid {
log.Printf("version %s invalid", vi.Remote.Tag)
}
if !localValid || !remoteValid {
return false
}
return semver.Compare(vi.Local.Version, vi.Remote.Tag) < 0
}
func (vi *Info) UpdateVersionInfo() {
client := github.NewClient(nil)
rels, _, err := client.Repositories.ListReleases(context.Background(), "tardisx", "linkwallet", nil)
if err != nil {
return
}
if len(rels) == 0 {
return
}
vi.m.Lock()
vi.Remote.Tag = *rels[0].TagName
vi.Remote.Valid = true
vi.UpgradeReleaseNotes = ""
for _, r := range rels {
if semver.Compare(VersionInfo.Local.Version, *r.TagName) < 0 {
vi.UpgradeReleaseNotes += fmt.Sprintf("*Version %s*\n\n", *r.TagName)
bodyLines := strings.Split(*r.Body, "\n")
for _, l := range bodyLines {
if strings.Index(l, "#") == 0 && strings.Contains(l, "Changelog") {
// do nothing, ignore the changelog heading
} else {
vi.UpgradeReleaseNotes += l + "\n"
}
}
}
}
vi.m.Unlock()
}