MRVA: Use QLX to precompile queries

Co-authored-by: Henning Makholm <hmakholm@github.com>
This commit is contained in:
Edoardo Pirovano
2022-10-21 20:45:29 +02:00
committed by Edoardo Pirovano
parent 98284d9b2c
commit e891169ca3
2 changed files with 24 additions and 5 deletions

View File

@@ -944,16 +944,14 @@ export class CodeQLCliServer implements Disposable {
return this.runJsonCodeQlCliCommand(['pack', 'install'], args, 'Installing pack dependencies');
}
async packBundle(dir: string, workspaceFolders: string[], outputPath: string, precompile = true): Promise<void> {
async packBundle(dir: string, workspaceFolders: string[], outputPath: string, moreOptions: string[]): Promise<void> {
const args = [
'-o',
outputPath,
dir,
...moreOptions,
...this.getAdditionalPacksArg(workspaceFolders)
];
if (!precompile && await this.cliConstraints.supportsNoPrecompile()) {
args.push('--no-precompile');
}
return this.runJsonCodeQlCliCommand(['pack', 'bundle'], args, 'Bundling pack');
}
@@ -1288,6 +1286,13 @@ export class CliVersionConstraint {
*/
public static CLI_VERSION_REMOTE_QUERIES = new SemVer('2.6.3');
/**
* CLI version where building QLX packs for remote queries is supported.
* (The options were _accepted_ by a few earlier versions, but only from
* 2.11.3 will it actually use the existing compilation cache correctly).
*/
public static CLI_VERSION_QLX_REMOTE = new SemVer('2.11.3');
/**
* CLI version where the `resolve ml-models` subcommand was introduced.
*/
@@ -1383,6 +1388,10 @@ export class CliVersionConstraint {
return this.isVersionAtLeast(CliVersionConstraint.CLI_VERSION_REMOTE_QUERIES);
}
async supportsQlxRemote() {
return this.isVersionAtLeast(CliVersionConstraint.CLI_VERSION_QLX_REMOTE);
}
async supportsResolveMlModels() {
return this.isVersionAtLeast(CliVersionConstraint.CLI_VERSION_WITH_RESOLVE_ML_MODELS);
}

View File

@@ -130,11 +130,21 @@ async function generateQueryPack(cliServer: cli.CodeQLCliServer, queryFile: stri
// Clear the cliServer cache so that the previous qlpack text is purged from the CLI.
await cliServer.clearCache();
let precompilationOpts: string[] = [];
if (await cliServer.cliConstraints.supportsQlxRemote()) {
const ccache = path.join(originalPackRoot, '.cache');
precompilationOpts = ['--qlx',
'--no-default-compilation-cache',
`--compilation-cache=${ccache}`];
} else if (await cliServer.cliConstraints.supportsNoPrecompile()) {
precompilationOpts = ['--no-precompile'];
}
const bundlePath = await getPackedBundlePath(queryPackDir);
void logger.log(`Compiling and bundling query pack from ${queryPackDir} to ${bundlePath}. (This may take a while.)`);
await cliServer.packInstall(queryPackDir);
const workspaceFolders = getOnDiskWorkspaceFolders();
await cliServer.packBundle(queryPackDir, workspaceFolders, bundlePath, false);
await cliServer.packBundle(queryPackDir, workspaceFolders, bundlePath, precompilationOpts);
const base64Pack = (await fs.readFile(bundlePath)).toString('base64');
return {
base64Pack,