@@ -477,6 +477,7 @@ function restorePackagedRuntimeStateFromBackup() {
477477 backupRoot : null ,
478478 restored : [ ] ,
479479 failed : [ ] ,
480+ skipped : [ ] ,
480481 } ;
481482
482483 if ( ! isWindowsNsisInstalledApp ( ) ) {
@@ -488,9 +489,26 @@ function restorePackagedRuntimeStateFromBackup() {
488489 return result ;
489490 }
490491
491- const appDir = resolveAppDir ( ) ;
492492 const backupRoot = resolveUpdateBackupRoot ( ) ;
493493 result . backupRoot = backupRoot ;
494+ const backupAppVersion = normalizeVersionString ( manifest . appVersion ) ;
495+ const currentAppVersion = normalizeVersionString ( resolveDesktopVersion ( ) ) ;
496+ const versionComparison = backupAppVersion && currentAppVersion
497+ ? compareVersions ( backupAppVersion , currentAppVersion )
498+ : null ;
499+ const isSameAppVersion = Boolean (
500+ backupAppVersion &&
501+ currentAppVersion &&
502+ ( versionComparison === 0 || ( versionComparison === null && backupAppVersion === currentAppVersion ) )
503+ ) ;
504+ if ( isSameAppVersion ) {
505+ const reason = `manifest (app version ${ currentAppVersion } did not change after update attempt)` ;
506+ result . skipped . push ( reason ) ;
507+ logLine ( `[update] skipped runtime restore because app version did not change after update attempt: ${ currentAppVersion } ` ) ;
508+ return result ;
509+ }
510+
511+ const appDir = resolveAppDir ( ) ;
494512 const runtimeEntries = resolveRuntimeFileEntries ( appDir ) ;
495513 const relativeFiles = normalizeBackupFileList ( manifest ) ;
496514 const failedRelativeFiles = [ ] ;
@@ -535,6 +553,9 @@ function restorePackagedRuntimeStateFromBackup() {
535553 if ( result . failed . length ) {
536554 logLine ( `[update] skipped runtime restore files after copy failure: ${ result . failed . join ( ', ' ) } ` ) ;
537555 }
556+ if ( result . skipped . length ) {
557+ logLine ( `[update] skipped runtime restore: ${ result . skipped . join ( ', ' ) } ` ) ;
558+ }
538559
539560 return result ;
540561}
@@ -1375,14 +1396,17 @@ ipcMain.handle('desktop:open-release-page', async (_event, releaseUrl) => {
13751396async function createWindow ( ) {
13761397 const restoreResult = isWindowsNsisInstalledApp ( ) ? restorePackagedRuntimeStateFromBackup ( ) : null ;
13771398 initLogging ( ) ;
1378- const restoreFailed = Boolean ( restoreResult && restoreResult . failed . length ) ;
1379- const restoreErrorMessage = restoreFailed
1380- ? `上次更新安装后恢复运行时文件失败,已保留备份目录 ${ restoreResult . backupRoot } ,请确认后手动恢复并重启应用。失败明细:${ restoreResult . failed . join ( ';' ) } `
1399+ const restoreNeedsAttention = Boolean ( restoreResult && ( restoreResult . failed . length || restoreResult . skipped . length ) ) ;
1400+ const restoreIssueDetails = restoreResult
1401+ ? restoreResult . failed . concat ( restoreResult . skipped ) . join ( ';' )
1402+ : '' ;
1403+ const restoreErrorMessage = restoreNeedsAttention
1404+ ? `上次更新安装未完成或恢复运行时文件失败,已保留备份目录 ${ restoreResult . backupRoot } ,请确认后手动恢复并重启应用。明细:${ restoreIssueDetails } `
13811405 : '' ;
13821406 setDesktopUpdateState ( {
1383- status : restoreFailed ? UPDATE_STATUS . ERROR : UPDATE_STATUS . IDLE ,
1407+ status : restoreNeedsAttention ? UPDATE_STATUS . ERROR : UPDATE_STATUS . IDLE ,
13841408 currentVersion : resolveDesktopVersion ( ) ,
1385- updateMode : restoreFailed ? UPDATE_MODE . MANUAL : UPDATE_MODE . AUTO ,
1409+ updateMode : restoreNeedsAttention ? UPDATE_MODE . MANUAL : UPDATE_MODE . AUTO ,
13861410 message : restoreErrorMessage ,
13871411 } ) ;
13881412 const startupStartedAt = Date . now ( ) ;
0 commit comments