fix(ota): should only check update if target version is specified

This commit is contained in:
Siyuan 2025-11-10 13:19:21 +00:00
parent 740d9b61a0
commit 3fab951d43
4 changed files with 83 additions and 8 deletions

View File

@ -311,13 +311,27 @@ func (s *State) checkUpdateStatus(
appUpdateStatus.available = false appUpdateStatus.available = false
} }
// Handle custom target versions components := params.Components
if slices.Contains(params.Components, "app") && params.AppTargetVersion != "" { // skip check if no components are specified
appUpdateStatus.available = appVersionRemote.String() != appUpdateStatus.localVersion if len(components) == 0 {
return nil
} }
if slices.Contains(params.Components, "system") && params.SystemTargetVersion != "" { // TODO: simplify this
systemUpdateStatus.available = systemVersionRemote.String() != systemUpdateStatus.localVersion if slices.Contains(components, "app") {
if params.AppTargetVersion != "" {
appUpdateStatus.available = appVersionRemote.String() != appVersionLocal.String()
}
} else {
appUpdateStatus.available = false
}
if slices.Contains(components, "system") {
if params.SystemTargetVersion != "" {
systemUpdateStatus.available = systemVersionRemote.String() != systemVersionLocal.String()
}
} else {
systemUpdateStatus.available = false
} }
return nil return nil

58
internal/ota/ota_test.go Normal file
View File

@ -0,0 +1,58 @@
package ota
import (
"context"
"net/http"
"os"
"testing"
"time"
"github.com/Masterminds/semver/v3"
"github.com/rs/zerolog"
"github.com/stretchr/testify/assert"
)
func pseudoGetLocalVersion() (systemVersion *semver.Version, appVersion *semver.Version, err error) {
systemVersion = semver.MustParse("0.2.5")
appVersion = semver.MustParse("0.4.7")
return systemVersion, appVersion, nil
}
func newOtaState() *State {
logger := zerolog.New(os.Stdout).Level(zerolog.TraceLevel)
otaState := NewState(Options{
SkipConfirmSystem: true,
Logger: &logger,
ReleaseAPIEndpoint: "https://api.jetkvm.com/releases",
GetHTTPClient: func() *http.Client {
transport := http.DefaultTransport.(*http.Transport).Clone()
client := &http.Client{
Transport: transport,
}
return client
},
GetLocalVersion: pseudoGetLocalVersion,
HwReboot: func(force bool, postRebootAction *PostRebootAction, delay time.Duration) error { return nil },
ResetConfig: func() error { return nil },
OnStateUpdate: func(state *RPCState) {},
OnProgressUpdate: func(progress float32) {},
})
return otaState
}
func TestCheckUpdateComponents(t *testing.T) {
otaState := newOtaState()
updateParams := UpdateParams{
DeviceID: "test",
IncludePreRelease: false,
SystemTargetVersion: "0.2.2",
Components: []string{"system"},
}
info, err := otaState.GetUpdateStatus(context.Background(), updateParams)
t.Logf("update status: %+v", info)
if err != nil {
t.Fatalf("failed to check update: %v", err)
}
assert.True(t, info.SystemUpdateAvailable)
assert.False(t, info.AppUpdateAvailable)
}

View File

@ -203,6 +203,7 @@ type Options struct {
HwReboot HwRebootFunc HwReboot HwRebootFunc
ReleaseAPIEndpoint string ReleaseAPIEndpoint string
ResetConfig ResetConfigFunc ResetConfig ResetConfigFunc
SkipConfirmSystem bool
} }
// NewState creates a new OTA state // NewState creates a new OTA state
@ -221,7 +222,9 @@ func NewState(opts Options) *State {
releaseAPIEndpoint: opts.ReleaseAPIEndpoint, releaseAPIEndpoint: opts.ReleaseAPIEndpoint,
resetConfig: opts.ResetConfig, resetConfig: opts.ResetConfig,
} }
go s.confirmCurrentSystem() if !opts.SkipConfirmSystem {
go s.confirmCurrentSystem()
}
return s return s
} }

4
ota.go
View File

@ -91,7 +91,7 @@ func getUpdateStatus(includePreRelease bool) (*ota.UpdateStatus, error) {
updateStatus.Error = err.Error() updateStatus.Error = err.Error()
} }
logger.Info().Interface("updateStatus", updateStatus).Msg("Update status") otaLogger.Info().Interface("updateStatus", updateStatus).Msg("Update status")
return updateStatus, nil return updateStatus, nil
} }
@ -189,7 +189,7 @@ func rpcTryUpdateComponents(params updateParams, includePreRelease bool, resetCo
go func() { go func() {
err := otaState.TryUpdate(context.Background(), updateParams) err := otaState.TryUpdate(context.Background(), updateParams)
if err != nil { if err != nil {
logger.Warn().Err(err).Msg("failed to try update") otaLogger.Warn().Err(err).Msg("failed to try update")
} }
}() }()
return nil return nil