refactor: streamline JSON file reading logic and improve error handling in findings.js and git.js
This commit is contained in:
+15
-20
@@ -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 : [];
|
||||
const exclusions = readJSONArray(path.join(workspace, EXCLUSIONS_PATH), '排除問題');
|
||||
console.log(` 讀取排除問題: ${exclusions.length} 筆`);
|
||||
return exclusions;
|
||||
} catch (e) {
|
||||
console.log(` ⚠️ 讀取排除問題失敗: ${e.message},跳過過濾`);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user