Make preparation progress bar cancellable

This commit is contained in:
Nora
2024-01-03 15:15:17 +00:00
parent cce0e146ff
commit 6a65094720
3 changed files with 51 additions and 5 deletions

View File

@@ -1,11 +1,14 @@
import { join } from "path";
import { outputFile, pathExists, readFile } from "fs-extra";
import { dump as dumpYaml, load as loadYaml } from "js-yaml";
import { Uri } from "vscode";
import { CancellationToken, Uri } from "vscode";
import Ajv from "ajv";
import { CodeQLCliServer } from "../codeql-cli/cli";
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
import { ProgressCallback } from "../common/vscode/progress";
import {
ProgressCallback,
UserCancellationException,
} from "../common/vscode/progress";
import { DatabaseItem } from "../databases/local-databases";
import { getQlPackPath, QLPACK_FILENAMES } from "../common/ql";
import { getErrorMessage } from "../common/helpers-pure";
@@ -31,6 +34,7 @@ export async function pickExtensionPack(
modelConfig: ModelConfig,
logger: NotificationLogger,
progress: ProgressCallback,
token: CancellationToken,
maxStep: number,
): Promise<ExtensionPack | undefined> {
progress({
@@ -50,6 +54,13 @@ export async function pickExtensionPack(
true,
);
if (token.isCancellationRequested) {
throw new UserCancellationException(
"Open Model editor action cancelled.",
true,
);
}
progress({
message: "Creating extension pack...",
step: 2,

View File

@@ -6,7 +6,10 @@ import { DatabaseItem, DatabaseManager } from "../databases/local-databases";
import { ensureDir } from "fs-extra";
import { join } from "path";
import { App } from "../common/app";
import { withProgress } from "../common/vscode/progress";
import {
UserCancellationException,
withProgress,
} from "../common/vscode/progress";
import { pickExtensionPack } from "./extension-pack-picker";
import { showAndLogErrorMessage } from "../common/logging";
import { dir } from "tmp-promise";
@@ -159,7 +162,7 @@ export class ModelEditorModule extends DisposableObject {
}
return withProgress(
async (progress) => {
async (progress, token) => {
const maxStep = 4;
if (!(await this.cliServer.cliConstraints.supportsQlpacksKind())) {
@@ -176,6 +179,7 @@ export class ModelEditorModule extends DisposableObject {
this.modelConfig,
this.app.logger,
progress,
token,
maxStep,
);
if (!modelFile) {
@@ -188,6 +192,13 @@ export class ModelEditorModule extends DisposableObject {
maxStep,
});
if (token.isCancellationRequested) {
throw new UserCancellationException(
"Open Model editor action cancelled.",
true,
);
}
// Create new temporary directory for query files and pack dependencies
const { path: queryDir, cleanup: cleanupQueryDir } = await dir({
unsafeCleanup: true,
@@ -211,6 +222,13 @@ export class ModelEditorModule extends DisposableObject {
maxStep,
});
if (token.isCancellationRequested) {
throw new UserCancellationException(
"Open Model editor action cancelled.",
true,
);
}
// Check again just before opening the editor to ensure no model editor has been opened between
// our first check and now.
if (this.modelingStore.isDbOpen(db.databaseUri.toString())) {
@@ -253,6 +271,7 @@ export class ModelEditorModule extends DisposableObject {
},
{
title: "Opening CodeQL Model Editor",
cancellable: true,
},
);
}

View File

@@ -1,4 +1,9 @@
import { Uri, workspace, WorkspaceFolder } from "vscode";
import {
CancellationTokenSource,
Uri,
workspace,
WorkspaceFolder,
} from "vscode";
import { dump as dumpYaml, load as loadYaml } from "js-yaml";
import { outputFile, readFile } from "fs-extra";
import { join } from "path";
@@ -24,6 +29,7 @@ describe("pickExtensionPack", () => {
};
const progress = jest.fn();
const token = new CancellationTokenSource().token;
let workspaceFoldersSpy: jest.SpyInstance;
let additionalPacks: string[];
let workspaceFolder: WorkspaceFolder;
@@ -79,6 +85,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(autoExtensionPack);
@@ -136,6 +143,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual({
@@ -190,6 +198,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual({
@@ -234,6 +243,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(undefined);
@@ -260,6 +270,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(undefined);
@@ -288,6 +299,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(undefined);
@@ -326,6 +338,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(undefined);
@@ -364,6 +377,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(undefined);
@@ -405,6 +419,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(undefined);
@@ -463,6 +478,7 @@ describe("pickExtensionPack", () => {
modelConfig,
logger,
progress,
token,
maxStep,
),
).toEqual(extensionPack);