Skip to content

Commit b2fa85f

Browse files
Merge pull request #2036 from github/shati-elena/create-skeleton
Introduce command for creating skeleton QL packs
2 parents 74581fb + 235fb83 commit b2fa85f

5 files changed

Lines changed: 210 additions & 48 deletions

File tree

extensions/ql-vscode/src/databases.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {
99
showAndLogInformationMessage,
1010
isLikelyDatabaseRoot,
1111
showAndLogExceptionWithTelemetry,
12+
isFolderAlreadyInWorkspace,
13+
showBinaryChoiceDialog,
1214
} from "./helpers";
1315
import { ProgressCallback, withProgress } from "./commandRunner";
1416
import {
@@ -23,6 +25,7 @@ import { asError, getErrorMessage } from "./pure/helpers-pure";
2325
import { QueryRunner } from "./queryRunner";
2426
import { pathsEqual } from "./pure/files";
2527
import { redactableError } from "./pure/errors";
28+
import { isCodespacesTemplate } from "./config";
2629

2730
/**
2831
* databases.ts
@@ -621,9 +624,38 @@ export class DatabaseManager extends DisposableObject {
621624
await this.addDatabaseItem(progress, token, databaseItem);
622625
await this.addDatabaseSourceArchiveFolder(databaseItem);
623626

627+
if (isCodespacesTemplate()) {
628+
await this.createSkeletonPacks(databaseItem);
629+
}
630+
624631
return databaseItem;
625632
}
626633

634+
public async createSkeletonPacks(databaseItem: DatabaseItem) {
635+
if (databaseItem === undefined) {
636+
void this.logger.log(
637+
"Could not create QL pack because no database is selected. Please add a database.",
638+
);
639+
return;
640+
}
641+
642+
if (databaseItem.language === "") {
643+
void this.logger.log(
644+
"Could not create skeleton QL pack because the selected database's language is not set.",
645+
);
646+
return;
647+
}
648+
649+
const folderName = `codeql-custom-queries-${databaseItem.language}`;
650+
if (isFolderAlreadyInWorkspace(folderName)) {
651+
return;
652+
}
653+
654+
await showBinaryChoiceDialog(
655+
`We've noticed you don't have a QL pack downloaded to analyze this database. Can we set up a ${databaseItem.language} query pack for you`,
656+
);
657+
}
658+
627659
private async reregisterDatabases(
628660
progress: ProgressCallback,
629661
token: vscode.CancellationToken,

extensions/ql-vscode/src/helpers.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,15 @@ export function getOnDiskWorkspaceFolders() {
255255
return diskWorkspaceFolders;
256256
}
257257

258+
/** Check if folder is already present in workspace */
259+
export function isFolderAlreadyInWorkspace(folderName: string) {
260+
const workspaceFolders = workspace.workspaceFolders || [];
261+
262+
return !!workspaceFolders.find(
263+
(workspaceFolder) => workspaceFolder.name === folderName,
264+
);
265+
}
266+
258267
/**
259268
* Provides a utility method to invoke a function only if a minimum time interval has elapsed since
260269
* the last invocation of that function.

extensions/ql-vscode/test/vscode-tests/minimal-workspace/config.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ describe("config listeners", () => {
108108
await wait();
109109
const newValue = listener[setting.property as keyof typeof listener];
110110
expect(newValue).toEqual(setting.values[1]);
111-
expect(onDidChangeConfiguration).toHaveBeenCalledTimes(1);
111+
expect(onDidChangeConfiguration).toHaveBeenCalled();
112112
});
113113
});
114114
});

0 commit comments

Comments
 (0)