@@ -119,6 +119,9 @@ async function generateQueryPack(cliServer: cli.CodeQLCliServer, queryFile: stri
119
119
} )
120
120
} ) ;
121
121
122
+ // ensure the qlpack.yml has a valid name
123
+ await ensureQueryPackName ( queryPackDir ) ;
124
+
122
125
void logger . log ( `Copied ${ copiedCount } files to ${ queryPackDir } ` ) ;
123
126
124
127
language = await findLanguage ( cliServer , Uri . file ( targetQueryFileName ) ) ;
@@ -161,6 +164,25 @@ async function generateQueryPack(cliServer: cli.CodeQLCliServer, queryFile: stri
161
164
} ;
162
165
}
163
166
167
+ /**
168
+ * Ensure that the qlpack.yml has a valid name. For local purposes,
169
+ * Anonymous packs and names that are not prefixed by a scope (ie `<foo>/`)
170
+ * are sufficient. But in order to create a pack, the name must be prefixed.
171
+ *
172
+ * @param queryPackDir the directory containing the query pack.
173
+ */
174
+ async function ensureQueryPackName ( queryPackDir : string ) {
175
+ const pack = yaml . safeLoad ( await fs . readFile ( path . join ( queryPackDir , 'qlpack.yml' ) , 'utf8' ) ) as { name : string ; } ;
176
+ if ( ! pack . name || ! pack . name . includes ( '/' ) ) {
177
+ if ( ! pack . name ) {
178
+ pack . name = 'codeql-remote/query' ;
179
+ } else if ( ! pack . name . includes ( '/' ) ) {
180
+ pack . name = `codeql-remote/${ pack . name } ` ;
181
+ }
182
+ await fs . writeFile ( path . join ( queryPackDir , 'qlpack.yml' ) , yaml . safeDump ( pack ) ) ;
183
+ }
184
+ }
185
+
164
186
async function createRemoteQueriesTempDirectory ( ) {
165
187
const remoteQueryDir = await tmp . dir ( { dir : tmpDir . name , unsafeCleanup : true } ) ;
166
188
const queryPackDir = path . join ( remoteQueryDir . path , 'query-pack' ) ;
0 commit comments