Files
Evan Simkowitz d319e72609 Refactor ModelUpdate to set up for decoupling sstore (#280)
This PR changes ModelUpdate mechanism from a statically-typed struct to an interface, allowing us to define the update mechanism and the update types separately. This sets us up to move app logic and update mechanisms into separate packages. Ultimately, sstore will only define low-level persistence logic.
2024-02-09 17:19:44 -08:00

75 lines
2.1 KiB
Go

package releasechecker
import (
"context"
"fmt"
"github.com/google/go-github/v57/github"
"golang.org/x/mod/semver"
"github.com/wavetermdev/waveterm/wavesrv/pkg/scbase"
"github.com/wavetermdev/waveterm/wavesrv/pkg/sstore"
)
type ReleaseCheckResult int
const (
NotNeeded ReleaseCheckResult = 0
Success ReleaseCheckResult = 1
Failure ReleaseCheckResult = 2
Disabled ReleaseCheckResult = 3
)
// CheckNewRelease checks for a new release and updates the release info in the DB.
// If force is true, the release info is updated even if it is fresh or if the automatic release check is disabled.
func CheckNewRelease(ctx context.Context, force bool) (ReleaseCheckResult, error) {
clientData, err := sstore.EnsureClientData(ctx)
if err != nil {
return Failure, fmt.Errorf("error getting client data: %w", err)
}
if !force && clientData.ClientOpts.NoReleaseCheck {
return Disabled, nil
}
if !force && semver.Compare(scbase.WaveVersion, clientData.ReleaseInfo.LatestVersion) < 0 {
// We have already notified the frontend about a new release and the record is fresh. There is no need to check again.
return NotNeeded, nil
}
// Initialize an unauthenticated client
client := github.NewClient(nil)
// Get the latest release from the repository
release, rsp, err := client.Repositories.GetLatestRelease(ctx, "wavetermdev", "waveterm")
releaseInfoLatest := sstore.ReleaseInfoType{
LatestVersion: scbase.WaveVersion,
}
if err != nil {
return Failure, fmt.Errorf("error getting latest release: %w", err)
}
if rsp.StatusCode != 200 {
return Failure, fmt.Errorf("response from Github is not success: %v", rsp)
}
releaseInfoLatest.LatestVersion = *release.TagName
// Update the release info in the DB
err = sstore.SetReleaseInfo(ctx, releaseInfoLatest)
if err != nil {
return Failure, fmt.Errorf("error updating release info: %w", err)
}
clientData, err = sstore.EnsureClientData(ctx)
if err != nil {
return Failure, fmt.Errorf("error getting updated client data: %w", err)
}
update := &sstore.ModelUpdate{}
sstore.AddUpdate(update, *clientData)
sstore.MainBus.SendUpdate(update)
return Success, nil
}