From f6247bb37b9b01652dfd705808e438bb624d95b8 Mon Sep 17 00:00:00 2001 From: Chuan-kai Lin Date: Tue, 23 Sep 2025 08:01:11 -0700 Subject: [PATCH] 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. --- src/config-utils.test.ts | 31 +++++++++++++++- src/config-utils.ts | 59 ++++++++++++++++++++++++++----- src/overlay-language-aliases.json | 11 ++++++ 3 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 src/overlay-language-aliases.json diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts index 566a719ca..23ee4f006 100644 --- a/src/config-utils.test.ts +++ b/src/config-utils.test.ts @@ -987,7 +987,7 @@ interface OverlayDatabaseModeTestSetup { isDefaultBranch: boolean; repositoryOwner: string; buildMode: BuildMode | undefined; - languages: Language[]; + languages: string[]; codeqlVersion: string; gitRoot: string | undefined; codeScanningConfig: configUtils.UserConfig; @@ -1075,6 +1075,7 @@ const getOverlayDatabaseModeMacro = test.macro({ repository, features, setup.languages, + setup.languages.join(","), tempDir, // sourceRoot setup.buildMode, setup.codeScanningConfig, @@ -1336,6 +1337,20 @@ test( }, ); +test( + getOverlayDatabaseModeMacro, + "Overlay analysis on PR when feature enabled via language alias", + { + languages: ["javascript-typescript"], + features: [Feature.OverlayAnalysis, Feature.OverlayAnalysisJavascript], + isPullRequest: true, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.Overlay, + useOverlayDatabaseCaching: true, + }, +); + test( getOverlayDatabaseModeMacro, "Overlay analysis on PR when feature enabled with custom analysis", @@ -1492,6 +1507,20 @@ test( }, ); +test( + getOverlayDatabaseModeMacro, + "No overlay analysis on PR when the language is unknown", + { + languages: ["cobol"], + features: [Feature.OverlayAnalysis], + isPullRequest: true, + }, + { + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, + }, +); + test( getOverlayDatabaseModeMacro, "Overlay PR analysis by env for dsp-testing", diff --git a/src/config-utils.ts b/src/config-utils.ts index 448b24184..b297df973 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -33,6 +33,7 @@ import { CODEQL_OVERLAY_MINIMUM_VERSION, OverlayDatabaseMode, } from "./overlay-database-utils"; +import * as overlayLanguageAliases from "./overlay-language-aliases.json"; import { RepositoryNwo } from "./repository"; import { downloadTrapCaches } from "./trap-caching"; import { @@ -331,6 +332,36 @@ export async function getLanguages( return languages; } +/** + * Get the (unverified) languages for overlay analysis. + * + * This is a simplified version of `getLanguages` that only resolves language + * aliases but does not check if the languages are actually supported by the + * CodeQL CLI. It is intended to be used for overlay analysis preparations + * before the CodeQL CLI is available. + */ +async function getUnverifiedLanguagesForOverlay( + languagesInput: string | undefined, + repository: RepositoryNwo, + sourceRoot: string, + logger: Logger, +): Promise { + // Obtain languages without filtering them. + const { rawLanguages } = await getRawLanguages( + languagesInput, + repository, + sourceRoot, + logger, + ); + const languageAliases = overlayLanguageAliases as Record; + + const languagesSet: string[] = []; + for (const language of rawLanguages) { + languagesSet.push(languageAliases[language] || language); + } + return languagesSet; +} + export function getRawLanguagesNoAutodetect( languagesInput: string | undefined, ): string[] { @@ -589,11 +620,12 @@ const OVERLAY_ANALYSIS_CODE_SCANNING_FEATURES: Record = { }; async function isOverlayAnalysisFeatureEnabled( - repository: RepositoryNwo, - features: FeatureEnablement, - codeql: CodeQL, - languages: Language[], codeScanningConfig: UserConfig, + languagesInput: string | undefined, + repository: RepositoryNwo, + sourceRoot: string, + features: FeatureEnablement, + logger: Logger, ): Promise { // TODO: Remove the repository owner check once support for overlay analysis // stabilizes, and no more backward-incompatible changes are expected. @@ -603,6 +635,14 @@ async function isOverlayAnalysisFeatureEnabled( if (!(await features.getValue(Feature.OverlayAnalysis))) { return false; } + + const languages = await getUnverifiedLanguagesForOverlay( + languagesInput, + repository, + sourceRoot, + logger, + ); + let enableForCodeScanningOnly = false; for (const language of languages) { const feature = OVERLAY_ANALYSIS_FEATURES[language]; @@ -657,6 +697,7 @@ export async function getOverlayDatabaseMode( repository: RepositoryNwo, features: FeatureEnablement, languages: Language[], + languagesInput: string | undefined, sourceRoot: string, buildMode: BuildMode | undefined, codeScanningConfig: UserConfig, @@ -683,11 +724,12 @@ export async function getOverlayDatabaseMode( ); } else if ( await isOverlayAnalysisFeatureEnabled( - repository, - features, - codeql, - languages, codeScanningConfig, + languagesInput, + repository, + sourceRoot, + features, + logger, ) ) { if (isAnalyzingPullRequest()) { @@ -843,6 +885,7 @@ export async function initConfig(inputs: InitConfigInputs): Promise { inputs.repository, inputs.features, config.languages, + inputs.languagesInput, inputs.sourceRoot, config.buildMode, config.computedConfig, diff --git a/src/overlay-language-aliases.json b/src/overlay-language-aliases.json new file mode 100644 index 000000000..bb80aa412 --- /dev/null +++ b/src/overlay-language-aliases.json @@ -0,0 +1,11 @@ +{ + "c": "cpp", + "c++": "cpp", + "c-c++": "cpp", + "c-cpp": "cpp", + "c#": "csharp", + "java-kotlin": "java", + "kotlin": "java", + "javascript-typescript": "javascript", + "typescript": "javascript" +}