|
|
|
|
@@ -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;
|
|
|
|
|
}
|
|
|
|
|
|