From 5d95d46948301dc60ba0e643448bb83a2120e886 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 28 Aug 2025 17:15:26 +0100 Subject: [PATCH] Handle different permutations of analysis kinds in `analyze` action --- lib/analyze-action.js | 31 ++++++++++++++++--------- src/analyze.ts | 53 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 22 deletions(-) diff --git a/lib/analyze-action.js b/lib/analyze-action.js index d15c8977c..c3d0f7ab3 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -96180,7 +96180,7 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag, const sarifRunPropertyFlag = incrementalMode.length > 0 ? `--sarif-run-property=incrementalMode=${incrementalMode.join(",")}` : void 0; for (const language of config.languages) { try { - const sarifFile = path12.join(sarifFolder, `${language}.sarif`); + const sarifFile = isCodeScanningEnabled(config) ? path12.join(sarifFolder, `${language}.sarif`) : path12.join(sarifFolder, `${language}.quality.sarif`); const queries = []; if (isCodeQualityEnabled(config) && isCodeScanningEnabled(config)) { queries.push(getGeneratedSuitePath(config, language)); @@ -96194,17 +96194,24 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag, await codeql.databaseRunQueries(databasePath, queryFlags, queries); logger.debug(`Finished running queries for ${language}.`); statusReport[`analyze_builtin_queries_${language}_duration_ms`] = (/* @__PURE__ */ new Date()).getTime() - startTimeRunQueries; - logger.startGroup(`Interpreting results for ${language}`); const startTimeInterpretResults = /* @__PURE__ */ new Date(); - const analysisSummary = await runInterpretResults( - language, - void 0, - sarifFile, - config.debugMode, - automationDetailsId - ); + let analysisSummary; + if (isCodeScanningEnabled(config) || isCodeQualityEnabled(config)) { + logger.startGroup(`Interpreting results for ${language}`); + let category = automationDetailsId; + if (isCodeQualityEnabled(config)) { + category = fixCodeQualityCategory(logger, automationDetailsId); + } + analysisSummary = await runInterpretResults( + language, + void 0, + sarifFile, + config.debugMode, + category + ); + } let qualityAnalysisSummary; - if (isCodeQualityEnabled(config)) { + if (isCodeQualityEnabled(config) && isCodeScanningEnabled(config)) { logger.info(`Interpreting quality results for ${language}`); const qualityCategory = fixCodeQualityCategory( logger, @@ -96227,7 +96234,9 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag, const endTimeInterpretResults = /* @__PURE__ */ new Date(); statusReport[`interpret_results_${language}_duration_ms`] = endTimeInterpretResults.getTime() - startTimeInterpretResults.getTime(); logger.endGroup(); - logger.info(analysisSummary); + if (analysisSummary) { + logger.info(analysisSummary); + } if (qualityAnalysisSummary) { logger.info(qualityAnalysisSummary); } diff --git a/src/analyze.ts b/src/analyze.ts index b597281f9..ed08c3f95 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -659,7 +659,11 @@ export async function runQueries( for (const language of config.languages) { try { - const sarifFile = path.join(sarifFolder, `${language}.sarif`); + // If Code Scanning is enabled, then the main SARIF file is always the Code Scanning one. + // Otherwise, only Code Quality is enabled, and the main SARIF file is the Code Quality one. + const sarifFile = configUtils.isCodeScanningEnabled(config) + ? path.join(sarifFolder, `${language}.sarif`) + : path.join(sarifFolder, `${language}.quality.sarif`); // This should be empty to run only the query suite that was generated when // the database was initialised. @@ -695,18 +699,43 @@ export async function runQueries( statusReport[`analyze_builtin_queries_${language}_duration_ms`] = new Date().getTime() - startTimeRunQueries; - logger.startGroup(`Interpreting results for ${language}`); const startTimeInterpretResults = new Date(); - const analysisSummary = await runInterpretResults( - language, - undefined, - sarifFile, - config.debugMode, - automationDetailsId, - ); + // If only one analysis kind is enabled, then the database is initialised for the + // respective set of queries. Therefore, running `interpret-results` produces the + // SARIF file we want for the one enabled analysis kind. + let analysisSummary: string | undefined; + if ( + configUtils.isCodeScanningEnabled(config) || + configUtils.isCodeQualityEnabled(config) + ) { + logger.startGroup(`Interpreting results for ${language}`); + + // If this is a Code Quality analysis, correct the category to one + // accepted by the Code Quality backend. + let category = automationDetailsId; + if (configUtils.isCodeQualityEnabled(config)) { + category = fixCodeQualityCategory(logger, automationDetailsId); + } + + analysisSummary = await runInterpretResults( + language, + undefined, + sarifFile, + config.debugMode, + category, + ); + } + + // This case is only needed if Code Quality is enabled in addition to Code Scanning. + // In this case, we will have run queries for both analysis kinds. The previous call to + // `interpret-results` will have produced a SARIF file for Code Scanning and we now + // need to produce an additional SARIF file for Code Quality. let qualityAnalysisSummary: string | undefined; - if (configUtils.isCodeQualityEnabled(config)) { + if ( + configUtils.isCodeQualityEnabled(config) && + configUtils.isCodeScanningEnabled(config) + ) { logger.info(`Interpreting quality results for ${language}`); const qualityCategory = fixCodeQualityCategory( logger, @@ -730,8 +759,10 @@ export async function runQueries( statusReport[`interpret_results_${language}_duration_ms`] = endTimeInterpretResults.getTime() - startTimeInterpretResults.getTime(); logger.endGroup(); - logger.info(analysisSummary); + if (analysisSummary) { + logger.info(analysisSummary); + } if (qualityAnalysisSummary) { logger.info(qualityAnalysisSummary); }