дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-09 19:25:54 +02:00
fix(tasks): Make every background task cancellable, queued or running (#177)
Background tasks often couldn't be cancelled, or cancelling didn't stop them: - A cancel that arrived before the backend registered the request was dropped (build while saving files, multi-repository fetch/pull between repositories). The host now remembers early cancels (bounded, 2 min), and request ids start at a random value per page. - There was no queue and no common cancel path: backend-reported tasks (LSP progress, deployment transfers) couldn't be cancelled, and tool installs, VCS operations and update checks had no cancel button in Background Tasks. - Only the direct child process was killed, and JDK / tool archives were extracted without checking for cancellation. Tool installs and JDK downloads now share a downloads queue; cancelling a queued task removes it without starting any work. Every task cancels through one path that shows "Cancelling…" and then removes it; tasks that can't be interrupted show a disabled cancel button with the reason. IdeEvent::Task carries `cancellable` with a cancel_task command, cancellable LSP progress sends window/workDoneProgress/cancel, installers, curl and tar run in their own process group and are killed as a group, and extraction checks for cancellation between entries. Claude-Session: https://claude.ai/code/session_01Dq6jQQn8ZhRfkkyj3PRutA
Цей коміт міститься в:
1 джерело
c6621c5c36
коміт
1c46a1cd04
40 files changed
+888
-148
No files matched your search
@@ -70,6 +70,22 @@ describe("tools store", () => {
|
||||
expect(useTools.getState().tools.find((t) => t.name === "gopls")?.status).toBe("missing");
|
||||
});
|
||||
|
||||
it("installs one at a time; one cancelled while it waits never starts", async () => {
|
||||
backend.stepMs = 10;
|
||||
await refreshTools();
|
||||
const install = vi.spyOn(backend, "install");
|
||||
const first = installTool("gopls");
|
||||
const queued = installTool("vtsls");
|
||||
expect(useTasks.getState().tasks.find((t) => t.id === "tools:vtsls")).toMatchObject({ queued: true });
|
||||
cancelInstall("vtsls");
|
||||
expect(useTasks.getState().tasks.find((t) => t.id === "tools:vtsls")).toBeUndefined();
|
||||
expect(await queued).toBeNull();
|
||||
expect(useTools.getState().logs["vtsls"]?.error).toBe("Cancelled");
|
||||
expect((await first)?.status).toBe("installed");
|
||||
expect(install.mock.calls.map((c) => c[0])).toEqual(["gopls"]);
|
||||
expect(notes.filter((n) => n.level === "error")).toHaveLength(0);
|
||||
});
|
||||
|
||||
it("uninstalls", async () => {
|
||||
await refreshTools();
|
||||
expect(await uninstallTool("rust-analyzer")).toBe(true);
|
||||
|
||||
Reference in new issue
Заблокувати користувача