Skip to content

Commit f260143

Browse files
committed
Remember user's choice to not be prompted again
By writing the setting to our new `codeQL.autogenerateQlPacks` setting.
1 parent 8392284 commit f260143

2 files changed

Lines changed: 58 additions & 16 deletions

File tree

extensions/ql-vscode/src/databases/local-databases.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
isLikelyDatabaseRoot,
1111
showAndLogExceptionWithTelemetry,
1212
isFolderAlreadyInWorkspace,
13-
showBinaryChoiceDialog,
1413
getFirstWorkspaceFolder,
14+
showNeverAskAgainDialog,
1515
} from "../helpers";
1616
import { ProgressCallback, withProgress } from "../progress";
1717
import {
@@ -26,7 +26,11 @@ import { asError, getErrorMessage } from "../pure/helpers-pure";
2626
import { QueryRunner } from "../query-server";
2727
import { pathsEqual } from "../pure/files";
2828
import { redactableError } from "../pure/errors";
29-
import { isCodespacesTemplate } from "../config";
29+
import {
30+
getAutogenerateQlPacks,
31+
isCodespacesTemplate,
32+
setAutogenerateQlPacks,
33+
} from "../config";
3034
import { QlPackGenerator } from "../qlpack-generator";
3135
import { QueryLanguage } from "../common/query-language";
3236
import { App } from "../common/app";
@@ -742,11 +746,20 @@ export class DatabaseManager extends DisposableObject {
742746
return;
743747
}
744748

745-
const answer = await showBinaryChoiceDialog(
749+
if (getAutogenerateQlPacks() === "No, and never ask me again") {
750+
return;
751+
}
752+
753+
const answer = await showNeverAskAgainDialog(
746754
`We've noticed you don't have a CodeQL pack available to analyze this database. Can we set up a query pack for you?`,
747755
);
748756

749-
if (!answer) {
757+
if (answer === "No") {
758+
return;
759+
}
760+
761+
if (answer === "No, and never ask me again") {
762+
await setAutogenerateQlPacks("No, and never ask me again");
750763
return;
751764
}
752765

extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-databases.test.ts

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ describe("local databases", () => {
4444
let packAddSpy: jest.Mock<any, []>;
4545
let logSpy: jest.Mock<any, []>;
4646

47-
let showBinaryChoiceDialogSpy: jest.SpiedFunction<
48-
typeof helpers.showBinaryChoiceDialog
47+
let showNeverAskAgainDialogSpy: jest.SpiedFunction<
48+
typeof helpers.showNeverAskAgainDialog
4949
>;
5050

5151
let dir: tmp.DirResult;
@@ -63,9 +63,9 @@ describe("local databases", () => {
6363
/* */
6464
});
6565

66-
showBinaryChoiceDialogSpy = jest
67-
.spyOn(helpers, "showBinaryChoiceDialog")
68-
.mockResolvedValue(true);
66+
showNeverAskAgainDialogSpy = jest
67+
.spyOn(helpers, "showNeverAskAgainDialog")
68+
.mockResolvedValue("Yes");
6969

7070
extensionContextStoragePath = dir.name;
7171

@@ -646,22 +646,51 @@ describe("local databases", () => {
646646
});
647647

648648
describe("when the language is set", () => {
649+
let originalValue: string | undefined;
650+
651+
beforeEach(() => {
652+
originalValue = workspace
653+
.getConfiguration("codeQL")
654+
.get("autogenerateQlPacks");
655+
});
656+
657+
afterEach(async () => {
658+
await workspace
659+
.getConfiguration("codeQL")
660+
.update("autogenerateQlPacks", originalValue);
661+
});
662+
649663
it("should offer the user to set up a skeleton QL pack", async () => {
650664
await (databaseManager as any).createSkeletonPacks(mockDbItem);
651665

652-
expect(showBinaryChoiceDialogSpy).toBeCalledTimes(1);
666+
expect(showNeverAskAgainDialogSpy).toBeCalledTimes(1);
653667
});
654668

655669
it("should return early if the user refuses help", async () => {
656-
showBinaryChoiceDialogSpy = jest
657-
.spyOn(helpers, "showBinaryChoiceDialog")
658-
.mockResolvedValue(false);
670+
showNeverAskAgainDialogSpy = jest
671+
.spyOn(helpers, "showNeverAskAgainDialog")
672+
.mockResolvedValue("No");
659673

660674
await (databaseManager as any).createSkeletonPacks(mockDbItem);
661675

662676
expect(generateSpy).not.toBeCalled();
663677
});
664678

679+
it("should return early and write choice to settings if user wants to never be asked again", async () => {
680+
showNeverAskAgainDialogSpy = jest
681+
.spyOn(helpers, "showNeverAskAgainDialog")
682+
.mockResolvedValue("No, and never ask me again");
683+
const updateValueSpy = jest.spyOn(Setting.prototype, "updateValue");
684+
685+
await (databaseManager as any).createSkeletonPacks(mockDbItem);
686+
687+
expect(generateSpy).not.toBeCalled();
688+
expect(updateValueSpy).toHaveBeenCalledWith(
689+
"No, and never ask me again",
690+
1,
691+
);
692+
});
693+
665694
it("should create the skeleton QL pack for the user", async () => {
666695
await (databaseManager as any).createSkeletonPacks(mockDbItem);
667696

@@ -694,9 +723,9 @@ describe("local databases", () => {
694723
});
695724

696725
it("should exit early", async () => {
697-
showBinaryChoiceDialogSpy = jest
698-
.spyOn(helpers, "showBinaryChoiceDialog")
699-
.mockResolvedValue(false);
726+
showNeverAskAgainDialogSpy = jest
727+
.spyOn(helpers, "showNeverAskAgainDialog")
728+
.mockResolvedValue("No");
700729

701730
await (databaseManager as any).createSkeletonPacks(mockDbItem);
702731

0 commit comments

Comments
 (0)