refactor: remove downgrade attributes from ota state and jsonrpc

This commit is contained in:
Siyuan 2025-11-07 17:13:04 +00:00
parent 8bd3d4cfcf
commit 9832be29ef
9 changed files with 40 additions and 39 deletions

View File

@ -152,12 +152,12 @@ func (s *State) doUpdate(ctx context.Context, params UpdateParams) error {
return nil return nil
} }
if shouldUpdateApp && (appUpdate.available || appUpdate.downgradeAvailable) { if shouldUpdateApp && appUpdate.available {
appUpdate.pending = true appUpdate.pending = true
s.triggerComponentUpdateState("app", appUpdate) s.triggerComponentUpdateState("app", appUpdate)
} }
if shouldUpdateSystem && (systemUpdate.available || systemUpdate.downgradeAvailable) { if shouldUpdateSystem && systemUpdate.available {
systemUpdate.pending = true systemUpdate.pending = true
s.triggerComponentUpdateState("system", systemUpdate) s.triggerComponentUpdateState("system", systemUpdate)
} }
@ -292,7 +292,6 @@ func (s *State) checkUpdateStatus(
return err return err
} }
systemUpdateStatus.available = systemVersionRemote.GreaterThan(systemVersionLocal) systemUpdateStatus.available = systemVersionRemote.GreaterThan(systemVersionLocal)
systemUpdateStatus.downgradeAvailable = systemVersionRemote.LessThan(systemVersionLocal)
appVersionRemote, err := semver.NewVersion(remoteMetadata.AppVersion) appVersionRemote, err := semver.NewVersion(remoteMetadata.AppVersion)
if err != nil { if err != nil {
@ -300,7 +299,6 @@ func (s *State) checkUpdateStatus(
return err return err
} }
appUpdateStatus.available = appVersionRemote.GreaterThan(appVersionLocal) appUpdateStatus.available = appVersionRemote.GreaterThan(appVersionLocal)
appUpdateStatus.downgradeAvailable = appVersionRemote.LessThan(appVersionLocal)
// Handle pre-release updates // Handle pre-release updates
isRemoteSystemPreRelease := systemVersionRemote.Prerelease() != "" isRemoteSystemPreRelease := systemVersionRemote.Prerelease() != ""
@ -313,6 +311,15 @@ func (s *State) checkUpdateStatus(
appUpdateStatus.available = false appUpdateStatus.available = false
} }
// Handle custom target versions
if slices.Contains(params.Components, "app") && params.AppTargetVersion != "" {
appUpdateStatus.available = appVersionRemote.String() != appUpdateStatus.localVersion
}
if slices.Contains(params.Components, "system") && params.SystemTargetVersion != "" {
systemUpdateStatus.available = systemVersionRemote.String() != systemUpdateStatus.localVersion
}
return nil return nil
} }

View File

@ -28,12 +28,10 @@ type LocalMetadata struct {
// UpdateStatus represents the current update status // UpdateStatus represents the current update status
type UpdateStatus struct { type UpdateStatus struct {
Local *LocalMetadata `json:"local"` Local *LocalMetadata `json:"local"`
Remote *UpdateMetadata `json:"remote"` Remote *UpdateMetadata `json:"remote"`
SystemUpdateAvailable bool `json:"systemUpdateAvailable"` SystemUpdateAvailable bool `json:"systemUpdateAvailable"`
SystemDowngradeAvailable bool `json:"systemDowngradeAvailable"` AppUpdateAvailable bool `json:"appUpdateAvailable"`
AppUpdateAvailable bool `json:"appUpdateAvailable"`
AppDowngradeAvailable bool `json:"appDowngradeAvailable"`
// for backwards compatibility // for backwards compatibility
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`
@ -50,7 +48,6 @@ type PostRebootAction struct {
type componentUpdateStatus struct { type componentUpdateStatus struct {
pending bool pending bool
available bool available bool
downgradeAvailable bool
version string version string
localVersion string localVersion string
targetVersion string targetVersion string
@ -170,11 +167,9 @@ func toUpdateStatus(appUpdate *componentUpdateStatus, systemUpdate *componentUpd
SystemURL: systemUpdate.url, SystemURL: systemUpdate.url,
SystemHash: systemUpdate.hash, SystemHash: systemUpdate.hash,
}, },
SystemUpdateAvailable: systemUpdate.available, SystemUpdateAvailable: systemUpdate.available,
SystemDowngradeAvailable: systemUpdate.downgradeAvailable, AppUpdateAvailable: appUpdate.available,
AppUpdateAvailable: appUpdate.available, Error: error,
AppDowngradeAvailable: appUpdate.downgradeAvailable,
Error: error,
} }
} }

View File

@ -1155,7 +1155,6 @@ var rpcHandlers = map[string]RPCHandler{
"getUpdateStatusChannel": {Func: rpcGetUpdateStatusChannel}, "getUpdateStatusChannel": {Func: rpcGetUpdateStatusChannel},
"tryUpdate": {Func: rpcTryUpdate}, "tryUpdate": {Func: rpcTryUpdate},
"tryUpdateComponents": {Func: rpcTryUpdateComponents, Params: []string{"params", "includePreRelease", "resetConfig"}}, "tryUpdateComponents": {Func: rpcTryUpdateComponents, Params: []string{"params", "includePreRelease", "resetConfig"}},
"cancelDowngrade": {Func: rpcCancelDowngrade},
"getDevModeState": {Func: rpcGetDevModeState}, "getDevModeState": {Func: rpcGetDevModeState},
"setDevModeState": {Func: rpcSetDevModeState, Params: []string{"enabled"}}, "setDevModeState": {Func: rpcSetDevModeState, Params: []string{"enabled"}},
"getSSHKeyState": {Func: rpcGetSSHKeyState}, "getSSHKeyState": {Func: rpcGetSSHKeyState},

10
ota.go
View File

@ -194,13 +194,3 @@ func rpcTryUpdateComponents(params updateParams, includePreRelease bool, resetCo
}() }()
return nil return nil
} }
func rpcCancelDowngrade() error {
if err := otaState.SetTargetVersion("app", ""); err != nil {
return fmt.Errorf("failed to set app target version: %w", err)
}
if err := otaState.SetTargetVersion("system", ""); err != nil {
return fmt.Errorf("failed to set system target version: %w", err)
}
return nil
}

View File

@ -554,7 +554,6 @@ export type UpdateModalViews =
| "updating" | "updating"
| "upToDate" | "upToDate"
| "updateAvailable" | "updateAvailable"
| "updateDowngradeAvailable"
| "updateCompleted" | "updateCompleted"
| "error"; | "error";

View File

@ -15,9 +15,7 @@ export interface SystemVersionInfo {
local: VersionInfo; local: VersionInfo;
remote?: VersionInfo; remote?: VersionInfo;
systemUpdateAvailable: boolean; systemUpdateAvailable: boolean;
systemDowngradeAvailable: boolean;
appUpdateAvailable: boolean; appUpdateAvailable: boolean;
appDowngradeAvailable: boolean;
error?: string; error?: string;
} }

View File

@ -185,10 +185,10 @@ export default function SettingsAdvancedRoute() {
setShowLoopbackWarning(false); setShowLoopbackWarning(false);
}, [applyLoopbackOnlyMode, setShowLoopbackWarning]); }, [applyLoopbackOnlyMode, setShowLoopbackWarning]);
const handleVersionUpdateError = useCallback((error?: JsonRpcError) => { const handleVersionUpdateError = useCallback((error?: JsonRpcError | string) => {
notifications.error( notifications.error(
m.advanced_error_version_update({ m.advanced_error_version_update({
error: error?.data ?? error?.message ?? m.unknown_error() error: typeof error === "string" ? error : (error?.data ?? error?.message ?? m.unknown_error())
}), }),
{ duration: 1000 * 15 } // 15 seconds { duration: 1000 * 15 } // 15 seconds
); );
@ -214,15 +214,31 @@ export default function SettingsAdvancedRoute() {
return; return;
} }
console.debug("versionInfo", versionInfo, components.includes("app") && versionInfo.remote?.appVersion && versionInfo?.appUpdateAvailable, components.includes("system") && versionInfo.remote?.systemVersion && versionInfo?.systemUpdateAvailable);
console.debug("components", components);
console.debug("versionInfo.remote?.appVersion", versionInfo.remote?.appVersion);
console.debug("versionInfo.appUpdateAvailable", versionInfo?.appUpdateAvailable);
console.debug("versionInfo.remote?.systemVersion", versionInfo.remote?.systemVersion);
console.debug("versionInfo.systemUpdateAvailable", versionInfo?.systemUpdateAvailable);
let hasUpdate = false;
const pageParams = new URLSearchParams(); const pageParams = new URLSearchParams();
if (components.includes("app") && versionInfo.remote?.appVersion && versionInfo.appDowngradeAvailable) { if (components.includes("app") && versionInfo.remote?.appVersion && versionInfo.appUpdateAvailable) {
hasUpdate = true;
pageParams.set("custom_app_version", versionInfo.remote?.appVersion); pageParams.set("custom_app_version", versionInfo.remote?.appVersion);
} }
if (components.includes("system") && versionInfo.remote?.systemVersion && versionInfo.systemDowngradeAvailable) { if (components.includes("system") && versionInfo.remote?.systemVersion && versionInfo.systemUpdateAvailable) {
hasUpdate = true;
pageParams.set("custom_system_version", versionInfo.remote?.systemVersion); pageParams.set("custom_system_version", versionInfo.remote?.systemVersion);
} }
pageParams.set("reset_config", resetConfig.toString()); pageParams.set("reset_config", resetConfig.toString());
if (!hasUpdate) {
handleVersionUpdateError("No update available");
return;
}
// Navigate to update page // Navigate to update page
navigateTo(`/settings/general/update?${pageParams.toString()}`); navigateTo(`/settings/general/update?${pageParams.toString()}`);
}, [ }, [

View File

@ -443,7 +443,6 @@ function SystemUpToDateState({
function UpdateAvailableState({ function UpdateAvailableState({
versionInfo, versionInfo,
forceCustomUpdate,
onConfirm, onConfirm,
onClose, onClose,
}: { }: {
@ -462,13 +461,13 @@ function UpdateAvailableState({
{m.general_update_available_description()} {m.general_update_available_description()}
</p> </p>
<p className="mb-4 text-sm text-slate-600 dark:text-slate-300"> <p className="mb-4 text-sm text-slate-600 dark:text-slate-300">
{(forceCustomUpdate ? versionInfo?.systemDowngradeAvailable : versionInfo?.systemUpdateAvailable) ? ( {versionInfo?.systemUpdateAvailable ? (
<> <>
<span className="font-semibold">{m.general_update_system_type()}</span>: {versionInfo?.local?.systemVersion} <span className="text-slate-600 dark:text-slate-300"></span> {versionInfo?.remote?.systemVersion} <span className="font-semibold">{m.general_update_system_type()}</span>: {versionInfo?.local?.systemVersion} <span className="text-slate-600 dark:text-slate-300"></span> {versionInfo?.remote?.systemVersion}
<br /> <br />
</> </>
) : null} ) : null}
{(forceCustomUpdate ? versionInfo?.appDowngradeAvailable : versionInfo?.appUpdateAvailable) ? ( {versionInfo?.appUpdateAvailable ? (
<> <>
<span className="font-semibold">{m.general_update_application_type()}</span>: {versionInfo?.local?.appVersion} <span className="text-slate-600 dark:text-slate-300"></span> {versionInfo?.remote?.appVersion} <span className="font-semibold">{m.general_update_application_type()}</span>: {versionInfo?.local?.appVersion} <span className="text-slate-600 dark:text-slate-300"></span> {versionInfo?.remote?.appVersion}
</> </>

View File

@ -220,9 +220,7 @@ export interface SystemVersionInfo {
local: VersionInfo; local: VersionInfo;
remote?: VersionInfo; remote?: VersionInfo;
systemUpdateAvailable: boolean; systemUpdateAvailable: boolean;
systemDowngradeAvailable: boolean;
appUpdateAvailable: boolean; appUpdateAvailable: boolean;
appDowngradeAvailable: boolean;
error?: string; error?: string;
} }