Skip to content

Commit f6247bb

Browse files
committed
Overlay: check features without CodeQL CLI
This commit changes isOverlayAnalysisFeatureEnabled() so that it uses the overlay-language-aliases.json file to resolve language aliases instead of relying on the CodeQL CLI.
1 parent 6e69a92 commit f6247bb

File tree

3 files changed

+90
-7
lines changed

3 files changed

+90
-7
lines changed

src/config-utils.test.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ interface OverlayDatabaseModeTestSetup {
987987
isDefaultBranch: boolean;
988988
repositoryOwner: string;
989989
buildMode: BuildMode | undefined;
990-
languages: Language[];
990+
languages: string[];
991991
codeqlVersion: string;
992992
gitRoot: string | undefined;
993993
codeScanningConfig: configUtils.UserConfig;
@@ -1075,6 +1075,7 @@ const getOverlayDatabaseModeMacro = test.macro({
10751075
repository,
10761076
features,
10771077
setup.languages,
1078+
setup.languages.join(","),
10781079
tempDir, // sourceRoot
10791080
setup.buildMode,
10801081
setup.codeScanningConfig,
@@ -1336,6 +1337,20 @@ test(
13361337
},
13371338
);
13381339

1340+
test(
1341+
getOverlayDatabaseModeMacro,
1342+
"Overlay analysis on PR when feature enabled via language alias",
1343+
{
1344+
languages: ["javascript-typescript"],
1345+
features: [Feature.OverlayAnalysis, Feature.OverlayAnalysisJavascript],
1346+
isPullRequest: true,
1347+
},
1348+
{
1349+
overlayDatabaseMode: OverlayDatabaseMode.Overlay,
1350+
useOverlayDatabaseCaching: true,
1351+
},
1352+
);
1353+
13391354
test(
13401355
getOverlayDatabaseModeMacro,
13411356
"Overlay analysis on PR when feature enabled with custom analysis",
@@ -1492,6 +1507,20 @@ test(
14921507
},
14931508
);
14941509

1510+
test(
1511+
getOverlayDatabaseModeMacro,
1512+
"No overlay analysis on PR when the language is unknown",
1513+
{
1514+
languages: ["cobol"],
1515+
features: [Feature.OverlayAnalysis],
1516+
isPullRequest: true,
1517+
},
1518+
{
1519+
overlayDatabaseMode: OverlayDatabaseMode.None,
1520+
useOverlayDatabaseCaching: false,
1521+
},
1522+
);
1523+
14951524
test(
14961525
getOverlayDatabaseModeMacro,
14971526
"Overlay PR analysis by env for dsp-testing",

src/config-utils.ts

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
CODEQL_OVERLAY_MINIMUM_VERSION,
3434
OverlayDatabaseMode,
3535
} from "./overlay-database-utils";
36+
import * as overlayLanguageAliases from "./overlay-language-aliases.json";
3637
import { RepositoryNwo } from "./repository";
3738
import { downloadTrapCaches } from "./trap-caching";
3839
import {
@@ -331,6 +332,36 @@ export async function getLanguages(
331332
return languages;
332333
}
333334

335+
/**
336+
* Get the (unverified) languages for overlay analysis.
337+
*
338+
* This is a simplified version of `getLanguages` that only resolves language
339+
* aliases but does not check if the languages are actually supported by the
340+
* CodeQL CLI. It is intended to be used for overlay analysis preparations
341+
* before the CodeQL CLI is available.
342+
*/
343+
async function getUnverifiedLanguagesForOverlay(
344+
languagesInput: string | undefined,
345+
repository: RepositoryNwo,
346+
sourceRoot: string,
347+
logger: Logger,
348+
): Promise<string[]> {
349+
// Obtain languages without filtering them.
350+
const { rawLanguages } = await getRawLanguages(
351+
languagesInput,
352+
repository,
353+
sourceRoot,
354+
logger,
355+
);
356+
const languageAliases = overlayLanguageAliases as Record<string, string>;
357+
358+
const languagesSet: string[] = [];
359+
for (const language of rawLanguages) {
360+
languagesSet.push(languageAliases[language] || language);
361+
}
362+
return languagesSet;
363+
}
364+
334365
export function getRawLanguagesNoAutodetect(
335366
languagesInput: string | undefined,
336367
): string[] {
@@ -589,11 +620,12 @@ const OVERLAY_ANALYSIS_CODE_SCANNING_FEATURES: Record<Language, Feature> = {
589620
};
590621

591622
async function isOverlayAnalysisFeatureEnabled(
623+
codeScanningConfig: UserConfig,
624+
languagesInput: string | undefined,
592625
repository: RepositoryNwo,
626+
sourceRoot: string,
593627
features: FeatureEnablement,
594-
codeql: CodeQL,
595-
languages: Language[],
596-
codeScanningConfig: UserConfig,
628+
logger: Logger,
597629
): Promise<boolean> {
598630
// TODO: Remove the repository owner check once support for overlay analysis
599631
// stabilizes, and no more backward-incompatible changes are expected.
@@ -603,6 +635,14 @@ async function isOverlayAnalysisFeatureEnabled(
603635
if (!(await features.getValue(Feature.OverlayAnalysis))) {
604636
return false;
605637
}
638+
639+
const languages = await getUnverifiedLanguagesForOverlay(
640+
languagesInput,
641+
repository,
642+
sourceRoot,
643+
logger,
644+
);
645+
606646
let enableForCodeScanningOnly = false;
607647
for (const language of languages) {
608648
const feature = OVERLAY_ANALYSIS_FEATURES[language];
@@ -657,6 +697,7 @@ export async function getOverlayDatabaseMode(
657697
repository: RepositoryNwo,
658698
features: FeatureEnablement,
659699
languages: Language[],
700+
languagesInput: string | undefined,
660701
sourceRoot: string,
661702
buildMode: BuildMode | undefined,
662703
codeScanningConfig: UserConfig,
@@ -683,11 +724,12 @@ export async function getOverlayDatabaseMode(
683724
);
684725
} else if (
685726
await isOverlayAnalysisFeatureEnabled(
727+
codeScanningConfig,
728+
languagesInput,
686729
repository,
730+
sourceRoot,
687731
features,
688-
codeql,
689-
languages,
690-
codeScanningConfig,
732+
logger,
691733
)
692734
) {
693735
if (isAnalyzingPullRequest()) {
@@ -843,6 +885,7 @@ export async function initConfig(inputs: InitConfigInputs): Promise<Config> {
843885
inputs.repository,
844886
inputs.features,
845887
config.languages,
888+
inputs.languagesInput,
846889
inputs.sourceRoot,
847890
config.buildMode,
848891
config.computedConfig,

src/overlay-language-aliases.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"c": "cpp",
3+
"c++": "cpp",
4+
"c-c++": "cpp",
5+
"c-cpp": "cpp",
6+
"c#": "csharp",
7+
"java-kotlin": "java",
8+
"kotlin": "java",
9+
"javascript-typescript": "javascript",
10+
"typescript": "javascript"
11+
}

0 commit comments

Comments
 (0)