From 6b1dff54f991d5f420252d4186aac168893d854d Mon Sep 17 00:00:00 2001 From: Justin Hawkins Date: Mon, 18 Apr 2022 13:01:07 +0930 Subject: [PATCH] Remove some potential races --- main.go | 12 +++++++----- version/version.go | 44 ++++++++++++++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index d2595ef..2eea312 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,9 @@ var downloads download.Downloads var downloadId = 0 var configService *config.ConfigService -var versionInfo = version.Info{CurrentVersion: "v0.6.0"} +var versionInfo = version.Manager{ + VersionInfo: version.Info{CurrentVersion: "v0.6.0"}, +} //go:embed web var webFS embed.FS @@ -39,7 +41,7 @@ type errorResponse struct { } func main() { - log.Printf("Starting gropple %s - https://github.com/tardisx/gropple", versionInfo.CurrentVersion) + log.Printf("Starting gropple %s - https://github.com/tardisx/gropple", versionInfo.GetInfo().CurrentVersion) configService = &config.ConfigService{} configService.DetermineConfigDir() @@ -110,8 +112,8 @@ func main() { // versionRESTHandler returns the version information, if we have up-to-date info from github func versionRESTHandler(w http.ResponseWriter, r *http.Request) { - if versionInfo.GithubVersionFetched { - b, _ := json.Marshal(versionInfo) + if versionInfo.GetInfo().GithubVersionFetched { + b, _ := json.Marshal(versionInfo.GetInfo()) w.Write(b) } else { w.WriteHeader(400) @@ -140,7 +142,7 @@ func homeHandler(w http.ResponseWriter, r *http.Request) { Downloads: downloads, BookmarkletURL: template.URL(bookmarkletURL), Config: configService.Config, - Version: versionInfo, + Version: versionInfo.GetInfo(), } err = t.ExecuteTemplate(w, "layout", info) diff --git a/version/version.go b/version/version.go index 50876e5..c596c5f 100644 --- a/version/version.go +++ b/version/version.go @@ -8,6 +8,7 @@ import ( "io" "log" "net/http" + "sync" "golang.org/x/mod/semver" ) @@ -19,8 +20,24 @@ type Info struct { GithubVersionFetched bool `json:"-"` } -func (i *Info) UpdateGitHubVersion() error { - i.GithubVersionFetched = false +type Manager struct { + VersionInfo Info + lock sync.Mutex +} + +func (m *Manager) GetInfo() Info { + // log.Print("getting info... b4 lock") + m.lock.Lock() + defer m.lock.Unlock() + + return m.VersionInfo +} + +func (m *Manager) UpdateGitHubVersion() error { + m.lock.Lock() + m.VersionInfo.GithubVersionFetched = false + m.lock.Unlock() + versionUrl := "https://api.github.com/repos/tardisx/gropple/releases" resp, err := http.Get(versionUrl) if err != nil { @@ -51,27 +68,30 @@ func (i *Info) UpdateGitHubVersion() error { return errors.New("no releases found") } - i.GithubVersion = releases[0].Name + m.lock.Lock() + + defer m.lock.Unlock() + m.VersionInfo.GithubVersion = releases[0].Name + m.VersionInfo.GithubVersionFetched = true + m.VersionInfo.UpgradeAvailable = m.canUpgrade() - i.GithubVersionFetched = true - i.UpgradeAvailable = i.canUpgrade() return nil } -func (i *Info) canUpgrade() bool { - if !i.GithubVersionFetched { +func (m *Manager) canUpgrade() bool { + if !m.VersionInfo.GithubVersionFetched { return false } - if !semver.IsValid(i.CurrentVersion) { - log.Printf("current version %s is invalid", i.CurrentVersion) + if !semver.IsValid(m.VersionInfo.CurrentVersion) { + log.Printf("current version %s is invalid", m.VersionInfo.CurrentVersion) } - if !semver.IsValid(i.GithubVersion) { - log.Printf("github version %s is invalid", i.GithubVersion) + if !semver.IsValid(m.VersionInfo.GithubVersion) { + log.Printf("github version %s is invalid", m.VersionInfo.GithubVersion) } - if semver.Compare(i.CurrentVersion, i.GithubVersion) == -1 { + if semver.Compare(m.VersionInfo.CurrentVersion, m.VersionInfo.GithubVersion) == -1 { return true } return false