Skip to content

Commit c32065e

Browse files
authored
Merge pull request #3457 from github/koesie10/query-suite-code-scanning
Use suite file instead of manually filtering queries
2 parents 66de756 + b71a536 commit c32065e

File tree

5 files changed

+46
-32
lines changed

5 files changed

+46
-32
lines changed

extensions/ql-vscode/src/common/query-metadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const SARIF_RESULTS_QUERY_KINDS = [
1+
export const SARIF_RESULTS_QUERY_KINDS = [
22
"problem",
33
"alert",
44
"path-problem",

extensions/ql-vscode/src/model-editor/extension-pack-metadata.schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@
111111
"description": {
112112
"type": "string"
113113
},
114+
"import": {
115+
"type": "string"
116+
},
114117
"from": {
115118
"type": "string"
116119
}

extensions/ql-vscode/src/packaging/qlpack-file.schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@
111111
"description": {
112112
"type": "string"
113113
},
114+
"import": {
115+
"type": "string"
116+
},
114117
"from": {
115118
"type": "string"
116119
}

extensions/ql-vscode/src/packaging/suite-instruction.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ export interface SuiteInstruction {
88
include?: Record<string, string[]>;
99
exclude?: Record<string, string[]>;
1010
description?: string;
11+
import?: string;
1112
from?: string;
1213
}

extensions/ql-vscode/src/variant-analysis/code-scanning-pack.ts

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { join } from "path";
2+
import { outputFile } from "fs-extra";
3+
import { dump } from "js-yaml";
4+
import { file } from "tmp-promise";
25
import type { BaseLogger } from "../common/logging";
36
import type { QueryLanguage } from "../common/query-language";
47
import type { CodeQLCliServer } from "../codeql-cli/cli";
58
import type { QlPackDetails } from "./ql-pack-details";
69
import { getQlPackFilePath } from "../common/ql";
7-
import { isSarifResultsQueryKind } from "../common/query-metadata";
10+
import type { SuiteInstruction } from "../packaging/suite-instruction";
11+
import { SARIF_RESULTS_QUERY_KINDS } from "../common/query-metadata";
812

913
export async function resolveCodeScanningQueryPack(
1014
logger: BaseLogger,
@@ -25,20 +29,40 @@ export async function resolveCodeScanningQueryPack(
2529

2630
// Resolve queries
2731
void logger.log(`Resolving queries for pack: ${packName}`);
28-
const suitePath = join(
29-
packDir,
30-
"codeql-suites",
31-
`${language}-code-scanning.qls`,
32-
);
33-
const resolvedQueries = await cliServer.resolveQueries(suitePath);
3432

35-
const problemQueries = await filterToOnlyProblemQueries(
36-
logger,
37-
cliServer,
38-
resolvedQueries,
39-
);
33+
const suiteYaml: SuiteInstruction[] = [
34+
{
35+
import: `codeql-suites/${language}-code-scanning.qls`,
36+
from: `${downloadedPack.name}@${downloadedPack.version}`,
37+
},
38+
{
39+
// This is necessary to ensure that the next import filter
40+
// is applied correctly
41+
exclude: {},
42+
},
43+
{
44+
// Only include problem queries
45+
include: {
46+
kind: SARIF_RESULTS_QUERY_KINDS,
47+
},
48+
},
49+
];
50+
51+
let resolvedQueries: string[];
52+
const suiteFile = await file({
53+
postfix: ".qls",
54+
});
55+
const suitePath = suiteFile.path;
56+
57+
try {
58+
await outputFile(suitePath, dump(suiteYaml), "utf8");
59+
60+
resolvedQueries = await cliServer.resolveQueries(suitePath);
61+
} finally {
62+
await suiteFile.cleanup();
63+
}
4064

41-
if (problemQueries.length === 0) {
65+
if (resolvedQueries.length === 0) {
4266
throw Error(
4367
`No problem queries found in published query pack: ${packName}.`,
4468
);
@@ -48,28 +72,11 @@ export async function resolveCodeScanningQueryPack(
4872
const qlPackFilePath = await getQlPackFilePath(packDir);
4973

5074
const qlPackDetails: QlPackDetails = {
51-
queryFiles: problemQueries,
75+
queryFiles: resolvedQueries,
5276
qlPackRootPath: packDir,
5377
qlPackFilePath,
5478
language,
5579
};
5680

5781
return qlPackDetails;
5882
}
59-
60-
async function filterToOnlyProblemQueries(
61-
logger: BaseLogger,
62-
cliServer: CodeQLCliServer,
63-
queries: string[],
64-
): Promise<string[]> {
65-
const problemQueries: string[] = [];
66-
for (const query of queries) {
67-
const queryMetadata = await cliServer.resolveMetadata(query);
68-
if (isSarifResultsQueryKind(queryMetadata.kind)) {
69-
problemQueries.push(query);
70-
} else {
71-
void logger.log(`Skipping non-problem query ${query}`);
72-
}
73-
}
74-
return problemQueries;
75-
}

0 commit comments

Comments
 (0)