From 524532393a46071bdfc81527a811ffa69e16723a Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Mon, 1 Jun 2026 15:34:08 +0100 Subject: [PATCH] Disable missing diff-ranges fallback when overlay enabled manually --- lib/entry-points.js | 17 +++++-- src/config-utils.test.ts | 96 +++++++++++++++++++++++++++++----------- src/config-utils.ts | 36 ++++++++++----- src/testing-utils.ts | 1 + 4 files changed, 110 insertions(+), 40 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index 0e7010b990..b33d56b17a 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -151711,6 +151711,7 @@ async function initActionState({ extraQueryExclusions: [], overlayDatabaseMode: "none" /* None */, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: false, repositoryProperties, enableFileCoverageInformation }; @@ -151839,6 +151840,7 @@ async function checkOverlayEnablement(codeql, features, languages, sourceRoot, b return validateOverlayDatabaseMode( modeEnv, false, + true, codeql, languages, sourceRoot, @@ -151913,6 +151915,7 @@ async function checkOverlayEnablement(codeql, features, languages, sourceRoot, b return validateOverlayDatabaseMode( overlayDatabaseMode, true, + false, codeql, languages, sourceRoot, @@ -151921,7 +151924,7 @@ async function checkOverlayEnablement(codeql, features, languages, sourceRoot, b logger ); } -async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDatabaseCaching, codeql, languages, sourceRoot, buildMode, gitVersion, logger) { +async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDatabaseCaching, overlayModeSetExplicitly, codeql, languages, sourceRoot, buildMode, gitVersion, logger) { if (buildMode !== "none" /* None */ && (await Promise.all( languages.map( async (l) => l !== "go" /* go */ && // Workaround to allow overlay analysis for Go with any build @@ -151965,7 +151968,8 @@ async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDataba } return new Success({ overlayDatabaseMode, - useOverlayDatabaseCaching + useOverlayDatabaseCaching, + overlayModeSetExplicitly }); } async function isTrapCachingEnabled(features, overlayDatabaseMode) { @@ -152003,7 +152007,7 @@ function hasQueryCustomisation(userConfig) { return isDefined2(userConfig["disable-default-queries"]) || isDefined2(userConfig.queries) || isDefined2(userConfig["query-filters"]); } async function applyIncrementalAnalysisSettings(config, hasDiffRanges, codeql, logger) { - if (config.overlayDatabaseMode === "overlay" /* Overlay */ && !hasDiffRanges) { + if (config.overlayDatabaseMode === "overlay" /* Overlay */ && !hasDiffRanges && !config.overlayModeSetExplicitly) { logger.info( `Reverting overlay database mode to ${"none" /* None */} because the PR diff ranges could not be computed.` ); @@ -152111,12 +152115,17 @@ async function initConfig(features, inputs) { logger ); if (overlayDatabaseModeResult.isSuccess()) { - const { overlayDatabaseMode, useOverlayDatabaseCaching } = overlayDatabaseModeResult.value; + const { + overlayDatabaseMode, + useOverlayDatabaseCaching, + overlayModeSetExplicitly + } = overlayDatabaseModeResult.value; logger.info( `Using overlay database mode: ${overlayDatabaseMode} ${useOverlayDatabaseCaching ? "with" : "without"} caching.` ); config.overlayDatabaseMode = overlayDatabaseMode; config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; + config.overlayModeSetExplicitly = overlayModeSetExplicitly; } else { const overlayDisabledReason = overlayDatabaseModeResult.value; logger.info( diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts index 10dee55399..25f9293c40 100644 --- a/src/config-utils.test.ts +++ b/src/config-utils.test.ts @@ -1044,6 +1044,7 @@ const checkOverlayEnablementMacro = makeMacro({ | { overlayDatabaseMode: OverlayDatabaseMode; useOverlayDatabaseCaching: boolean; + overlayModeSetExplicitly?: boolean; } | { disabledReason: OverlayDisabledReason; @@ -1124,7 +1125,13 @@ const checkOverlayEnablementMacro = makeMacro({ if ("disabledReason" in expected) { t.deepEqual(result, new Failure(expected.disabledReason)); } else { - t.deepEqual(result, new Success(expected)); + t.deepEqual( + result, + new Success({ + overlayModeSetExplicitly: false, + ...expected, + }), + ); } } finally { // Restore the original environment @@ -1143,6 +1150,7 @@ checkOverlayEnablementMacro.serial( { overlayDatabaseMode: OverlayDatabaseMode.Overlay, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: true, }, ); @@ -1154,6 +1162,7 @@ checkOverlayEnablementMacro.serial( { overlayDatabaseMode: OverlayDatabaseMode.OverlayBase, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: true, }, ); @@ -1812,6 +1821,7 @@ checkOverlayEnablementMacro.serial( { overlayDatabaseMode: OverlayDatabaseMode.Overlay, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: true, }, ); @@ -1824,6 +1834,7 @@ checkOverlayEnablementMacro.serial( { overlayDatabaseMode: OverlayDatabaseMode.Overlay, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: true, }, ); @@ -1920,6 +1931,7 @@ checkOverlayEnablementMacro.serial( { overlayDatabaseMode: OverlayDatabaseMode.Overlay, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: true, }, ); @@ -1965,6 +1977,7 @@ checkOverlayEnablementMacro.serial( { overlayDatabaseMode: OverlayDatabaseMode.Overlay, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: true, }, ); @@ -2182,33 +2195,64 @@ test("applyIncrementalAnalysisSettings: keeps overlay mode and adds exclusions w ]); }); -test("applyIncrementalAnalysisSettings: disables overlay analysis when diff ranges are unavailable", async (t) => { - const config = createTestConfig({ - overlayDatabaseMode: OverlayDatabaseMode.Overlay, - }); - config.useOverlayDatabaseCaching = true; - const codeql = createStubCodeQL({}); - const logger = getRunnerLogger(true); - const addDiagnosticsStub = sinon - .stub(overlayDiagnostics, "addOverlayDisablementDiagnostics") - .resolves(); +test.serial( + "applyIncrementalAnalysisSettings: disables overlay analysis when diff ranges are unavailable", + async (t) => { + const config = createTestConfig({ + overlayDatabaseMode: OverlayDatabaseMode.Overlay, + }); + config.useOverlayDatabaseCaching = true; + const codeql = createStubCodeQL({}); + const logger = getRunnerLogger(true); + const addDiagnosticsStub = sinon + .stub(overlayDiagnostics, "addOverlayDisablementDiagnostics") + .resolves(); + + await configUtils.applyIncrementalAnalysisSettings( + config, + false, + codeql, + logger, + ); - await configUtils.applyIncrementalAnalysisSettings( - config, - false, - codeql, - logger, - ); + t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None); + t.is(config.useOverlayDatabaseCaching, false); + t.deepEqual(config.extraQueryExclusions, []); + t.true(addDiagnosticsStub.calledOnce); + t.is( + addDiagnosticsStub.firstCall.args[2], + OverlayDisabledReason.DiffInformedAnalysisNotEnabled, + ); + }, +); - t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None); - t.is(config.useOverlayDatabaseCaching, false); - t.deepEqual(config.extraQueryExclusions, []); - t.true(addDiagnosticsStub.calledOnce); - t.is( - addDiagnosticsStub.firstCall.args[2], - OverlayDisabledReason.DiffInformedAnalysisNotEnabled, - ); -}); +test.serial( + "applyIncrementalAnalysisSettings: keeps overlay mode when set explicitly and diff ranges are unavailable", + async (t) => { + const config = createTestConfig({ + overlayDatabaseMode: OverlayDatabaseMode.Overlay, + }); + config.useOverlayDatabaseCaching = false; + config.overlayModeSetExplicitly = true; + const codeql = createStubCodeQL({}); + const logger = getRunnerLogger(true); + const addDiagnosticsStub = sinon + .stub(overlayDiagnostics, "addOverlayDisablementDiagnostics") + .resolves(); + + await configUtils.applyIncrementalAnalysisSettings( + config, + false, + codeql, + logger, + ); + + t.is(config.overlayDatabaseMode, OverlayDatabaseMode.Overlay); + t.is(config.useOverlayDatabaseCaching, false); + t.deepEqual(config.extraQueryExclusions, []); + t.true(addDiagnosticsStub.notCalled); + }, +); test("applyIncrementalAnalysisSettings: adds exclusions for diff-informed-only runs", async (t) => { const config = createTestConfig({}); diff --git a/src/config-utils.ts b/src/config-utils.ts index 87329fce2e..f4bd761a23 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -243,6 +243,11 @@ export interface Config { */ useOverlayDatabaseCaching: boolean; + /** + * Whether the overlay database mode was set explicitly. + */ + overlayModeSetExplicitly: boolean; + /** * A partial mapping from repository properties that affect us to their values. */ @@ -573,6 +578,7 @@ export async function initActionState( extraQueryExclusions: [], overlayDatabaseMode: OverlayDatabaseMode.None, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: false, repositoryProperties, enableFileCoverageInformation, }; @@ -772,6 +778,7 @@ async function checkRunnerResources( interface EnabledOverlayConfig { overlayDatabaseMode: Exclude; useOverlayDatabaseCaching: boolean; + overlayModeSetExplicitly: boolean; } /** @@ -826,6 +833,7 @@ export async function checkOverlayEnablement( return validateOverlayDatabaseMode( modeEnv, false, + true, codeql, languages, sourceRoot, @@ -917,6 +925,7 @@ export async function checkOverlayEnablement( return validateOverlayDatabaseMode( overlayDatabaseMode, true, + false, codeql, languages, sourceRoot, @@ -935,6 +944,7 @@ export async function checkOverlayEnablement( async function validateOverlayDatabaseMode( overlayDatabaseMode: Exclude, useOverlayDatabaseCaching: boolean, + overlayModeSetExplicitly: boolean, codeql: CodeQL, languages: Language[], sourceRoot: string, @@ -1006,6 +1016,7 @@ async function validateOverlayDatabaseMode( return new Success({ overlayDatabaseMode, useOverlayDatabaseCaching, + overlayModeSetExplicitly, }); } @@ -1080,14 +1091,14 @@ function hasQueryCustomisation(userConfig: UserConfig): boolean { /** * Finalize the incremental-analysis configuration for this run. * - * Overlay analysis has only been validated in combination with diff-informed - * analysis, so if `Overlay` mode was selected for a pull request but the diff - * ranges could not be computed, fall back to a full non-overlay analysis. + * Overlay analysis has only been validated in combination with diff-informed analysis, so if + * `Overlay` mode was selected for a pull request but the diff ranges could not be computed, fall + * back to a full non-overlay analysis. If the overlay mode was set explicitly, this fallback does + * not apply. * - * Query exclusions for incremental-only queries are then applied whenever the - * diff ranges are available — which, after the fallback above, is exactly the - * set of runs where any kind of incremental analysis (overlay or - * diff-informed) is in effect. + * Query exclusions for incremental-only queries are then applied whenever the diff ranges are + * available — which, after the fallback above, is exactly the set of runs where any kind of + * incremental analysis (overlay or diff-informed) is in effect. */ export async function applyIncrementalAnalysisSettings( config: Config, @@ -1097,7 +1108,8 @@ export async function applyIncrementalAnalysisSettings( ): Promise { if ( config.overlayDatabaseMode === OverlayDatabaseMode.Overlay && - !hasDiffRanges + !hasDiffRanges && + !config.overlayModeSetExplicitly ) { logger.info( `Reverting overlay database mode to ${OverlayDatabaseMode.None} ` + @@ -1251,14 +1263,18 @@ export async function initConfig( logger, ); if (overlayDatabaseModeResult.isSuccess()) { - const { overlayDatabaseMode, useOverlayDatabaseCaching } = - overlayDatabaseModeResult.value; + const { + overlayDatabaseMode, + useOverlayDatabaseCaching, + overlayModeSetExplicitly, + } = overlayDatabaseModeResult.value; logger.info( `Using overlay database mode: ${overlayDatabaseMode} ` + `${useOverlayDatabaseCaching ? "with" : "without"} caching.`, ); config.overlayDatabaseMode = overlayDatabaseMode; config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; + config.overlayModeSetExplicitly = overlayModeSetExplicitly; } else { const overlayDisabledReason = overlayDatabaseModeResult.value; logger.info( diff --git a/src/testing-utils.ts b/src/testing-utils.ts index 8287d29d61..c3e1d51428 100644 --- a/src/testing-utils.ts +++ b/src/testing-utils.ts @@ -585,6 +585,7 @@ export function createTestConfig(overrides: Partial): Config { extraQueryExclusions: [], overlayDatabaseMode: OverlayDatabaseMode.None, useOverlayDatabaseCaching: false, + overlayModeSetExplicitly: false, repositoryProperties: {}, enableFileCoverageInformation: true, } satisfies Config,