From 483439665238948068eb47fa079aed37efbc0568 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Wed, 13 May 2026 01:16:34 +0000 Subject: [PATCH] refactor: streamline JSON file reading logic and improve error handling in findings.js and git.js --- app/findings.js | 39 +++++++++++++++++---------------------- app/git.js | 4 ++-- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/app/findings.js b/app/findings.js index 8a6a5cb..777cbe6 100644 --- a/app/findings.js +++ b/app/findings.js @@ -18,25 +18,31 @@ export async function analyzeWithRole(role, diff) { } /** - * 讀取舊 findings(從 workspace 的 FINDINGS_PATH) + * 讀取 JSON 陣列檔案,失敗或不存在時回傳空陣列 */ -export function loadOldFindings(workspace) { - const fullPath = path.join(workspace, FINDINGS_PATH); +function readJSONArray(fullPath, label) { if (!fs.existsSync(fullPath)) { - console.log(' 舊 findings 檔案不存在,視為空'); + console.log(` ${label}檔案不存在,視為空`); return []; } try { const data = JSON.parse(fs.readFileSync(fullPath, 'utf8')); - const old = (Array.isArray(data) ? data : []).map(f => ({ ...f, is_new: false })); - console.log(` 讀取舊 findings: ${old.length} 筆`); - return old; + return Array.isArray(data) ? data : []; } catch (e) { - console.log(` ⚠️ 讀取舊 findings 失敗: ${e.message},視為空`); + console.log(` ⚠️ 讀取${label}失敗: ${e.message},視為空`); return []; } } +/** + * 讀取舊 findings(從 workspace 的 FINDINGS_PATH) + */ +export function loadOldFindings(workspace) { + const old = readJSONArray(path.join(workspace, FINDINGS_PATH), '舊 findings ').map(f => ({ ...f, is_new: false })); + console.log(` 讀取舊 findings: ${old.length} 筆`); + return old; +} + /** * 合併新舊 findings,以 (role + location + suggestion前50字) 為 key 去除重複 */ @@ -97,20 +103,9 @@ export async function deduplicateWithAI(findings) { * 讀取排除問題檔案(從 workspace 的 EXCLUSIONS_PATH) */ export function loadExclusions(workspace) { - const fullPath = path.join(workspace, EXCLUSIONS_PATH); - if (!fs.existsSync(fullPath)) { - console.log(' 排除問題檔案不存在,跳過過濾'); - return []; - } - try { - const data = JSON.parse(fs.readFileSync(fullPath, 'utf8')); - const exclusions = Array.isArray(data) ? data : []; - console.log(` 讀取排除問題: ${exclusions.length} 筆`); - return exclusions; - } catch (e) { - console.log(` ⚠️ 讀取排除問題失敗: ${e.message},跳過過濾`); - return []; - } + const exclusions = readJSONArray(path.join(workspace, EXCLUSIONS_PATH), '排除問題'); + console.log(` 讀取排除問題: ${exclusions.length} 筆`); + return exclusions; } /** diff --git a/app/git.js b/app/git.js index b182ba0..5209de8 100644 --- a/app/git.js +++ b/app/git.js @@ -3,6 +3,8 @@ import fs from 'fs'; import path from 'path'; import { GITEA_SERVER_URL, GITEA_REPOSITORY, GITEA_TOKEN, PR_HEAD_BRANCH, FINDINGS_PATH } from './config.js'; +const remoteUrl = `${GITEA_SERVER_URL.replace(/\/$/, '')}/${GITEA_REPOSITORY}.git`; + function makeRunner(spawn) { return function run(args, cwd, env) { const opts = { cwd, encoding: 'utf8' }; @@ -30,7 +32,6 @@ function withAskpass(workspace, fn) { */ export function cloneRepo(workspace, _spawnSync = spawnSync) { const run = makeRunner(_spawnSync); - const remoteUrl = `${GITEA_SERVER_URL.replace(/\/$/, '')}/${GITEA_REPOSITORY}.git`; const repoDir = path.join(workspace, 'repo'); return withAskpass(workspace, credEnv => { @@ -48,7 +49,6 @@ export function cloneRepo(workspace, _spawnSync = spawnSync) { export async function commitAndPush(workspace, _spawnSync = spawnSync) { const run = makeRunner(_spawnSync); - const remoteUrl = `${GITEA_SERVER_URL.replace(/\/$/, '')}/${GITEA_REPOSITORY}.git`; try { const repoDir = cloneRepo(workspace, _spawnSync);