diff --git a/extensions/ql-vscode/src/extension.ts b/extensions/ql-vscode/src/extension.ts index c9d5d700996..c62a27783b3 100644 --- a/extensions/ql-vscode/src/extension.ts +++ b/extensions/ql-vscode/src/extension.ts @@ -37,6 +37,7 @@ import { CliConfigListener, DistributionConfigListener, isCanary, + isCodespacesTemplate, joinOrderWarningThreshold, MAX_QUERIES, QueryHistoryConfigListener, @@ -234,7 +235,10 @@ export async function activate( const distributionConfigListener = new DistributionConfigListener(); await initializeLogging(ctx); await initializeTelemetry(extension, ctx); - addUnhandledRejectionListener(); + if (!isCodespacesTemplate()) { + addUnhandledRejectionListener(); + } + install(); const codelensProvider = new QuickEvalCodeLensProvider(); diff --git a/extensions/ql-vscode/src/local-databases-ui.ts b/extensions/ql-vscode/src/local-databases-ui.ts index f80b0f8394a..c68bae4e77f 100644 --- a/extensions/ql-vscode/src/local-databases-ui.ts +++ b/extensions/ql-vscode/src/local-databases-ui.ts @@ -379,15 +379,8 @@ export class DatabaseUI extends DisposableObject { ); let databaseItem = this.databaseManager.findDatabaseItem(uri); - const isTutorialDatabase = true; if (databaseItem === undefined) { - databaseItem = await this.databaseManager.openDatabase( - progress, - token, - uri, - "CodeQL Tutorial Database", - isTutorialDatabase, - ); + databaseItem = await this.openTutorialDatabase(progress, token, uri); } await this.databaseManager.setCurrentDatabaseItem(databaseItem); } @@ -401,6 +394,22 @@ export class DatabaseUI extends DisposableObject { } }; + // Opens the tutorial database for the CodeQL Tour. + // We set the database name as "CodeQL Tutorial Database" in purpose. This means + // we won't attempt to create a skeleton QL pack for this database. + openTutorialDatabase = async ( + progress: ProgressCallback, + token: CancellationToken, + uri: Uri, + ): Promise => { + return await this.databaseManager.openDatabase( + progress, + token, + uri, + "CodeQL Tutorial Database", + ); + }; + handleRemoveOrphanedDatabases = async (): Promise => { void extLogger.log("Removing orphaned databases from workspace storage."); let dbDirs = undefined; diff --git a/extensions/ql-vscode/src/local-databases.ts b/extensions/ql-vscode/src/local-databases.ts index 8ba756df77f..36ed8f88fef 100644 --- a/extensions/ql-vscode/src/local-databases.ts +++ b/extensions/ql-vscode/src/local-databases.ts @@ -607,7 +607,6 @@ export class DatabaseManager extends DisposableObject { token: vscode.CancellationToken, uri: vscode.Uri, displayName?: string, - isTutorialDatabase?: boolean, ): Promise { const contents = await DatabaseResolver.resolveDatabaseContents(uri); // Ignore the source archive for QLTest databases by default. @@ -631,7 +630,7 @@ export class DatabaseManager extends DisposableObject { await this.addDatabaseItem(progress, token, databaseItem); await this.addDatabaseSourceArchiveFolder(databaseItem); - if (isCodespacesTemplate() && !isTutorialDatabase) { + if (isCodespacesTemplate() && displayName !== "CodeQL Tutorial Database") { await this.createSkeletonPacks(databaseItem); } diff --git a/extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-databases.test.ts b/extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-databases.test.ts index df020a5b910..9b09abc8118 100644 --- a/extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-databases.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-databases.test.ts @@ -715,14 +715,11 @@ describe("local databases", () => { it("should not offer to create a skeleton QL pack", async () => { jest.spyOn(Setting.prototype, "getValue").mockReturnValue(true); - const isTutorialDatabase = true; - await databaseManager.openDatabase( {} as ProgressCallback, {} as CancellationToken, mockDbItem.databaseUri, "CodeQL Tutorial Database", - isTutorialDatabase, ); expect(createSkeletonPacksSpy).toBeCalledTimes(0); diff --git a/extensions/ql-vscode/test/vscode-tests/no-workspace/local-databases-ui.test.ts b/extensions/ql-vscode/test/vscode-tests/no-workspace/local-databases-ui.test.ts index 61b56592b0b..6e2add5258f 100644 --- a/extensions/ql-vscode/test/vscode-tests/no-workspace/local-databases-ui.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/no-workspace/local-databases-ui.test.ts @@ -7,12 +7,14 @@ import { createFileSync, pathExistsSync, } from "fs-extra"; -import { Uri } from "vscode"; +import { CancellationToken, Uri } from "vscode"; import { DatabaseUI } from "../../../src/local-databases-ui"; import { testDisposeHandler } from "../test-dispose-handler"; import { createMockApp } from "../../__mocks__/appMock"; import { QueryLanguage } from "../../../src/common/query-language"; +import { App } from "../../../src/common/app"; +import { ProgressCallback } from "../../../src/commandRunner"; describe("local-databases-ui", () => { describe("fixDbUri", () => { @@ -116,6 +118,51 @@ describe("local-databases-ui", () => { databaseUI.dispose(testDisposeHandler); }); + describe("openTutorialDatabase", () => { + let app: App; + let databaseUI: DatabaseUI; + let openDatabaseSpy: jest.SpyInstance; + let databaseManager: any; + + beforeEach(async () => { + app = createMockApp({}); + openDatabaseSpy = jest.fn(); + + databaseManager = { + databaseItems: [], + openDatabase: openDatabaseSpy, + onDidChangeDatabaseItem: () => { + /**/ + }, + onDidChangeCurrentDatabaseItem: () => { + /**/ + }, + }; + databaseUI = new DatabaseUI( + app, + databaseManager as any, + {} as any, + "", + "", + ); + }); + + it("should call openDatase with 'CodeQL Tutorial Database' as displayName", async () => { + await databaseUI.openTutorialDatabase( + {} as ProgressCallback, + {} as CancellationToken, + Uri.parse(""), + ); + + expect(openDatabaseSpy).toHaveBeenCalledWith( + expect.anything(), + expect.anything(), + expect.anything(), + "CodeQL Tutorial Database", + ); + }); + }); + function createDatabase( storageDir: string, dbName: string,