optimize: 版本比对功能,代码重构。
							parent
							
								
									e3c1d80e47
								
							
						
					
					
						commit
						f54b77f4ea
					
				| 
						 | 
				
			
			@ -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 // 比对异常
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			@ -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}'`)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
		Loading…
	
		Reference in New Issue