From 08f4ea7f09037be492d3426531f27f4a024705e8 Mon Sep 17 00:00:00 2001 From: Sam Robson Date: Thu, 26 Mar 2026 17:23:59 +0000 Subject: [PATCH] fix: fall back to non-overlay analysis when diff-informed analysis is unavailable --- lib/init-action.js | 16 ++++++++++++++++ src/diff-informed-analysis-utils.ts | 4 ++++ src/init-action.ts | 26 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/lib/init-action.js b/lib/init-action.js index dcf3d2bea9..ba52abd01b 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -106260,6 +106260,9 @@ function writeDiffRangesJsonFile(logger, ranges) { ${jsonContents}` ); } +function hasDiffRangesJsonFile() { + return fs5.existsSync(getDiffRangesJsonFilePath()); +} async function getPullRequestEditedDiffRanges(branches, logger) { const fileDiffs = await getFileDiffsWithBasehead(branches, logger); if (fileDiffs === void 0) { @@ -110333,6 +110336,19 @@ async function run(startedAt) { } return; } + try { + if (config.overlayDatabaseMode === "overlay" /* Overlay */ && await shouldPerformDiffInformedAnalysis(codeql, features, logger) && !hasDiffRangesJsonFile()) { + logger.warning( + `Diff-informed analysis is not available for this pull request. Reverting overlay database mode to ${"none" /* None */}.` + ); + config.overlayDatabaseMode = "none" /* None */; + } + } catch (e) { + logger.warning( + `Failed to determine diff-informed analysis availability, reverting overlay database mode to ${"none" /* None */}: ${getErrorMessage(e)}` + ); + config.overlayDatabaseMode = "none" /* None */; + } let overlayBaseDatabaseStats; let dependencyCachingStatus; try { diff --git a/src/diff-informed-analysis-utils.ts b/src/diff-informed-analysis-utils.ts index 1c98d4caca..3be9c2cb2d 100644 --- a/src/diff-informed-analysis-utils.ts +++ b/src/diff-informed-analysis-utils.ts @@ -88,6 +88,10 @@ export function writeDiffRangesJsonFile( ); } +export function hasDiffRangesJsonFile(): boolean { + return fs.existsSync(actionsUtil.getDiffRangesJsonFilePath()); +} + export function readDiffRangesJsonFile( logger: Logger, ): DiffThunkRange[] | undefined { diff --git a/src/init-action.ts b/src/init-action.ts index b06903d5c5..6fda0c448c 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -40,6 +40,8 @@ import { import { getDiffInformedAnalysisBranches, getPullRequestEditedDiffRanges, + hasDiffRangesJsonFile, + shouldPerformDiffInformedAnalysis, writeDiffRangesJsonFile, } from "./diff-informed-analysis-utils"; import { EnvVar } from "./environment"; @@ -438,6 +440,30 @@ async function run(startedAt: Date) { return; } + // If overlay is enabled and diff-informed analysis should have run but + // failed to produce output, revert to non-overlay analysis. Overlay + // without diff-informed is an untested combination that can produce + // inaccurate results. + try { + if ( + config.overlayDatabaseMode === OverlayDatabaseMode.Overlay && + (await shouldPerformDiffInformedAnalysis(codeql, features, logger)) && + !hasDiffRangesJsonFile() + ) { + logger.warning( + "Diff-informed analysis is not available for this pull request. " + + `Reverting overlay database mode to ${OverlayDatabaseMode.None}.`, + ); + config.overlayDatabaseMode = OverlayDatabaseMode.None; + } + } catch (e) { + logger.warning( + `Failed to determine diff-informed analysis availability, ` + + `reverting overlay database mode to ${OverlayDatabaseMode.None}: ${getErrorMessage(e)}`, + ); + config.overlayDatabaseMode = OverlayDatabaseMode.None; + } + let overlayBaseDatabaseStats: OverlayBaseDatabaseDownloadStats | undefined; let dependencyCachingStatus: DependencyCacheRestoreStatusReport | undefined; try {