Skip to content

Commit 70205d3

Browse files
authored
Merge pull request #3211 from github/mbg/init/starting-partial-config
Make analysis kinds available for `starting` status report
2 parents 1bd53ba + 697c209 commit 70205d3

File tree

6 files changed

+203
-93
lines changed

6 files changed

+203
-93
lines changed

lib/init-action.js

Lines changed: 68 additions & 49 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/analyses.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import test from "ava";
2+
import * as sinon from "sinon";
23

4+
import * as actionsUtil from "./actions-util";
35
import {
46
AnalysisKind,
7+
getAnalysisKinds,
58
parseAnalysisKinds,
69
supportedAnalysisKinds,
710
} from "./analyses";
11+
import { getRunnerLogger } from "./logging";
12+
import { setupTests } from "./testing-utils";
813
import { ConfigurationError } from "./util";
914

15+
setupTests(test);
16+
1017
test("All known analysis kinds can be parsed successfully", async (t) => {
1118
for (const analysisKind of supportedAnalysisKinds) {
1219
t.deepEqual(await parseAnalysisKinds(analysisKind), [analysisKind]);
@@ -34,3 +41,29 @@ test("Parsing analysis kinds requires at least one analysis kind", async (t) =>
3441
instanceOf: ConfigurationError,
3542
});
3643
});
44+
45+
test("getAnalysisKinds - returns expected analysis kinds for `analysis-kinds` input", async (t) => {
46+
const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput");
47+
requiredInputStub
48+
.withArgs("analysis-kinds")
49+
.returns("code-scanning,code-quality");
50+
const result = await getAnalysisKinds(getRunnerLogger(true), true);
51+
t.assert(result.includes(AnalysisKind.CodeScanning));
52+
t.assert(result.includes(AnalysisKind.CodeQuality));
53+
});
54+
55+
test("getAnalysisKinds - includes `code-quality` when deprecated `quality-queries` input is used", async (t) => {
56+
const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput");
57+
requiredInputStub.withArgs("analysis-kinds").returns("code-scanning");
58+
const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput");
59+
optionalInputStub.withArgs("quality-queries").returns("code-quality");
60+
const result = await getAnalysisKinds(getRunnerLogger(true), true);
61+
t.assert(result.includes(AnalysisKind.CodeScanning));
62+
t.assert(result.includes(AnalysisKind.CodeQuality));
63+
});
64+
65+
test("getAnalysisKinds - throws if `analysis-kinds` input is invalid", async (t) => {
66+
const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput");
67+
requiredInputStub.withArgs("analysis-kinds").returns("no-such-thing");
68+
await t.throwsAsync(getAnalysisKinds(getRunnerLogger(true), true));
69+
});

src/analyses.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { fixCodeQualityCategory } from "./actions-util";
1+
import {
2+
fixCodeQualityCategory,
3+
getOptionalInput,
4+
getRequiredInput,
5+
} from "./actions-util";
26
import { Logger } from "./logging";
37
import { ConfigurationError } from "./util";
48

@@ -41,6 +45,55 @@ export async function parseAnalysisKinds(
4145
);
4246
}
4347

48+
// Used to avoid re-parsing the input after we have done it once.
49+
let cachedAnalysisKinds: AnalysisKind[] | undefined;
50+
51+
/**
52+
* Initialises the analysis kinds for the analysis based on the `analysis-kinds` input.
53+
* This function will also use the deprecated `quality-queries` input as an indicator to enable `code-quality`.
54+
* If the `analysis-kinds` input cannot be parsed, a `ConfigurationError` is thrown.
55+
*
56+
* @param logger The logger to use.
57+
* @param skipCache For testing, whether to ignore the cached values (default: false).
58+
*
59+
* @returns The array of enabled analysis kinds.
60+
* @throws A `ConfigurationError` if the `analysis-kinds` input cannot be parsed.
61+
*/
62+
export async function getAnalysisKinds(
63+
logger: Logger,
64+
skipCache: boolean = false,
65+
): Promise<AnalysisKind[]> {
66+
if (!skipCache && cachedAnalysisKinds !== undefined) {
67+
return cachedAnalysisKinds;
68+
}
69+
70+
cachedAnalysisKinds = await parseAnalysisKinds(
71+
getRequiredInput("analysis-kinds"),
72+
);
73+
74+
// Warn that `quality-queries` is deprecated if there is an argument for it.
75+
const qualityQueriesInput = getOptionalInput("quality-queries");
76+
77+
if (qualityQueriesInput !== undefined) {
78+
logger.warning(
79+
"The `quality-queries` input is deprecated and will be removed in a future version of the CodeQL Action. " +
80+
"Use the `analysis-kinds` input to configure different analysis kinds instead.",
81+
);
82+
}
83+
84+
// For backwards compatibility, add Code Quality to the enabled analysis kinds
85+
// if an input to `quality-queries` was specified. We should remove this once
86+
// `quality-queries` is no longer used.
87+
if (
88+
!cachedAnalysisKinds.includes(AnalysisKind.CodeQuality) &&
89+
qualityQueriesInput !== undefined
90+
) {
91+
cachedAnalysisKinds.push(AnalysisKind.CodeQuality);
92+
}
93+
94+
return cachedAnalysisKinds;
95+
}
96+
4497
/** The queries to use for Code Quality analyses. */
4598
export const codeQualityQueries: string[] = ["code-quality"];
4699

src/config-utils.test.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ function createTestInitConfigInputs(
4949
return Object.assign(
5050
{},
5151
{
52-
analysisKindsInput: "code-scanning",
52+
analysisKinds: [AnalysisKind.CodeScanning],
5353
languagesInput: undefined,
5454
queriesInput: undefined,
55-
qualityQueriesInput: undefined,
5655
packsInput: undefined,
5756
configFile: undefined,
5857
dbLocation: undefined,
@@ -189,7 +188,7 @@ test("load code quality config", async (t) => {
189188

190189
const config = await configUtils.initConfig(
191190
createTestInitConfigInputs({
192-
analysisKindsInput: "code-quality",
191+
analysisKinds: [AnalysisKind.CodeQuality],
193192
languagesInput: languages,
194193
repository: { owner: "github", repo: "example" },
195194
tempDir,
@@ -273,7 +272,7 @@ test("initActionState doesn't throw if there are queries configured in the repos
273272
await t.notThrowsAsync(async () => {
274273
const config = await configUtils.initConfig(
275274
createTestInitConfigInputs({
276-
analysisKindsInput: "code-quality",
275+
analysisKinds: [AnalysisKind.CodeQuality],
277276
languagesInput: languages,
278277
repository: { owner: "github", repo: "example" },
279278
tempDir,

src/config-utils.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
CodeQuality,
1212
codeQualityQueries,
1313
CodeScanning,
14-
parseAnalysisKinds,
1514
} from "./analyses";
1615
import * as api from "./api-client";
1716
import { CachingKind, getCachingKind } from "./caching-utils";
@@ -373,10 +372,8 @@ export async function getRawLanguages(
373372

374373
/** Inputs required to initialize a configuration. */
375374
export interface InitConfigInputs {
376-
analysisKindsInput: string;
377375
languagesInput: string | undefined;
378376
queriesInput: string | undefined;
379-
qualityQueriesInput: string | undefined;
380377
packsInput: string | undefined;
381378
configFile: string | undefined;
382379
dbLocation: string | undefined;
@@ -396,6 +393,7 @@ export interface InitConfigInputs {
396393
apiDetails: api.GitHubApiCombinedDetails;
397394
features: FeatureEnablement;
398395
repositoryProperties: RepositoryProperties;
396+
analysisKinds: AnalysisKind[];
399397
logger: Logger;
400398
}
401399

@@ -405,10 +403,8 @@ export interface InitConfigInputs {
405403
*/
406404
export async function initActionState(
407405
{
408-
analysisKindsInput,
409406
languagesInput,
410407
queriesInput,
411-
qualityQueriesInput,
412408
packsInput,
413409
buildModeInput,
414410
dbLocation,
@@ -424,22 +420,11 @@ export async function initActionState(
424420
githubVersion,
425421
features,
426422
repositoryProperties,
423+
analysisKinds,
427424
logger,
428425
}: InitConfigInputs,
429426
userConfig: UserConfig,
430427
): Promise<Config> {
431-
const analysisKinds = await parseAnalysisKinds(analysisKindsInput);
432-
433-
// For backwards compatibility, add Code Quality to the enabled analysis kinds
434-
// if an input to `quality-queries` was specified. We should remove this once
435-
// `quality-queries` is no longer used.
436-
if (
437-
!analysisKinds.includes(AnalysisKind.CodeQuality) &&
438-
qualityQueriesInput !== undefined
439-
) {
440-
analysisKinds.push(AnalysisKind.CodeQuality);
441-
}
442-
443428
const languages = await getLanguages(
444429
codeql,
445430
languagesInput,

0 commit comments

Comments
 (0)