From 4b4aa8ba84b950c45c0cffee1c1426c4e56adb67 Mon Sep 17 00:00:00 2001 From: AoXuan Date: Sun, 14 Sep 2025 23:24:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DGit=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=80=BB=E8=BE=91=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=8A=B6=E6=80=81=E5=88=A4=E6=96=AD=E5=92=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/electron/main.ts | 121 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 117 insertions(+), 4 deletions(-) diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts index 184fca2..5e3edc5 100644 --- a/frontend/electron/main.ts +++ b/frontend/electron/main.ts @@ -590,12 +590,125 @@ ipcMain.handle('download-git', async () => { ipcMain.handle('check-git-update', async () => { try { - // 这里可以实现检查Git仓库更新的逻辑 - // 暂时返回false,表示没有更新 - return { hasUpdate: false } + const appRoot = getAppRoot() + + // 检查是否为Git仓库 + const gitDir = path.join(appRoot, '.git') + if (!fs.existsSync(gitDir)) { + log.info('不是Git仓库,跳过更新检查') + return { hasUpdate: false } + } + + // 检查Git可执行文件是否存在 + const gitPath = path.join(appRoot, 'environment', 'git', 'bin', 'git.exe') + if (!fs.existsSync(gitPath)) { + log.warn('Git可执行文件不存在,无法检查更新') + return { hasUpdate: false, error: 'Git可执行文件不存在' } + } + + // 获取Git环境变量 + const gitEnv = { + ...process.env, + PATH: `${path.join(appRoot, 'environment', 'git', 'bin')};${path.join(appRoot, 'environment', 'git', 'mingw64', 'bin')};${process.env.PATH}`, + GIT_EXEC_PATH: path.join(appRoot, 'environment', 'git', 'mingw64', 'libexec', 'git-core'), + HOME: process.env.USERPROFILE || process.env.HOME, + GIT_CONFIG_NOSYSTEM: '1', + GIT_TERMINAL_PROMPT: '0', + GIT_ASKPASS: '', + } + + log.info('开始检查Git仓库更新...') + + // 执行 git fetch 获取最新的远程信息 + await new Promise((resolve, reject) => { + const fetchProc = spawn(gitPath, ['fetch', 'origin'], { + stdio: 'pipe', + env: gitEnv, + cwd: appRoot, + }) + + fetchProc.stdout?.on('data', (data) => { + log.info('git fetch output:', data.toString()) + }) + + fetchProc.stderr?.on('data', (data) => { + log.info('git fetch stderr:', data.toString()) + }) + + fetchProc.on('close', (code) => { + if (code === 0) { + resolve() + } else { + reject(new Error(`git fetch失败,退出码: ${code}`)) + } + }) + + fetchProc.on('error', reject) + }) + + // 检查本地分支是否落后于远程分支 + const hasUpdate = await new Promise((resolve, reject) => { + const statusProc = spawn(gitPath, ['status', '-uno', '--porcelain=v1'], { + stdio: 'pipe', + env: gitEnv, + cwd: appRoot, + }) + + let output = '' + statusProc.stdout?.on('data', (data) => { + output += data.toString() + }) + + statusProc.stderr?.on('data', (data) => { + log.info('git status stderr:', data.toString()) + }) + + statusProc.on('close', (code) => { + if (code === 0) { + // 检查是否有 "Your branch is behind" 的信息 + // 使用 git rev-list 来比较本地和远程分支 + const revListProc = spawn(gitPath, ['rev-list', '--count', 'HEAD..origin/feature/refactor'], { + stdio: 'pipe', + env: gitEnv, + cwd: appRoot, + }) + + let revOutput = '' + revListProc.stdout?.on('data', (data) => { + revOutput += data.toString() + }) + + revListProc.on('close', (revCode) => { + if (revCode === 0) { + const commitsBehind = parseInt(revOutput.trim()) + const hasUpdates = commitsBehind > 0 + log.info(`本地分支落后远程分支 ${commitsBehind} 个提交,hasUpdate: ${hasUpdates}`) + resolve(hasUpdates) + } else { + log.warn('无法比较本地和远程分支,假设有更新') + resolve(true) // 如果无法确定,假设有更新 + } + }) + + revListProc.on('error', () => { + log.warn('git rev-list执行失败,假设有更新') + resolve(true) + }) + } else { + reject(new Error(`git status失败,退出码: ${code}`)) + } + }) + + statusProc.on('error', reject) + }) + + log.info(`Git更新检查完成,hasUpdate: ${hasUpdate}`) + return { hasUpdate } + } catch (error) { log.error('检查Git更新失败:', error) - return { hasUpdate: false, error: error instanceof Error ? error.message : String(error) } + // 如果检查失败,返回true以触发更新流程,确保代码是最新的 + return { hasUpdate: true, error: error instanceof Error ? error.message : String(error) } } })