| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // electron/modules/source-updater.ts - 包管理器源更新模块
- import * as os from 'os'
- import { execa } from 'execa'
- import { needsSourceUpdate, markSourceUpdated } from './utils'
- import logger from './logger'
- // 正在进行中的更新操作(用于防止并发重复更新)
- let aptUpdatePromise: Promise<void> | null = null
- /**
- * 检查 apt 源是否需要更新
- * @returns 是否需要更新
- */
- export function needsAptUpdate(): boolean {
- if (os.platform() !== 'linux') return false
- return needsSourceUpdate('apt')
- }
- /**
- * 标记 apt 源已更新
- */
- export function markAptUpdated(): void {
- markSourceUpdated('apt')
- logger.info('apt 源已更新')
- }
- /**
- * 更新 apt 源(Linux 专用,带缓存,1天内只更新一次)
- * 用于版本查询前的源更新
- * 注意:这个函数用于版本查询,实际安装时使用 installer.ts 中的 aptUpdate
- * 支持并发调用:多个调用会共享同一个更新操作
- */
- export async function updateAptSourceForQuery(): Promise<void> {
- if (os.platform() !== 'linux') return
- if (!needsSourceUpdate('apt')) {
- logger.info('apt 源已在缓存期内,跳过更新')
- return
- }
- // 如果已有更新操作在进行中,等待它完成
- if (aptUpdatePromise) {
- logger.info('apt 源更新已在进行中,等待完成...')
- return aptUpdatePromise
- }
- // 创建新的更新操作
- aptUpdatePromise = (async () => {
- try {
- logger.info('正在更新 apt 源...')
- // 使用 sudo 执行 apt update
- await execa('sudo', ['apt', 'update'], { stdio: 'pipe' })
- markSourceUpdated('apt')
- logger.info('apt 源更新完成')
- } catch (error) {
- logger.warn('apt 源更新失败,继续查询', error)
- // 即使更新失败也标记为已尝试,避免当天重复尝试
- markSourceUpdated('apt')
- } finally {
- aptUpdatePromise = null
- }
- })()
- return aptUpdatePromise
- }
|