Rename initAnalysisKinds to getAnalysisKinds and cache results

This commit is contained in:
Michael B. Gale
2025-10-17 13:33:55 +01:00
parent 9bd9b03572
commit 57c7b0a884
4 changed files with 34 additions and 20 deletions

View File

@@ -4,7 +4,7 @@ import * as sinon from "sinon";
import * as actionsUtil from "./actions-util";
import {
AnalysisKind,
initAnalysisKinds,
getAnalysisKinds,
parseAnalysisKinds,
supportedAnalysisKinds,
} from "./analyses";
@@ -42,28 +42,28 @@ test("Parsing analysis kinds requires at least one analysis kind", async (t) =>
});
});
test("initAnalysisKinds - returns expected analysis kinds for `analysis-kinds` input", async (t) => {
test("getAnalysisKinds - returns expected analysis kinds for `analysis-kinds` input", async (t) => {
const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput");
requiredInputStub
.withArgs("analysis-kinds")
.returns("code-scanning,code-quality");
const result = await initAnalysisKinds(getRunnerLogger(true));
const result = await getAnalysisKinds(getRunnerLogger(true), true);
t.assert(result.includes(AnalysisKind.CodeScanning));
t.assert(result.includes(AnalysisKind.CodeQuality));
});
test("initAnalysisKinds - includes `code-quality` when deprecated `quality-queries` input is used", async (t) => {
test("getAnalysisKinds - includes `code-quality` when deprecated `quality-queries` input is used", async (t) => {
const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput");
requiredInputStub.withArgs("analysis-kinds").returns("code-scanning");
const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput");
optionalInputStub.withArgs("quality-queries").returns("code-quality");
const result = await initAnalysisKinds(getRunnerLogger(true));
const result = await getAnalysisKinds(getRunnerLogger(true), true);
t.assert(result.includes(AnalysisKind.CodeScanning));
t.assert(result.includes(AnalysisKind.CodeQuality));
});
test("initAnalysisKinds - throws if `analysis-kinds` input is invalid", async (t) => {
test("getAnalysisKinds - throws if `analysis-kinds` input is invalid", async (t) => {
const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput");
requiredInputStub.withArgs("analysis-kinds").returns("no-such-thing");
await t.throwsAsync(initAnalysisKinds(getRunnerLogger(true)));
await t.throwsAsync(getAnalysisKinds(getRunnerLogger(true), true));
});

View File

@@ -45,19 +45,29 @@ export async function parseAnalysisKinds(
);
}
// Used to avoid re-parsing the input after we have done it once.
let cachedAnalysisKinds: AnalysisKind[] | undefined;
/**
* Initialises the analysis kinds for the analysis based on the `analysis-kinds` input.
* This function will also use the deprecated `quality-queries` input as an indicator to enable `code-quality`.
* If the `analysis-kinds` input cannot be parsed, a `ConfigurationError` is thrown.
*
* @param logger The logger to use.
* @param skipCache For testing, whether to ignore the cached values (default: false).
*
* @returns The array of enabled analysis kinds.
* @throws A `ConfigurationError` if the `analysis-kinds` input cannot be parsed.
*/
export async function initAnalysisKinds(
export async function getAnalysisKinds(
logger: Logger,
skipCache: boolean = false,
): Promise<AnalysisKind[]> {
const analysisKinds = await parseAnalysisKinds(
if (!skipCache && cachedAnalysisKinds !== undefined) {
return cachedAnalysisKinds;
}
cachedAnalysisKinds = await parseAnalysisKinds(
getRequiredInput("analysis-kinds"),
);
@@ -75,13 +85,13 @@ export async function initAnalysisKinds(
// if an input to `quality-queries` was specified. We should remove this once
// `quality-queries` is no longer used.
if (
!analysisKinds.includes(AnalysisKind.CodeQuality) &&
!cachedAnalysisKinds.includes(AnalysisKind.CodeQuality) &&
qualityQueriesInput !== undefined
) {
analysisKinds.push(AnalysisKind.CodeQuality);
cachedAnalysisKinds.push(AnalysisKind.CodeQuality);
}
return analysisKinds;
return cachedAnalysisKinds;
}
/** The queries to use for Code Quality analyses. */

View File

@@ -15,7 +15,7 @@ import {
getTemporaryDirectory,
persistInputs,
} from "./actions-util";
import { initAnalysisKinds } from "./analyses";
import { getAnalysisKinds } from "./analyses";
import { getGitHubVersion } from "./api-client";
import {
getDependencyCachingEnabled,
@@ -254,7 +254,7 @@ async function run() {
try {
// This may throw a `ConfigurationError` before we have sent the `starting` status report.
const analysisKinds = await initAnalysisKinds(logger);
const analysisKinds = await getAnalysisKinds(logger);
// Send a status report indicating that an analysis is starting.
await sendStartingStatusReport(startedAt, { analysisKinds }, logger);
const codeQLDefaultVersionInfo = await features.getDefaultCliVersion(