diff --git a/packages/gui/src/bridge/update/backend.js b/packages/gui/src/bridge/update/backend.js index 3801caa..ce7e786 100644 --- a/packages/gui/src/bridge/update/backend.js +++ b/packages/gui/src/bridge/update/backend.js @@ -40,6 +40,66 @@ function downloadFile (uri, filePath, onProgress, onSuccess, onError) { .pipe(fs.createWriteStream(filePath)) } +function parseVersion (version) { + const matched = version.match(/^v?(\d+\.\d+\.\d+)(.*)$/) + const versionArr = matched[1].split('.') + return { + major: parseInt(versionArr[0]), + minor: parseInt(versionArr[1]), + patch: parseInt(versionArr[2]), + suffix: matched[2] + } +} + +/** + * 比较版本号 + * + * @param version 线上版本号 + * @param curVersion 当前版本号 + * @returns {boolean} 比较线上版本号是否为更新版本,1=是|0=相等|-1=否|-99=出现异常,比较结果未知 + */ +function isNewVersion (version, curVersion) { + if (version === curVersion) { + return 0 + } + + try { + const versionObj = parseVersion(version) + const curVersionObj = parseVersion(curVersion) + if (versionObj.major > curVersionObj.major) { + return 1 // 大版本号更大,为更新版本 + } + + if (curVersionObj.major === versionObj.major) { + if (versionObj.minor > curVersionObj.minor) { + return 1 // 中版本号更大,为更新版本 + } + + if (curVersionObj.minor === versionObj.minor) { + if (versionObj.patch > curVersionObj.patch) { + return 1 // 小版本号更大,为更新版本 + } + + if (versionObj.patch === curVersionObj.patch) { + if (versionObj.suffix && curVersionObj.suffix) { + // 当两个后缀版本号都存在时,直接比较后缀版本号字符串的大小 + if (versionObj.suffix > curVersionObj.suffix) { + return 1 + } + } else if (!versionObj.suffix && curVersionObj.suffix) { + // 线上版本号没有后缀版本号,说明为正式版本,为更新版本 + return 1 + } + } + } + } + } catch (e) { + log.error(`比对版本失败,当前版本号:${curVersion},比对版本号:${version}, error:`, e) + return -99 + } + return -1 +} + /** * 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 * @@ -119,7 +179,7 @@ function updateHandle (app, api, win, beforeQuit, quit, log) { const versionData = data[i] if (!versionData.assets || versionData.assets.length === 0) { - continue // 跳过空版本,即上传过安装包 + continue // 跳过空版本,即未上传过安装包 } if (!isPreRelease && DevSidecar.api.config.get().app.skipPreRelease && versionData.name.includes('-')) { continue // 跳过预发布版本 @@ -127,12 +187,15 @@ function updateHandle (app, api, win, beforeQuit, quit, log) { // log.info('最近正式版本数据:', versionData) + // 获取版本号 let version = versionData.name if (version.indexOf('v') === 0) { version = version.substring(1) } - if (version !== curVersion) { - log.info('检查更新-发现新版本:', version) + + // 比对版本号,是否为新版本 + if (isNewVersion(version, curVersion) > 0) { + log.info(`检查更新:发现新版本 '${version}',当前版本号为 '${curVersion}'`) win.webContents.send('update', { key: 'available', value: { @@ -143,11 +206,11 @@ function updateHandle (app, api, win, beforeQuit, quit, log) { } }) } else { - log.info('检查更新-没有新版本,最新版本号为:', version) + log.info(`检查更新:没有新版本,最近发布的版本号为 '${version}',而当前版本号为 '${curVersion}'`) win.webContents.send('update', { key: 'notAvailable' }) } - return // 只检查最近一个正式版本 + return // 只检查最近一个版本 } log.info('检查更新-没有正式版本数据')