// 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 | 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 { 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 }