Skip to content

Commit 8c784d8

Browse files
authored
Merge pull request #3543 from github/koesie10/pack-name-config
Add `codeQL.model.packName` setting
2 parents 8a3a6d7 + 3f4ed48 commit 8c784d8

File tree

6 files changed

+213
-54
lines changed

6 files changed

+213
-54
lines changed

extensions/ql-vscode/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,11 @@
470470
"type": "string",
471471
"default": ".github/codeql/extensions/${name}-${language}",
472472
"markdownDescription": "Location for newly created CodeQL model packs. The location can be either absolute or relative. If relative, it is relative to the workspace root.\n\nThe following variables are supported:\n* **${database}** - the name of the database\n* **${language}** - the name of the language\n* **${name}** - the name of the GitHub repository, or the name of the database if the database was not downloaded from GitHub\n* **${owner}** - the owner of the GitHub repository, or an empty string if the database was not downloaded from GitHub"
473+
},
474+
"codeQL.model.packName": {
475+
"type": "string",
476+
"default": "${owner}/${name}-${language}",
477+
"markdownDescription": "Name of newly created CodeQL model packs. If the result is not a valid pack name, it will be converted to a valid pack name.\n\nThe following variables are supported:\n* **${database}** - the name of the database\n* **${language}** - the name of the language\n* **${name}** - the name of the GitHub repository, or the name of the database if the database was not downloaded from GitHub\n* **${owner}** - the owner of the GitHub repository, or an empty string if the database was not downloaded from GitHub"
473478
}
474479
}
475480
},

extensions/ql-vscode/src/config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ const LLM_GENERATION_DEV_ENDPOINT = new Setting(
736736
);
737737
const MODEL_EVALUATION = new Setting("evaluation", MODEL_SETTING);
738738
const MODEL_PACK_LOCATION = new Setting("packLocation", MODEL_SETTING);
739+
const MODEL_PACK_NAME = new Setting("packName", MODEL_SETTING);
739740
const ENABLE_PYTHON = new Setting("enablePython", MODEL_SETTING);
740741
const ENABLE_ACCESS_PATH_SUGGESTIONS = new Setting(
741742
"enableAccessPathSuggestions",
@@ -757,6 +758,7 @@ export interface ModelConfig {
757758
languageId: string,
758759
variables: ModelConfigPackVariables,
759760
): string;
761+
getPackName(languageId: string, variables: ModelConfigPackVariables): string;
760762
enablePython: boolean;
761763
enableAccessPathSuggestions: boolean;
762764
}
@@ -810,6 +812,18 @@ export class ModelConfigListener extends ConfigListener implements ModelConfig {
810812
);
811813
}
812814

815+
public getPackName(
816+
languageId: string,
817+
variables: ModelConfigPackVariables,
818+
): string {
819+
return substituteConfigVariables(
820+
MODEL_PACK_NAME.getValue<string>({
821+
languageId,
822+
}),
823+
variables,
824+
);
825+
}
826+
813827
public get enablePython(): boolean {
814828
return !!ENABLE_PYTHON.getValue<boolean>();
815829
}

extensions/ql-vscode/src/model-editor/extension-pack-name.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,19 @@ export function formatPackName(packName: ExtensionPackName): string {
1515
return `${packName.scope}/${packName.name}`;
1616
}
1717

18-
export function autoNameExtensionPack(
19-
name: string,
20-
language: string,
21-
): ExtensionPackName | undefined {
22-
let packName = `${name}-${language}`;
18+
export function sanitizePackName(userPackName: string): ExtensionPackName {
19+
let packName = userPackName;
20+
21+
packName = packName.trim();
22+
23+
while (packName.startsWith("/")) {
24+
packName = packName.slice(1);
25+
}
26+
27+
while (packName.endsWith("/")) {
28+
packName = packName.slice(0, -1);
29+
}
30+
2331
if (!packName.includes("/")) {
2432
packName = `pack/${packName}`;
2533
}

extensions/ql-vscode/src/model-editor/extension-pack-picker.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import type { NotificationLogger } from "../common/logging";
1515
import { showAndLogErrorMessage } from "../common/logging";
1616
import type { ModelConfig, ModelConfigPackVariables } from "../config";
1717
import type { ExtensionPackName } from "./extension-pack-name";
18-
import { autoNameExtensionPack, formatPackName } from "./extension-pack-name";
18+
import {
19+
validatePackName,
20+
sanitizePackName,
21+
formatPackName,
22+
} from "./extension-pack-name";
1923
import {
2024
ensurePackLocationIsInWorkspaceFolder,
2125
packLocationToAbsolute,
@@ -80,15 +84,20 @@ export async function pickExtensionPack(
8084

8185
await ensurePackLocationIsInWorkspaceFolder(packPath, modelConfig, logger);
8286

83-
// Generate the name of the extension pack
84-
const packName = autoNameExtensionPack(
85-
databaseItem.name,
87+
const userPackName = modelConfig.getPackName(
8688
databaseItem.language,
89+
getModelConfigPackVariables(databaseItem),
8790
);
88-
if (!packName) {
91+
92+
// Generate the name of the extension pack
93+
const packName = sanitizePackName(userPackName);
94+
95+
// Validate that the name isn't too long etc.
96+
const packNameError = validatePackName(formatPackName(packName));
97+
if (packNameError) {
8998
void showAndLogErrorMessage(
9099
logger,
91-
`Could not automatically name extension pack for database ${databaseItem.name}`,
100+
`Invalid model pack name '${formatPackName(packName)}' for database ${databaseItem.name}: ${packNameError}`,
92101
);
93102

94103
return undefined;

extensions/ql-vscode/test/unit-tests/model-editor/extension-pack-name.test.ts

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,81 @@
11
import {
2-
autoNameExtensionPack,
2+
sanitizePackName,
33
formatPackName,
44
parsePackName,
55
validatePackName,
66
} from "../../../src/model-editor/extension-pack-name";
77

8-
describe("autoNameExtensionPack", () => {
8+
describe("sanitizePackName", () => {
99
const testCases: Array<{
1010
name: string;
11-
language: string;
1211
expected: string;
1312
}> = [
1413
{
15-
name: "github/vscode-codeql",
16-
language: "javascript",
14+
name: "github/vscode-codeql-javascript",
1715
expected: "github/vscode-codeql-javascript",
1816
},
1917
{
20-
name: "vscode-codeql",
21-
language: "a",
18+
name: "vscode-codeql-a",
2219
expected: "pack/vscode-codeql-a",
2320
},
2421
{
25-
name: "b",
26-
language: "java",
22+
name: "b-java",
2723
expected: "pack/b-java",
2824
},
2925
{
30-
name: "a/b",
31-
language: "csharp",
26+
name: "a/b-csharp",
3227
expected: "a/b-csharp",
3328
},
3429
{
35-
name: "-/b",
36-
language: "csharp",
30+
name: "-/b-csharp",
3731
expected: "pack/b-csharp",
3832
},
3933
{
40-
name: "a/b/c/d",
41-
language: "csharp",
34+
name: "a/b/c/d-csharp",
4235
expected: "a/b-c-d-csharp",
4336
},
4437
{
45-
name: "JAVA/CodeQL",
46-
language: "csharp",
38+
name: "JAVA/CodeQL-csharp",
4739
expected: "java/codeql-csharp",
4840
},
4941
{
50-
name: "my new pack",
51-
language: "swift",
42+
name: "my new pack-swift",
5243
expected: "pack/my-new-pack-swift",
5344
},
5445
{
55-
name: "gïthub/vscode-codeql",
56-
language: "javascript",
46+
name: "gïthub/vscode-codeql-javascript",
5747
expected: "gthub/vscode-codeql-javascript",
5848
},
5949
{
60-
name: "a/b-",
61-
language: "csharp",
50+
name: "a/b-csharp",
6251
expected: "a/b-csharp",
6352
},
6453
{
65-
name: "-a-/b",
66-
language: "ruby",
54+
name: "-a-/b-ruby",
6755
expected: "a/b-ruby",
6856
},
6957
{
70-
name: "a/b--d--e-d-",
71-
language: "csharp",
58+
name: "a/b--d--e-d-csharp",
7259
expected: "a/b-d-e-d-csharp",
7360
},
61+
{
62+
name: "/github/vscode-codeql",
63+
expected: "github/vscode-codeql",
64+
},
65+
{
66+
name: "github/vscode-codeql/",
67+
expected: "github/vscode-codeql",
68+
},
69+
{
70+
name: "///github/vscode-codeql///",
71+
expected: "github/vscode-codeql",
72+
},
7473
];
7574

7675
test.each(testCases)(
7776
"$name with $language = $expected",
78-
({ name, language, expected }) => {
79-
const result = autoNameExtensionPack(name, language);
77+
({ name, expected }) => {
78+
const result = sanitizePackName(name);
8079
expect(result).not.toBeUndefined();
8180
if (!result) {
8281
return;

0 commit comments

Comments
 (0)