refactor: streamline JSON file reading logic and improve error handling in findings.js and git.js
This commit is contained in:
+17
-22
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user