refactor: streamline JSON file reading logic and improve error handling in findings.js and git.js

This commit is contained in:
2026-05-13 01:16:34 +00:00
parent 0108a05886
commit 4834396652
2 changed files with 19 additions and 24 deletions
+17 -22
View File
@@ -18,25 +18,31 @@ export async function analyzeWithRole(role, diff) {
} }
/** /**
* 讀取舊 findings(從 workspace 的 FINDINGS_PATH * 讀取 JSON 陣列檔案,失敗或不存在時回傳空陣列
*/ */
export function loadOldFindings(workspace) { function readJSONArray(fullPath, label) {
const fullPath = path.join(workspace, FINDINGS_PATH);
if (!fs.existsSync(fullPath)) { if (!fs.existsSync(fullPath)) {
console.log(' 舊 findings 檔案不存在,視為空'); console.log(` ${label}檔案不存在,視為空`);
return []; return [];
} }
try { try {
const data = JSON.parse(fs.readFileSync(fullPath, 'utf8')); const data = JSON.parse(fs.readFileSync(fullPath, 'utf8'));
const old = (Array.isArray(data) ? data : []).map(f => ({ ...f, is_new: false })); return Array.isArray(data) ? data : [];
console.log(` 讀取舊 findings: ${old.length}`);
return old;
} catch (e) { } catch (e) {
console.log(` ⚠️ 讀取舊 findings 失敗: ${e.message},視為空`); console.log(` ⚠️ 讀取${label}失敗: ${e.message},視為空`);
return []; 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 去除重複 * 合併新舊 findings,以 (role + location + suggestion前50字) 為 key 去除重複
*/ */
@@ -97,20 +103,9 @@ export async function deduplicateWithAI(findings) {
* 讀取排除問題檔案(從 workspace 的 EXCLUSIONS_PATH * 讀取排除問題檔案(從 workspace 的 EXCLUSIONS_PATH
*/ */
export function loadExclusions(workspace) { export function loadExclusions(workspace) {
const fullPath = path.join(workspace, EXCLUSIONS_PATH); const exclusions = readJSONArray(path.join(workspace, EXCLUSIONS_PATH), '排除問題');
if (!fs.existsSync(fullPath)) { console.log(` 讀取排除問題: ${exclusions.length}`);
console.log(' 排除問題檔案不存在,跳過過濾'); return exclusions;
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 [];
}
} }
/** /**
+2 -2
View File
@@ -3,6 +3,8 @@ import fs from 'fs';
import path from 'path'; import path from 'path';
import { GITEA_SERVER_URL, GITEA_REPOSITORY, GITEA_TOKEN, PR_HEAD_BRANCH, FINDINGS_PATH } from './config.js'; 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) { function makeRunner(spawn) {
return function run(args, cwd, env) { return function run(args, cwd, env) {
const opts = { cwd, encoding: 'utf8' }; const opts = { cwd, encoding: 'utf8' };
@@ -30,7 +32,6 @@ function withAskpass(workspace, fn) {
*/ */
export function cloneRepo(workspace, _spawnSync = spawnSync) { export function cloneRepo(workspace, _spawnSync = spawnSync) {
const run = makeRunner(_spawnSync); const run = makeRunner(_spawnSync);
const remoteUrl = `${GITEA_SERVER_URL.replace(/\/$/, '')}/${GITEA_REPOSITORY}.git`;
const repoDir = path.join(workspace, 'repo'); const repoDir = path.join(workspace, 'repo');
return withAskpass(workspace, credEnv => { return withAskpass(workspace, credEnv => {
@@ -48,7 +49,6 @@ export function cloneRepo(workspace, _spawnSync = spawnSync) {
export async function commitAndPush(workspace, _spawnSync = spawnSync) { export async function commitAndPush(workspace, _spawnSync = spawnSync) {
const run = makeRunner(_spawnSync); const run = makeRunner(_spawnSync);
const remoteUrl = `${GITEA_SERVER_URL.replace(/\/$/, '')}/${GITEA_REPOSITORY}.git`;
try { try {
const repoDir = cloneRepo(workspace, _spawnSync); const repoDir = cloneRepo(workspace, _spawnSync);