Use suite file instead of manually filtering queries

This commit is contained in:
Koen Vlaswinkel
2024-03-08 16:12:55 +01:00
parent dbd5078424
commit 35267bb3fd
4 changed files with 33 additions and 30 deletions

View File

@@ -111,6 +111,9 @@
"description": {
"type": "string"
},
"import": {
"type": "string"
},
"from": {
"type": "string"
}

View File

@@ -111,6 +111,9 @@
"description": {
"type": "string"
},
"import": {
"type": "string"
},
"from": {
"type": "string"
}

View File

@@ -8,5 +8,6 @@ export interface SuiteInstruction {
include?: Record<string, string[]>;
exclude?: Record<string, string[]>;
description?: string;
import?: string;
from?: string;
}

View File

@@ -1,10 +1,13 @@
import { join } from "path";
import { outputFile } from "fs-extra";
import { dump } from "js-yaml";
import { file } from "tmp-promise";
import type { BaseLogger } from "../common/logging";
import type { QueryLanguage } from "../common/query-language";
import type { CodeQLCliServer } from "../codeql-cli/cli";
import type { QlPackDetails } from "./ql-pack-details";
import { getQlPackFilePath } from "../common/ql";
import { isSarifResultsQueryKind } from "../common/query-metadata";
import type { SuiteInstruction } from "../packaging/suite-instruction";
export async function resolveCodeScanningQueryPack(
logger: BaseLogger,
@@ -25,20 +28,30 @@ export async function resolveCodeScanningQueryPack(
// Resolve queries
void logger.log(`Resolving queries for pack: ${packName}`);
const suitePath = join(
packDir,
"codeql-suites",
`${language}-code-scanning.qls`,
);
const suiteFile = await file({
postfix: ".qls",
});
const suitePath = suiteFile.path;
const suiteYaml: SuiteInstruction[] = [
{
import: `codeql-suites/${language}-code-scanning.qls`,
from: `${downloadedPack.name}@${downloadedPack.version}`,
},
// Exclude any non-problem queries
{
exclude: {
kind: ["diagnostic", "metric"],
},
},
];
await outputFile(suitePath, dump(suiteYaml), "utf8");
const resolvedQueries = await cliServer.resolveQueries(suitePath);
const problemQueries = await filterToOnlyProblemQueries(
logger,
cliServer,
resolvedQueries,
);
await suiteFile.cleanup();
if (problemQueries.length === 0) {
if (resolvedQueries.length === 0) {
throw Error(
`No problem queries found in published query pack: ${packName}.`,
);
@@ -48,7 +61,7 @@ export async function resolveCodeScanningQueryPack(
const qlPackFilePath = await getQlPackFilePath(packDir);
const qlPackDetails: QlPackDetails = {
queryFiles: problemQueries,
queryFiles: resolvedQueries,
qlPackRootPath: packDir,
qlPackFilePath,
language,
@@ -56,20 +69,3 @@ export async function resolveCodeScanningQueryPack(
return qlPackDetails;
}
async function filterToOnlyProblemQueries(
logger: BaseLogger,
cliServer: CodeQLCliServer,
queries: string[],
): Promise<string[]> {
const problemQueries: string[] = [];
for (const query of queries) {
const queryMetadata = await cliServer.resolveMetadata(query);
if (isSarifResultsQueryKind(queryMetadata.kind)) {
problemQueries.push(query);
} else {
void logger.log(`Skipping non-problem query ${query}`);
}
}
return problemQueries;
}