From 3c8d00aea0cc4dafc9d4d6f3e12d0f5b165bd4a9 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 17 Oct 2025 11:46:35 +0100 Subject: [PATCH] Initialise analysis kinds before `starting` status report --- lib/init-action.js | 77 +++++++++++++++++++++++----------------- src/config-utils.test.ts | 6 ++-- src/config-utils.ts | 18 ++-------- src/init-action.ts | 10 ++++-- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/lib/init-action.js b/lib/init-action.js index 13c46ce34..90b03bef6 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -86062,6 +86062,46 @@ function isAnalyzingPullRequest() { return getPullRequestBranches() !== void 0; } +// src/analyses.ts +var AnalysisKind = /* @__PURE__ */ ((AnalysisKind2) => { + AnalysisKind2["CodeScanning"] = "code-scanning"; + AnalysisKind2["CodeQuality"] = "code-quality"; + return AnalysisKind2; +})(AnalysisKind || {}); +var supportedAnalysisKinds = new Set(Object.values(AnalysisKind)); +async function parseAnalysisKinds(input) { + const components = input.split(","); + if (components.length < 1) { + throw new ConfigurationError( + "At least one analysis kind must be configured." + ); + } + for (const component of components) { + if (!supportedAnalysisKinds.has(component)) { + throw new ConfigurationError(`Unknown analysis kind: ${component}`); + } + } + return Array.from( + new Set(components.map((component) => component)) + ); +} +async function initAnalysisKinds(logger) { + const analysisKinds = await parseAnalysisKinds( + getRequiredInput("analysis-kinds") + ); + const qualityQueriesInput = getOptionalInput("quality-queries"); + if (qualityQueriesInput !== void 0) { + logger.warning( + "The `quality-queries` input is deprecated and will be removed in a future version of the CodeQL Action. Use the `analysis-kinds` input to configure different analysis kinds instead." + ); + } + if (!analysisKinds.includes("code-quality" /* CodeQuality */) && qualityQueriesInput !== void 0) { + analysisKinds.push("code-quality" /* CodeQuality */); + } + return analysisKinds; +} +var codeQualityQueries = ["code-quality"]; + // src/api-client.ts var core5 = __toESM(require_core()); var githubUtils = __toESM(require_utils4()); @@ -86254,31 +86294,6 @@ var fs9 = __toESM(require("fs")); var path11 = __toESM(require("path")); var import_perf_hooks = require("perf_hooks"); -// src/analyses.ts -var AnalysisKind = /* @__PURE__ */ ((AnalysisKind2) => { - AnalysisKind2["CodeScanning"] = "code-scanning"; - AnalysisKind2["CodeQuality"] = "code-quality"; - return AnalysisKind2; -})(AnalysisKind || {}); -var supportedAnalysisKinds = new Set(Object.values(AnalysisKind)); -async function parseAnalysisKinds(input) { - const components = input.split(","); - if (components.length < 1) { - throw new ConfigurationError( - "At least one analysis kind must be configured." - ); - } - for (const component of components) { - if (!supportedAnalysisKinds.has(component)) { - throw new ConfigurationError(`Unknown analysis kind: ${component}`); - } - } - return Array.from( - new Set(components.map((component) => component)) - ); -} -var codeQualityQueries = ["code-quality"]; - // src/config/db-config.ts var path7 = __toESM(require("path")); var semver2 = __toESM(require_semver2()); @@ -87691,10 +87706,8 @@ async function getRawLanguages(languagesInput, repository, sourceRoot, logger) { }; } async function initActionState({ - analysisKindsInput, languagesInput, queriesInput, - qualityQueriesInput, packsInput, buildModeInput, dbLocation, @@ -87710,12 +87723,9 @@ async function initActionState({ githubVersion, features, repositoryProperties, + analysisKinds, logger }, userConfig) { - const analysisKinds = await parseAnalysisKinds(analysisKindsInput); - if (!analysisKinds.includes("code-quality" /* CodeQuality */) && qualityQueriesInput !== void 0) { - analysisKinds.push("code-quality" /* CodeQuality */); - } const languages = await getLanguages( codeql, languagesInput, @@ -90786,7 +90796,8 @@ async function run() { getOptionalInput("source-root") || "" ); try { - await sendStartingStatusReport(startedAt, config, logger); + const analysisKinds = await initAnalysisKinds(logger); + await sendStartingStatusReport(startedAt, { analysisKinds }, logger); const codeQLDefaultVersionInfo = await features.getDefaultCliVersion( gitHubVersion.type ); @@ -90840,7 +90851,7 @@ async function run() { ); } config = await initConfig2({ - analysisKindsInput: getRequiredInput("analysis-kinds"), + analysisKinds, languagesInput: getOptionalInput("languages"), queriesInput: getOptionalInput("queries"), qualityQueriesInput, diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts index 566a719ca..2dab4ee60 100644 --- a/src/config-utils.test.ts +++ b/src/config-utils.test.ts @@ -49,7 +49,7 @@ function createTestInitConfigInputs( return Object.assign( {}, { - analysisKindsInput: "code-scanning", + analysisKinds: [AnalysisKind.CodeScanning], languagesInput: undefined, queriesInput: undefined, qualityQueriesInput: undefined, @@ -189,7 +189,7 @@ test("load code quality config", async (t) => { const config = await configUtils.initConfig( createTestInitConfigInputs({ - analysisKindsInput: "code-quality", + analysisKinds: [AnalysisKind.CodeQuality], languagesInput: languages, repository: { owner: "github", repo: "example" }, tempDir, @@ -273,7 +273,7 @@ test("initActionState doesn't throw if there are queries configured in the repos await t.notThrowsAsync(async () => { const config = await configUtils.initConfig( createTestInitConfigInputs({ - analysisKindsInput: "code-quality", + analysisKinds: [AnalysisKind.CodeQuality], languagesInput: languages, repository: { owner: "github", repo: "example" }, tempDir, diff --git a/src/config-utils.ts b/src/config-utils.ts index e6c87bf5a..7c4dc7257 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -11,7 +11,6 @@ import { CodeQuality, codeQualityQueries, CodeScanning, - parseAnalysisKinds, } from "./analyses"; import * as api from "./api-client"; import { CachingKind, getCachingKind } from "./caching-utils"; @@ -373,7 +372,6 @@ export async function getRawLanguages( /** Inputs required to initialize a configuration. */ export interface InitConfigInputs { - analysisKindsInput: string; languagesInput: string | undefined; queriesInput: string | undefined; qualityQueriesInput: string | undefined; @@ -396,6 +394,7 @@ export interface InitConfigInputs { apiDetails: api.GitHubApiCombinedDetails; features: FeatureEnablement; repositoryProperties: RepositoryProperties; + analysisKinds: AnalysisKind[]; logger: Logger; } @@ -405,10 +404,8 @@ export interface InitConfigInputs { */ export async function initActionState( { - analysisKindsInput, languagesInput, queriesInput, - qualityQueriesInput, packsInput, buildModeInput, dbLocation, @@ -424,22 +421,11 @@ export async function initActionState( githubVersion, features, repositoryProperties, + analysisKinds, logger, }: InitConfigInputs, userConfig: UserConfig, ): Promise { - const analysisKinds = await parseAnalysisKinds(analysisKindsInput); - - // For backwards compatibility, add Code Quality to the enabled analysis kinds - // if an input to `quality-queries` was specified. We should remove this once - // `quality-queries` is no longer used. - if ( - !analysisKinds.includes(AnalysisKind.CodeQuality) && - qualityQueriesInput !== undefined - ) { - analysisKinds.push(AnalysisKind.CodeQuality); - } - const languages = await getLanguages( codeql, languagesInput, diff --git a/src/init-action.ts b/src/init-action.ts index beef425e9..dbad71bfd 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -15,6 +15,7 @@ import { getTemporaryDirectory, persistInputs, } from "./actions-util"; +import { initAnalysisKinds } from "./analyses"; import { getGitHubVersion } from "./api-client"; import { getDependencyCachingEnabled, @@ -105,7 +106,7 @@ interface InitToolsDownloadFields { */ async function sendStartingStatusReport( startedAt: Date, - config: configUtils.Config | undefined, + config: Partial | undefined, logger: Logger, ) { const statusReportBase = await createStatusReportBase( @@ -252,7 +253,10 @@ async function run() { ); try { - await sendStartingStatusReport(startedAt, config, logger); + // This may throw a `ConfigurationError` before we have sent the `starting` status report. + const analysisKinds = await initAnalysisKinds(logger); + // Send a status report indicating that an analysis is starting. + await sendStartingStatusReport(startedAt, { analysisKinds }, logger); const codeQLDefaultVersionInfo = await features.getDefaultCliVersion( gitHubVersion.type, ); @@ -319,7 +323,7 @@ async function run() { } config = await initConfig({ - analysisKindsInput: getRequiredInput("analysis-kinds"), + analysisKinds, languagesInput: getOptionalInput("languages"), queriesInput: getOptionalInput("queries"), qualityQueriesInput,