Skip to content

Commit 467c2a5

Browse files
Merge pull request #2328 from github/yer-a-single-rooted-workspace-query
Ensure we're selecting database in single rooted workspace
2 parents 72a3e8d + 93a2b06 commit 467c2a5

File tree

5 files changed

+76
-57
lines changed

5 files changed

+76
-57
lines changed

extensions/ql-vscode/src/databaseFetcher.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,15 @@ async function databaseArchiveFetcher(
317317
});
318318
await ensureZippedSourceLocation(dbPath);
319319

320+
const makeSelected = true;
321+
320322
const item = await databaseManager.openDatabase(
321323
progress,
322324
token,
323325
Uri.file(dbPath),
326+
makeSelected,
324327
nameOverride,
325328
);
326-
await databaseManager.setCurrentDatabaseItem(item);
327329
return item;
328330
} else {
329331
throw new Error("Database not found in archive.");

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

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -306,18 +306,21 @@ export class DatabaseUI extends DisposableObject {
306306
`${workspace.workspaceFolders[0].uri}/.tours/codeql-tutorial-database`,
307307
);
308308

309-
let databaseItem = this.databaseManager.findDatabaseItem(uri);
310-
const isTutorialDatabase = true;
309+
const databaseItem = this.databaseManager.findDatabaseItem(uri);
311310
if (databaseItem === undefined) {
312-
databaseItem = await this.databaseManager.openDatabase(
311+
const makeSelected = true;
312+
const nameOverride = "CodeQL Tutorial Database";
313+
const isTutorialDatabase = true;
314+
315+
await this.databaseManager.openDatabase(
313316
progress,
314317
token,
315318
uri,
316-
"CodeQL Tutorial Database",
319+
makeSelected,
320+
nameOverride,
317321
isTutorialDatabase,
318322
);
319323
}
320-
await this.databaseManager.setCurrentDatabaseItem(databaseItem);
321324
await this.handleTourDependencies();
322325
}
323326
} catch (e) {
@@ -630,7 +633,7 @@ export class DatabaseUI extends DisposableObject {
630633
this.queryServer?.cliServer,
631634
);
632635
} else {
633-
await this.setCurrentDatabase(progress, token, uri);
636+
await this.databaseManager.openDatabase(progress, token, uri);
634637
}
635638
} catch (e) {
636639
// rethrow and let this be handled by default error handling.
@@ -752,24 +755,6 @@ export class DatabaseUI extends DisposableObject {
752755
return this.databaseManager.currentDatabaseItem;
753756
}
754757

755-
private async setCurrentDatabase(
756-
progress: ProgressCallback,
757-
token: CancellationToken,
758-
uri: Uri,
759-
): Promise<DatabaseItem | undefined> {
760-
let databaseItem = this.databaseManager.findDatabaseItem(uri);
761-
if (databaseItem === undefined) {
762-
databaseItem = await this.databaseManager.openDatabase(
763-
progress,
764-
token,
765-
uri,
766-
);
767-
}
768-
await this.databaseManager.setCurrentDatabaseItem(databaseItem);
769-
770-
return databaseItem;
771-
}
772-
773758
/**
774759
* Ask the user for a database directory. Returns the chosen database, or `undefined` if the
775760
* operation was canceled.
@@ -789,7 +774,11 @@ export class DatabaseUI extends DisposableObject {
789774
if (byFolder) {
790775
const fixedUri = await this.fixDbUri(uri);
791776
// we are selecting a database folder
792-
return await this.setCurrentDatabase(progress, token, fixedUri);
777+
return await this.databaseManager.openDatabase(
778+
progress,
779+
token,
780+
fixedUri,
781+
);
793782
} else {
794783
// we are selecting a database archive. Must unzip into a workspace-controlled area
795784
// before importing.

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ export class DatabaseManager extends DisposableObject {
621621
progress: ProgressCallback,
622622
token: vscode.CancellationToken,
623623
uri: vscode.Uri,
624+
makeSelected = false,
624625
displayName?: string,
625626
isTutorialDatabase?: boolean,
626627
): Promise<DatabaseItem> {
@@ -629,6 +630,7 @@ export class DatabaseManager extends DisposableObject {
629630
return await this.addExistingDatabaseItem(
630631
databaseItem,
631632
progress,
633+
makeSelected,
632634
token,
633635
isTutorialDatabase,
634636
);
@@ -643,6 +645,7 @@ export class DatabaseManager extends DisposableObject {
643645
public async addExistingDatabaseItem(
644646
databaseItem: DatabaseItem,
645647
progress: ProgressCallback,
648+
makeSelected = true,
646649
token: vscode.CancellationToken,
647650
isTutorialDatabase?: boolean,
648651
): Promise<DatabaseItem> {
@@ -652,6 +655,9 @@ export class DatabaseManager extends DisposableObject {
652655
}
653656

654657
await this.addDatabaseItem(progress, token, databaseItem);
658+
if (makeSelected) {
659+
await this.setCurrentDatabaseItem(databaseItem);
660+
}
655661
await this.addDatabaseSourceArchiveFolder(databaseItem);
656662

657663
if (isCodespacesTemplate() && !isTutorialDatabase) {

extensions/ql-vscode/src/skeleton-query-wizard.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,14 @@ export class SkeletonQueryWizard {
6464
if (skeletonPackAlreadyExists) {
6565
// just create a new example query file in skeleton QL pack
6666
await this.createExampleFile();
67-
// select existing database for language
68-
await this.selectExistingDatabase();
6967
} else {
7068
// generate a new skeleton QL pack with query file
7169
await this.createQlPack();
72-
// download database based on language and select it
73-
await this.downloadDatabase();
7470
}
7571

72+
// select existing database for language or download a new one
73+
await this.selectOrDownloadDatabase();
74+
7675
// open a query file
7776

7877
try {
@@ -216,41 +215,19 @@ export class SkeletonQueryWizard {
216215
);
217216
}
218217

219-
private async selectExistingDatabase() {
220-
if (this.language === undefined) {
221-
throw new Error("Language is undefined");
222-
}
223-
218+
private async selectOrDownloadDatabase() {
224219
if (this.qlPackStoragePath === undefined) {
225220
throw new Error("QL Pack storage path is undefined");
226221
}
227222

228-
const databaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
229-
230-
const existingDatabaseItem = await this.findDatabaseItemByNwo(
231-
this.language,
232-
databaseNwo,
233-
this.databaseManager.databaseItems,
234-
);
223+
const existingDatabaseItem = await this.findExistingDatabaseItem();
235224

236225
if (existingDatabaseItem) {
237226
// select the found database
238227
await this.databaseManager.setCurrentDatabaseItem(existingDatabaseItem);
239228
} else {
240-
const sameLanguageDatabaseItem = await this.findDatabaseItemByLanguage(
241-
this.language,
242-
this.databaseManager.databaseItems,
243-
);
244-
245-
if (sameLanguageDatabaseItem) {
246-
// select the found database
247-
await this.databaseManager.setCurrentDatabaseItem(
248-
sameLanguageDatabaseItem,
249-
);
250-
} else {
251-
// download new database and select it
252-
await this.downloadDatabase();
253-
}
229+
// download new database and select it
230+
await this.downloadDatabase();
254231
}
255232
}
256233

@@ -286,4 +263,27 @@ export class SkeletonQueryWizard {
286263
}
287264
return dbs[0];
288265
}
266+
267+
private async findExistingDatabaseItem() {
268+
if (this.language === undefined) {
269+
throw new Error("Language is undefined");
270+
}
271+
272+
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
273+
274+
const defaultDatabaseItem = await this.findDatabaseItemByNwo(
275+
this.language,
276+
defaultDatabaseNwo,
277+
this.databaseManager.databaseItems,
278+
);
279+
280+
if (defaultDatabaseItem !== undefined) {
281+
return defaultDatabaseItem;
282+
}
283+
284+
return await this.findDatabaseItemByLanguage(
285+
this.language,
286+
this.databaseManager.databaseItems,
287+
);
288+
}
289289
}

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,7 @@ describe("local databases", () => {
708708
describe("openDatabase", () => {
709709
let createSkeletonPacksSpy: jest.SpyInstance;
710710
let resolveDatabaseContentsSpy: jest.SpyInstance;
711+
let setCurrentDatabaseItemSpy: jest.SpyInstance;
711712
let addDatabaseSourceArchiveFolderSpy: jest.SpyInstance;
712713
let mockDbItem: DatabaseItemImpl;
713714

@@ -722,6 +723,11 @@ describe("local databases", () => {
722723
.spyOn(DatabaseResolver, "resolveDatabaseContents")
723724
.mockResolvedValue({} as DatabaseContentsWithDbScheme);
724725

726+
setCurrentDatabaseItemSpy = jest.spyOn(
727+
databaseManager,
728+
"setCurrentDatabaseItem",
729+
);
730+
725731
addDatabaseSourceArchiveFolderSpy = jest.spyOn(
726732
databaseManager,
727733
"addDatabaseSourceArchiveFolder",
@@ -746,6 +752,19 @@ describe("local databases", () => {
746752
expect(resolveDatabaseContentsSpy).toBeCalledTimes(1);
747753
});
748754

755+
it("should set the database as the currently selected one", async () => {
756+
const makeSelected = true;
757+
758+
await databaseManager.openDatabase(
759+
{} as ProgressCallback,
760+
{} as CancellationToken,
761+
mockDbItem.databaseUri,
762+
makeSelected,
763+
);
764+
765+
expect(setCurrentDatabaseItemSpy).toBeCalledTimes(1);
766+
});
767+
749768
it("should add database source archive folder", async () => {
750769
await databaseManager.openDatabase(
751770
{} as ProgressCallback,
@@ -762,12 +781,15 @@ describe("local databases", () => {
762781
jest.spyOn(Setting.prototype, "getValue").mockReturnValue(true);
763782

764783
const isTutorialDatabase = true;
784+
const makeSelected = true;
785+
const nameOverride = "CodeQL Tutorial Database";
765786

766787
await databaseManager.openDatabase(
767788
{} as ProgressCallback,
768789
{} as CancellationToken,
769790
mockDbItem.databaseUri,
770-
"CodeQL Tutorial Database",
791+
makeSelected,
792+
nameOverride,
771793
isTutorialDatabase,
772794
);
773795

0 commit comments

Comments
 (0)