diff --git a/packages/core/src/utils/util.version.js b/packages/core/src/utils/util.version.js new file mode 100644 index 0000000..12a0b8f --- /dev/null +++ b/packages/core/src/utils/util.version.js @@ -0,0 +1,72 @@ +function parseVersion (version) { + const matched = version.match(/^v?(\d{1,2}(?:\.\d{1,2})*)(.*)$/) + return { + versions: matched[1].split('.'), // 版本号数组 + pre: matched[2], // 预发布版本号 + } +} + +/** + * 比较版本号 + * + * @param onlineVersion 线上版本号 + * @param currentVersion 当前版本号 + * @param log 日志对象 + * @returns {number} 比较线上版本号是否为更新的版本,大于0=是|0=相等|小于0=否|-999=出现异常,比较结果未知 + */ +export function isNewVersion (onlineVersion, currentVersion, log = console) { + if (onlineVersion === currentVersion) { + return 0 + } + + try { + const onlineVersionObj = parseVersion(onlineVersion) + const curVersionObj = parseVersion(currentVersion) + + const { versions: versions1 } = onlineVersionObj + const { versions: versions2 } = curVersionObj + + if (versions1.length !== versions2.length) { + // 短的数组补0 + if (versions1.length < versions2.length) { + for (let i = versions1.length; i < versions2.length; i++) { + versions1.push('0') + } + } else if (versions1.length > versions2.length) { + for (let i = versions2.length; i < versions1.length; i++) { + versions2.push('0') + } + } + } + + // 版本数组比对 + for (let i = 0; i < versions1.length; i++) { + if (versions1[i] > versions2[i]) { + return i + 1 // 为新版本,需要更新 + } else if (versions1[i] < versions2[i]) { + return -(i + 1) // 为旧版本,无需更新 + } + } + + // 版本号相同,继续比对预发布版本号 + if (onlineVersionObj.pre && curVersionObj.pre) { + // 都为预发布版本时,直接比较预发布版本号字符串的大小 + if (onlineVersionObj.pre > curVersionObj.pre) { + return 101 + } else if (onlineVersionObj.pre < curVersionObj.pre) { + return -101 + } + } else if (!onlineVersionObj.pre && curVersionObj.pre) { + // 线上为正式版本,当前版本为预发布版本,需要更新 + return 102 + } else if (onlineVersionObj.pre && !curVersionObj.pre) { + // 线上为预发布版本,当前版本为正式版本,无需更新 + return -102 + } + + return 0 // 相同版本,无需更新 + } catch (e) { + (log || console).error(`比对版本失败,当前版本号:${currentVersion},线上版本号:${onlineVersion}, error:`, e) + return -999 // 比对异常 + } +} diff --git a/packages/core/test/versionTest.js b/packages/core/test/versionTest.js new file mode 100644 index 0000000..6af2486 --- /dev/null +++ b/packages/core/test/versionTest.js @@ -0,0 +1,35 @@ +const assert = require('node:assert') +const { isNewVersion } = require('../src/utils/util.version.js') + +function testIsNewVersion (onlineVersion, currentVersion, expected) { + const ret = isNewVersion(onlineVersion, currentVersion) + console.log(ret >= 0 ? ` ${ret}` : `${ret}`) + assert.strictEqual(ret, expected) +} + +testIsNewVersion('2.0.0', '2.0.0', 0) + +testIsNewVersion('2.0.0', '1.0.0', 1) +testIsNewVersion('1.0.0', '2.0.0', -1) + +testIsNewVersion('2.1.0', '2.0.0', 2) +testIsNewVersion('2.0.0', '2.1.0', -2) + +testIsNewVersion('2.0.1', '2.0.0', 3) +testIsNewVersion('2.0.0', '2.0.1', -3) + +testIsNewVersion('2.0.0.1', '2.0.0', 4) +testIsNewVersion('2.0.0', '2.0.0.1', -4) + +testIsNewVersion('2.0.0.9.1', '2.0.0.9', 5) +testIsNewVersion('2.0.0.9', '2.0.0.9.1', -5) + +testIsNewVersion('2.0.0-RC2', '2.0.0-RC1', 101) +testIsNewVersion('2.0.0-RC1', '2.0.0-RC2', -101) + +testIsNewVersion('2.0.0', '2.0.0-RC1', 102) +testIsNewVersion('2.0.0-RC1', '2.0.0', -102) + +testIsNewVersion('2.0.0.0', '2.0.0', 0) + +testIsNewVersion('x', 'v', -999) diff --git a/packages/gui/src/bridge/update/backend.js b/packages/gui/src/bridge/update/backend.js index 489c1cd..7c13726 100644 --- a/packages/gui/src/bridge/update/backend.js +++ b/packages/gui/src/bridge/update/backend.js @@ -9,6 +9,7 @@ import progress from 'request-progress' import pkg from '../../../package.json' import appPathUtil from '../../utils/util.apppath' import log from '../../utils/util.log.gui' +import { isNewVersion } from '@docmirror/dev-sidecar/src/utils/util.version' const isMac = process.platform === 'darwin' const isLinux = process.platform === 'linux' @@ -39,88 +40,8 @@ function downloadFile (uri, filePath, onProgress, onSuccess, onError) { .pipe(fs.createWriteStream(filePath)) } -function parseVersion (version) { - const matched = version.match(/^v?(\d{1,2}\.\d{1,2}\.\d{1,3}(?:\.\d{1,2})?)(.*)$/) - const versionArr = matched[1].split('.') - return { - major: Number.parseInt(versionArr[0]), // 大版本 - minor: Number.parseInt(versionArr[1]), // 中版本 - patch: Number.parseInt(versionArr[2]), // 小版本 - temp: Number.parseInt(versionArr[3]) || 0, // 临时版本 - pre: matched[2], // 预发布版本号 - } -} - -/** - * 比较版本号 - * - * @param onlineVersion 线上版本号 - * @param currentVersion 当前版本号 - * @returns {number} 比较线上版本号是否为更新版本,1=是|0=相等|-1=否|-99=出现异常,比较结果未知 - */ -function isNewVersion (onlineVersion, currentVersion) { - if (onlineVersion === currentVersion) { - return 0 - } - - try { - const versionObj = parseVersion(onlineVersion) - const curVersionObj = parseVersion(currentVersion) - - // 大版本 - if (versionObj.major > curVersionObj.major) { - return 1 // 大版本号更大,为新版本,需要更新 - } else if (versionObj.major < curVersionObj.major) { - return -1 // 大版本号更小,为旧版本,无需更新 - } - - // 中版本 - if (versionObj.minor > curVersionObj.minor) { - return 2 // 中版本号更大,为新版本,需要更新 - } else if (versionObj.minor < curVersionObj.minor) { - return -2 // 中版本号更小,为旧版本,无需更新 - } - - // 小版本 - if (versionObj.patch > curVersionObj.patch) { - return 3 // 小版本号更大,为新版本,需要更新 - } else if (versionObj.patch < curVersionObj.patch) { - return -3 // 小版本号更小,为旧版本,无需更新 - } - - // 临时版本号 - if (versionObj.temp > curVersionObj.temp) { - return 4 // 临时版本号更大,为新版本,需要更新 - } else if (versionObj.temp < curVersionObj.temp) { - return -4 // 临时版本号更小,为旧版本,无需更新 - } - - // 预发布版本号 - if (versionObj.pre && curVersionObj.pre) { - // 当两个后缀版本号都存在时,直接比较后缀版本号字符串的大小 - if (versionObj.pre > curVersionObj.pre) { - return 51 - } else if (versionObj.pre < curVersionObj.pre) { - return -51 - } - } else if (!versionObj.pre && curVersionObj.pre) { - // 线上版本号没有后缀版本号,说明为正式版本,为新版本,需要更新 - return 52 - } else if (versionObj.pre && !curVersionObj.pre) { - return -52 - } else { - return -53 // 相同版本,无需更新(一般不会出现,除非例如 `2.0.0` 和 `2.0.0.0` 进行比较) - } - } catch (e) { - log.error(`比对版本失败,当前版本号:${currentVersion},线上版本号:${onlineVersion}, error:`, e) - return -99 // 比对异常 - } -} - /** * 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 - * - * @param win win是所有窗口的引用 */ function updateHandle (app, api, win, beforeQuit, quit, log) { // // 更新前,删除本地安装包 ↓ @@ -219,7 +140,7 @@ function updateHandle (app, api, win, beforeQuit, quit, log) { } // 比对版本号,是否为新版本 - const isNew = isNewVersion(onlineVersion, curVersion) + const isNew = isNewVersion(onlineVersion, curVersion, log) log.info(`版本比对结果:isNewVersion('${onlineVersion}', '${curVersion}') = ${isNew}`) if (isNew > 0) { log.info(`检查更新:发现新版本 '${onlineVersion}',当前版本号为 '${curVersion}'`) diff --git a/packages/gui/test/versionTest.mjs b/packages/gui/test/versionTest.mjs deleted file mode 100644 index 712c6aa..0000000 --- a/packages/gui/test/versionTest.mjs +++ /dev/null @@ -1,133 +0,0 @@ -import assert from 'node:assert' - -const log = console - -function parseVersion (version) { - const matched = version.match(/^v?(\d{1,2}\.\d{1,2}\.\d{1,3}(?:\.\d{1,2})?)(.*)$/) - const versionArr = matched[1].split('.') - return { - major: Number.parseInt(versionArr[0]), // 大版本 - minor: Number.parseInt(versionArr[1]), // 中版本 - patch: Number.parseInt(versionArr[2]), // 小版本 - temp: Number.parseInt(versionArr[3]) || 0, // 临时版本 - pre: matched[2], // 预发布版本号 - } -} - -/** - * 比较版本号 - * - * @param onlineVersion 线上版本号 - * @param currentVersion 当前版本号 - * @returns {number} 比较线上版本号是否为更新版本,1=是|0=相等|-1=否|-99=出现异常,比较结果未知 - */ -function isNewVersion (onlineVersion, currentVersion) { - if (onlineVersion === currentVersion) { - return 0 - } - - try { - const versionObj = parseVersion(onlineVersion) - const curVersionObj = parseVersion(currentVersion) - - // 大版本 - if (versionObj.major > curVersionObj.major) { - return 1 // 大版本号更大,为新版本,需要更新 - } else if (versionObj.major < curVersionObj.major) { - return -1 // 大版本号更小,为旧版本,无需更新 - } - - // 中版本 - if (versionObj.minor > curVersionObj.minor) { - return 2 // 中版本号更大,为新版本,需要更新 - } else if (versionObj.minor < curVersionObj.minor) { - return -2 // 中版本号更小,为旧版本,无需更新 - } - - // 小版本 - if (versionObj.patch > curVersionObj.patch) { - return 3 // 小版本号更大,为新版本,需要更新 - } else if (versionObj.patch < curVersionObj.patch) { - return -3 // 小版本号更小,为旧版本,无需更新 - } - - // 临时版本号 - if (versionObj.temp > curVersionObj.temp) { - return 4 // 临时版本号更大,为新版本,需要更新 - } else if (versionObj.temp < curVersionObj.temp) { - return -4 // 临时版本号更小,为旧版本,无需更新 - } - - // 预发布版本号 - if (versionObj.pre && curVersionObj.pre) { - // 当两个后缀版本号都存在时,直接比较后缀版本号字符串的大小 - if (versionObj.pre > curVersionObj.pre) { - return 51 - } else if (versionObj.pre < curVersionObj.pre) { - return -51 - } - } else if (!versionObj.pre && curVersionObj.pre) { - // 线上版本号没有后缀版本号,说明为正式版本,为新版本,需要更新 - return 52 - } else if (versionObj.pre && !curVersionObj.pre) { - return -52 - } else { - return -53 // 相同版本,无需更新(一般不会出现,除非例如 `2.0.0` 和 `2.0.0.0` 进行比较) - } - } catch (e) { - log.error(`比对版本失败,当前版本号:${currentVersion},线上版本号:${onlineVersion}, error:`, e) - return -99 // 比对异常 - } -} - -let ret; - -ret = isNewVersion('2.0.0', '1.0.0') -console.log(ret) -assert.strictEqual(ret, 1) -ret = isNewVersion('1.0.0', '2.0.0') -console.log(ret) -assert.strictEqual(ret, -1) - -ret = isNewVersion('2.1.0', '2.0.0') -console.log(ret) -assert.strictEqual(ret, 2) -ret = isNewVersion('2.0.0', '2.1.0') -console.log(ret) -assert.strictEqual(ret, -2) - -ret = isNewVersion('2.0.1', '2.0.0') -console.log(ret) -assert.strictEqual(ret, 3) -ret = isNewVersion('2.0.0', '2.0.1') -console.log(ret) -assert.strictEqual(ret, -3) - -ret = isNewVersion('2.0.0.1', '2.0.0') -console.log(ret) -assert.strictEqual(ret, 4) -ret = isNewVersion('2.0.0', '2.0.0.1') -console.log(ret) -assert.strictEqual(ret, -4) - -ret = isNewVersion('2.0.0-RC2', '2.0.0-RC1') -console.log(ret) -assert.strictEqual(ret, 51) -ret = isNewVersion('2.0.0-RC1', '2.0.0-RC2') -console.log(ret) -assert.strictEqual(ret, -51) - -ret = isNewVersion('2.0.0', '2.0.0-RC1') -console.log(ret) -assert.strictEqual(ret, 52) -ret = isNewVersion('2.0.0-RC1', '2.0.0') -console.log(ret) -assert.strictEqual(ret, -52) - -ret = isNewVersion('2.0.0.0', '2.0.0') -console.log(ret) -assert.strictEqual(ret, -53) - -ret = isNewVersion('x', 'v') -console.log(ret) -assert.strictEqual(ret, -99)