@@ -2,7 +2,6 @@ import { join } from "path";
22import { outputFile , pathExists , readFile } from "fs-extra" ;
33import { dump as dumpYaml , load as loadYaml } from "js-yaml" ;
44import type { CancellationToken } from "vscode" ;
5- import { Uri } from "vscode" ;
65import Ajv from "ajv" ;
76import type { CodeQLCliServer } from "../codeql-cli/cli" ;
87import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders" ;
@@ -14,10 +13,13 @@ import { getErrorMessage } from "../common/helpers-pure";
1413import type { ExtensionPack } from "./shared/extension-pack" ;
1514import type { NotificationLogger } from "../common/logging" ;
1615import { showAndLogErrorMessage } from "../common/logging" ;
17- import type { ModelConfig } from "../config" ;
16+ import type { ModelConfig , ModelConfigPackVariables } from "../config" ;
1817import type { ExtensionPackName } from "./extension-pack-name" ;
1918import { autoNameExtensionPack , formatPackName } from "./extension-pack-name" ;
20- import { autoPickExtensionsDirectory } from "./extensions-workspace-folder" ;
19+ import {
20+ ensurePackLocationIsInWorkspaceFolder ,
21+ packLocationToAbsolute ,
22+ } from "./extensions-workspace-folder" ;
2123
2224import type { ExtensionPackMetadata } from "./extension-pack-metadata" ;
2325import extensionPackMetadataSchemaJson from "./extension-pack-metadata.schema.json" ;
@@ -27,7 +29,7 @@ const extensionPackValidate = ajv.compile(extensionPackMetadataSchemaJson);
2729
2830export async function pickExtensionPack (
2931 cliServer : Pick < CodeQLCliServer , "resolveQlpacks" > ,
30- databaseItem : Pick < DatabaseItem , "name" | "language" > ,
32+ databaseItem : Pick < DatabaseItem , "name" | "language" | "origin" > ,
3133 modelConfig : ModelConfig ,
3234 logger : NotificationLogger ,
3335 progress : ProgressCallback ,
@@ -64,20 +66,20 @@ export async function pickExtensionPack(
6466 maxStep,
6567 } ) ;
6668
67- // Get the `codeQL.model.extensionsDirectory` setting for the language
68- const userExtensionsDirectory = modelConfig . getExtensionsDirectory (
69- databaseItem . language ,
69+ // The default is .github/codeql/extensions/${name}-${language}
70+ const packPath = await packLocationToAbsolute (
71+ modelConfig . getPackLocation (
72+ databaseItem . language ,
73+ getModelConfigPackVariables ( databaseItem ) ,
74+ ) ,
75+ logger ,
7076 ) ;
71-
72- // If the setting is not set, automatically pick a suitable directory
73- const extensionsDirectory = userExtensionsDirectory
74- ? Uri . file ( userExtensionsDirectory )
75- : await autoPickExtensionsDirectory ( logger ) ;
76-
77- if ( ! extensionsDirectory ) {
77+ if ( ! packPath ) {
7878 return undefined ;
7979 }
8080
81+ await ensurePackLocationIsInWorkspaceFolder ( packPath , modelConfig , logger ) ;
82+
8183 // Generate the name of the extension pack
8284 const packName = autoNameExtensionPack (
8385 databaseItem . name ,
@@ -139,14 +141,12 @@ export async function pickExtensionPack(
139141 return undefined ;
140142 }
141143
142- const packPath = join ( extensionsDirectory . fsPath , packName . name ) ;
143-
144144 if ( await pathExists ( packPath ) ) {
145145 void showAndLogErrorMessage (
146146 logger ,
147147 `Directory ${ packPath } already exists for extension pack ${ formatPackName (
148148 packName ,
149- ) } `,
149+ ) } , but wasn't returned by codeql resolve qlpacks --kind extension --no-recursive `,
150150 ) ;
151151
152152 return undefined ;
@@ -155,6 +155,26 @@ export async function pickExtensionPack(
155155 return writeExtensionPack ( packPath , packName , databaseItem . language ) ;
156156}
157157
158+ function getModelConfigPackVariables (
159+ databaseItem : Pick < DatabaseItem , "name" | "language" | "origin" > ,
160+ ) : ModelConfigPackVariables {
161+ const database = databaseItem . name ;
162+ const language = databaseItem . language ;
163+ let name = databaseItem . name ;
164+ let owner = "" ;
165+
166+ if ( databaseItem . origin ?. type === "github" ) {
167+ [ owner , name ] = databaseItem . origin . repository . split ( "/" ) ;
168+ }
169+
170+ return {
171+ database,
172+ language,
173+ name,
174+ owner,
175+ } ;
176+ }
177+
158178async function writeExtensionPack (
159179 packPath : string ,
160180 packName : ExtensionPackName ,
0 commit comments