Skip to content

Commit 9281ff9

Browse files
committed
Fix legacy SARIF categories for CQ in default setup
1 parent f7ede16 commit 9281ff9

2 files changed

Lines changed: 86 additions & 1 deletion

File tree

src/analyze.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
runQueries,
1111
defaultSuites,
1212
resolveQuerySuiteAlias,
13+
fixCodeQualityCategory,
1314
} from "./analyze";
1415
import { setCodeQL } from "./codeql";
1516
import { Feature } from "./feature-flags";
@@ -349,3 +350,42 @@ test("resolveQuerySuiteAlias", (t) => {
349350
t.deepEqual(resolveQuerySuiteAlias(Language.go, name), name);
350351
}
351352
});
353+
354+
test("fixCodeQualityCategory", (t) => {
355+
const logger = getRunnerLogger(true);
356+
process.env["GITHUB_EVENT_NAME"] = "dynamic";
357+
358+
// Categories that should get adjusted.
359+
t.is(fixCodeQualityCategory(logger, "/language:c#"), "/language:csharp");
360+
t.is(fixCodeQualityCategory(logger, "/language:cpp"), "/language:c-cpp");
361+
t.is(fixCodeQualityCategory(logger, "/language:c"), "/language:c-cpp");
362+
t.is(
363+
fixCodeQualityCategory(logger, "/language:java"),
364+
"/language:java-kotlin",
365+
);
366+
t.is(
367+
fixCodeQualityCategory(logger, "/language:javascript"),
368+
"/language:javascript-typescript",
369+
);
370+
t.is(
371+
fixCodeQualityCategory(logger, "/language:typescript"),
372+
"/language:javascript-typescript",
373+
);
374+
t.is(
375+
fixCodeQualityCategory(logger, "/language:kotlin"),
376+
"/language:java-kotlin",
377+
);
378+
379+
// Categories that should not get adjusted.
380+
t.is(fixCodeQualityCategory(logger, "/language:csharp"), "/language:csharp");
381+
t.is(fixCodeQualityCategory(logger, "/language:go"), "/language:go");
382+
t.is(
383+
fixCodeQualityCategory(logger, "/language:actions"),
384+
"/language:actions",
385+
);
386+
387+
// Other cases.
388+
t.is(fixCodeQualityCategory(logger, undefined), undefined);
389+
t.is(fixCodeQualityCategory(logger, "random string"), "random string");
390+
t.is(fixCodeQualityCategory(logger, "kotlin"), "kotlin");
391+
});

src/analyze.ts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as yaml from "js-yaml";
99
import {
1010
getRequiredInput,
1111
getTemporaryDirectory,
12+
isDefaultSetup,
1213
PullRequestBranches,
1314
} from "./actions-util";
1415
import { getApiClient } from "./api-client";
@@ -602,6 +603,47 @@ export function resolveQuerySuiteAlias(
602603
return maybeSuite;
603604
}
604605

606+
/** Adjusts the category string for a Code Quality SARIF file if an "old"
607+
* category identifier is used by Default Setup.
608+
*/
609+
export function fixCodeQualityCategory(
610+
logger: Logger,
611+
category?: string,
612+
): string | undefined {
613+
// A mapping from old categories to new ones.
614+
const qualityCategoryMapping: Record<string, string> = {
615+
"c#": "csharp",
616+
cpp: "c-cpp",
617+
c: "c-cpp",
618+
"c++": "c-cpp",
619+
java: "java-kotlin",
620+
javascript: "javascript-typescript",
621+
typescript: "javascript-typescript",
622+
kotlin: "java-kotlin",
623+
};
624+
625+
// The `category` should always be set by Default Setup. We perform this check
626+
// to avoid potential issues if Code Quality supports Advanced Setup in the future
627+
// and before this workaround is removed.
628+
if (
629+
category !== undefined &&
630+
isDefaultSetup() &&
631+
category.startsWith("/language:")
632+
) {
633+
const language = category.substring("/language:".length);
634+
const mappedLanguage = qualityCategoryMapping[language];
635+
if (mappedLanguage) {
636+
const newCategory = `/language:${mappedLanguage}`;
637+
logger.info(
638+
`Adjusted category for Code Quality from '${category}' to '${newCategory}'.`,
639+
);
640+
return newCategory;
641+
}
642+
}
643+
644+
return category;
645+
}
646+
605647
// Runs queries and creates sarif files in the given folder
606648
export async function runQueries(
607649
sarifFolder: string,
@@ -697,7 +739,10 @@ export async function runQueries(
697739
let qualityAnalysisSummary: string | undefined = undefined;
698740
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
699741
logger.info(`Interpreting quality results for ${language}`);
700-
const qualityCategory = automationDetailsId;
742+
const qualityCategory = fixCodeQualityCategory(
743+
logger,
744+
automationDetailsId,
745+
);
701746
const qualitySarifFile = path.join(
702747
sarifFolder,
703748
`${language}.quality.sarif`,

0 commit comments

Comments
 (0)