feat(FN-5047): emit task:merged across merge finalize paths
Fusion-Task-Id: FN-5047 Fusion-Task-Lineage: 9b03f2de-1b4a-45ad-b1ce-0a6217d6da77
This commit is contained in:
committed by
gsxdsm
parent
f9c0b9399c
commit
d94ef51238
@@ -52,7 +52,7 @@ function makeStore(task: MockTask, settings: Record<string, unknown> = {}) {
|
||||
updates.push({ id, patch });
|
||||
}),
|
||||
updatePrInfo: vi.fn().mockResolvedValue(undefined),
|
||||
moveTask: vi.fn().mockResolvedValue(undefined),
|
||||
moveTask: vi.fn(async (_id: string, column: string) => ({ ...task, column })),
|
||||
logEntry: vi.fn().mockResolvedValue(undefined),
|
||||
getActiveMergingTask: vi.fn().mockReturnValue(null),
|
||||
_updates: updates,
|
||||
@@ -74,6 +74,7 @@ function makeStatefulStore(task: MockTask, settings: Record<string, unknown> = {
|
||||
}),
|
||||
moveTask: vi.fn(async (_id: string, column: string) => {
|
||||
state = { ...state, column };
|
||||
return structuredClone(state);
|
||||
}),
|
||||
logEntry: vi.fn().mockResolvedValue(undefined),
|
||||
getActiveMergingTask: vi.fn().mockReturnValue(null),
|
||||
@@ -732,6 +733,11 @@ describe("processPullRequestMergeTask", () => {
|
||||
mergePr: vi.fn(async () => mergedPr),
|
||||
};
|
||||
|
||||
const mergedEvents: unknown[] = [];
|
||||
store.on("task:merged", (result) => {
|
||||
mergedEvents.push(result);
|
||||
});
|
||||
|
||||
const result = await processPullRequestMergeTask(
|
||||
store as never,
|
||||
"/repo",
|
||||
@@ -746,6 +752,13 @@ describe("processPullRequestMergeTask", () => {
|
||||
expect(persisted.prInfo?.number).toBe(123);
|
||||
expect(persisted.prInfo?.url).toBe("https://github.com/x/y/pull/123");
|
||||
expect(store.updatePrInfo).toHaveBeenCalledTimes(3);
|
||||
expect(mergedEvents).toHaveLength(1);
|
||||
expect(mergedEvents[0]).toEqual(
|
||||
expect.objectContaining({
|
||||
merged: true,
|
||||
task: expect.objectContaining({ id: task.id, column: "done" }),
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
describe("requirePrApproval", () => {
|
||||
|
||||
@@ -18,7 +18,7 @@ import { promisify } from "node:util";
|
||||
const execAsync = promisify(exec);
|
||||
import type { TaskStore } from "@fusion/core";
|
||||
import { resolveTaskMergeTarget } from "@fusion/core";
|
||||
import type { Settings, TaskDetail, PrInfo } from "@fusion/core";
|
||||
import type { Settings, TaskDetail, PrInfo, MergeResult } from "@fusion/core";
|
||||
|
||||
/**
|
||||
* Minimal interface for GitHub operations needed by the PR merge workflow.
|
||||
@@ -179,8 +179,23 @@ async function finalizePullRequestMerge(
|
||||
): Promise<void> {
|
||||
await cleanupMergedTaskArtifacts(cwd, task);
|
||||
await store.updateTask(task.id, { status: null, mergeRetries: 0 });
|
||||
await store.moveTask(task.id, "done");
|
||||
const movedTask = await store.moveTask(task.id, "done");
|
||||
const mergedTask = movedTask ?? (await store.getTask(task.id));
|
||||
await store.logEntry(task.id, message, `PR #${prInfo.number}: ${prInfo.url}`);
|
||||
const settings = await store.getSettings();
|
||||
const mergeTargetBranch = resolveTaskMergeTarget(mergedTask, {
|
||||
projectDefaultBranch: typeof settings.baseBranch === "string" ? settings.baseBranch : undefined,
|
||||
});
|
||||
store.emit("task:merged", {
|
||||
task: mergedTask,
|
||||
branch: mergedTask.branch ?? getTaskBranchName(task.id),
|
||||
merged: true,
|
||||
worktreeRemoved: false,
|
||||
branchDeleted: false,
|
||||
mergeConfirmed: mergedTask.mergeDetails?.mergeConfirmed ?? true,
|
||||
mergedAt: mergedTask.mergeDetails?.mergedAt,
|
||||
mergeTargetBranch,
|
||||
} as MergeResult);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user