Compare commits
3 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
546d2615c7 | |
|
|
f693d56762 | |
|
|
a72ea9ad1d |
|
|
@ -4,7 +4,9 @@ import type { TaskQueue } from "../queue.js";
|
|||
import type { Config } from "../config.js";
|
||||
|
||||
/**
|
||||
* Issue comment created or edited → re-trigger analyst if still in analysis.
|
||||
* Issue comment created or edited:
|
||||
* - On a PR → re-trigger tester
|
||||
* - On an issue still in analysis → re-trigger analyst
|
||||
*
|
||||
* Replaces: issue-comment-reply.json
|
||||
*/
|
||||
|
|
@ -23,6 +25,29 @@ export function issueComment(config: Config, queue: TaskQueue) {
|
|||
return c.text("ignored: bot comment", 200);
|
||||
}
|
||||
|
||||
const [org, repo] = event.repository.full_name.split("/");
|
||||
const isPullRequest = !!event.issue.pull_request;
|
||||
|
||||
if (isPullRequest) {
|
||||
// Comment on a PR → re-trigger tester
|
||||
const task: TaskRequest = {
|
||||
taskType: "test",
|
||||
issueNumber: event.issue.number,
|
||||
giteaOrg: org,
|
||||
giteaRepo: repo,
|
||||
repoCloneUrl: event.repository.clone_url,
|
||||
giteaToken: config.giteaReviewToken,
|
||||
};
|
||||
|
||||
const queued = await queue.enqueue(task, {
|
||||
useReviewAccount: true,
|
||||
body: "🤖 Re-triggering **test** — workspace queued.",
|
||||
});
|
||||
|
||||
return c.json({ ok: true, queued });
|
||||
}
|
||||
|
||||
// Regular issue comment → re-trigger analyst if still in analysis
|
||||
const labels = event.issue.labels.map((l) => l.name);
|
||||
const pastAnalysis =
|
||||
labels.includes("ready-for-architecture") ||
|
||||
|
|
@ -32,8 +57,6 @@ export function issueComment(config: Config, queue: TaskQueue) {
|
|||
return c.text("ignored: issue past analysis stage", 200);
|
||||
}
|
||||
|
||||
const [org, repo] = event.repository.full_name.split("/");
|
||||
|
||||
const task: TaskRequest = {
|
||||
taskType: "analyse",
|
||||
issueNumber: event.issue.number,
|
||||
|
|
|
|||
|
|
@ -16,14 +16,33 @@ export function prRework(config: Config, queue: TaskQueue) {
|
|||
return c.text("ignored: not a reviewed event", 200);
|
||||
}
|
||||
|
||||
if (!event.review?.state) {
|
||||
console.log(`[pr-rework] ignored: no review state (review: ${JSON.stringify(event.review)})`);
|
||||
if (!event.review) {
|
||||
console.log(`[pr-rework] ignored: no review object`);
|
||||
return c.text("ignored: no review data", 200);
|
||||
}
|
||||
|
||||
const [org, repo] = event.repository.full_name.split("/");
|
||||
const prNumber = event.pull_request.number;
|
||||
const reviewState = event.review.state.toLowerCase();
|
||||
|
||||
// Gitea webhook payloads use "state" in the API but "type" in webhooks
|
||||
// state: "REQUEST_CHANGES" | "APPROVED" | "COMMENT"
|
||||
// type: "pull_request_review_rejected" | "pull_request_review_approved" | ...
|
||||
let reviewState: string;
|
||||
if (event.review.state) {
|
||||
reviewState = event.review.state.toLowerCase();
|
||||
} else if (event.review.type) {
|
||||
const typeMap: Record<string, string> = {
|
||||
pull_request_review_rejected: "request_changes",
|
||||
pull_request_review_approved: "approved",
|
||||
pull_request_review_comment: "comment",
|
||||
};
|
||||
reviewState = typeMap[event.review.type] || event.review.type;
|
||||
} else {
|
||||
console.log(`[pr-rework] ignored: no review state or type (review: ${JSON.stringify(event.review)})`);
|
||||
return c.text("ignored: no review state", 200);
|
||||
}
|
||||
|
||||
console.log(`[pr-rework] PR #${prNumber} review: ${reviewState}`);
|
||||
|
||||
let taskType: string | null = null;
|
||||
let giteaToken: string;
|
||||
|
|
|
|||
|
|
@ -161,6 +161,8 @@ export class TaskQueue {
|
|||
jobId: `create-${key}`,
|
||||
attempts: 3,
|
||||
backoff: { type: "exponential", delay: 5000 },
|
||||
removeOnComplete: true,
|
||||
removeOnFail: true,
|
||||
},
|
||||
);
|
||||
} catch (err: unknown) {
|
||||
|
|
@ -201,6 +203,8 @@ export class TaskQueue {
|
|||
jobId: `cleanup-${workspaceName}`,
|
||||
attempts: 5,
|
||||
backoff: { type: "exponential", delay: 10000 },
|
||||
removeOnComplete: true,
|
||||
removeOnFail: true,
|
||||
},
|
||||
);
|
||||
|
||||
|
|
@ -311,6 +315,8 @@ export class TaskQueue {
|
|||
jobId: `cleanup-stale-${ws.name}-${Date.now()}`,
|
||||
attempts: 5,
|
||||
backoff: { type: "exponential", delay: 10000 },
|
||||
removeOnComplete: true,
|
||||
removeOnFail: true,
|
||||
},
|
||||
);
|
||||
} catch (err) {
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ export interface GiteaIssue {
|
|||
state: string;
|
||||
user: GiteaUser;
|
||||
labels: GiteaLabel[];
|
||||
pull_request?: { merged: boolean } | null;
|
||||
}
|
||||
|
||||
export interface GiteaPullRequest {
|
||||
|
|
@ -46,7 +47,8 @@ export interface GiteaPullRequest {
|
|||
export interface GiteaReview {
|
||||
id: number;
|
||||
body: string;
|
||||
state: string; // "approved", "request_changes", "comment"
|
||||
state?: string; // "approved", "request_changes", "comment" (API response)
|
||||
type?: string; // "pull_request_review_rejected" | "pull_request_review_approved" (webhook payload)
|
||||
user: GiteaUser;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue