From 6c405c2562eb8d106668749d4264b45306a0da18 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 17 Feb 2026 13:38:06 +0000 Subject: [PATCH] Be more explicit about attempt to build overlay DB --- lib/init-action-post.js | 5 +++-- lib/init-action.js | 2 +- src/init-action-post-helper.test.ts | 28 ++++++++++++++++++++-------- src/init-action-post-helper.ts | 5 +++-- src/overlay/status.ts | 7 ++++++- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/lib/init-action-post.js b/lib/init-action-post.js index 966d09753..c93ca8567 100644 --- a/lib/init-action-post.js +++ b/lib/init-action-post.js @@ -169801,9 +169801,10 @@ async function run(uploadAllAvailableDebugArtifacts, printDebugLogs2, codeql, co return uploadFailedSarifResult; } async function recordOverlayStatus(codeql, config, features, logger) { - if (config.overlayDatabaseMode === "overlay-base" /* OverlayBase */ && process.env["CODEQL_ACTION_ANALYZE_DID_COMPLETE_SUCCESSFULLY" /* ANALYZE_DID_COMPLETE_SUCCESSFULLY */] !== "true" && await features.getValue("overlay_analysis_status_save" /* OverlayAnalysisStatusSave */)) { + if (config.overlayDatabaseMode === "overlay-base" /* OverlayBase */ && await features.getValue("overlay_analysis_status_save" /* OverlayAnalysisStatusSave */)) { const overlayStatus = { - builtOverlayBaseDatabase: false + attemptedToBuildOverlayBaseDatabase: true, + builtOverlayBaseDatabase: process.env["CODEQL_ACTION_ANALYZE_DID_COMPLETE_SUCCESSFULLY" /* ANALYZE_DID_COMPLETE_SUCCESSFULLY */] === "true" }; const diskUsage = await checkDiskUsage(logger); if (diskUsage === void 0) { diff --git a/lib/init-action.js b/lib/init-action.js index 3ca107553..02aa9b762 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -105714,7 +105714,7 @@ async function shouldSkipOverlayAnalysis(codeql, languages, diskUsage, logger) { logger.debug("No cached overlay status found."); return false; } - if (!status.builtOverlayBaseDatabase) { + if (status.attemptedToBuildOverlayBaseDatabase && !status.builtOverlayBaseDatabase) { logger.info( "Cached overlay status indicates that building an overlay base database was unsuccessful, so will skip overlay analysis." ); diff --git a/src/init-action-post-helper.test.ts b/src/init-action-post-helper.test.ts index 79b55e291..a2a167af0 100644 --- a/src/init-action-post-helper.test.ts +++ b/src/init-action-post-helper.test.ts @@ -365,8 +365,11 @@ test("saves overlay status when overlay-base analysis did not complete successfu ); t.deepEqual( saveOverlayStatusStub.firstCall.args[3], - { builtOverlayBaseDatabase: false }, - "fourth arg should be the overlay status with builtOverlayBaseDatabase: false", + { + attemptedToBuildOverlayBaseDatabase: true, + builtOverlayBaseDatabase: false, + }, + "fourth arg should be the overlay status recording an unsuccessful build attempt", ); }); }); @@ -408,17 +411,18 @@ test("does not save overlay status when OverlayAnalysisStatusSave feature flag i }); }); -test("does not save overlay status when analysis completed successfully", async (t) => { +test("saves overlay status recording successful build when analysis completed successfully", async (t) => { return await util.withTmpDir(async (tmpDir) => { process.env["GITHUB_REPOSITORY"] = "github/codeql-action-fake-repository"; process.env["RUNNER_TEMP"] = tmpDir; // Mark analyze as having completed successfully. process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] = "true"; - sinon.stub(util, "checkDiskUsage").resolves({ + const diskUsage: util.DiskUsage = { numAvailableBytes: 100 * 1024 * 1024 * 1024, numTotalBytes: 200 * 1024 * 1024 * 1024, - }); + }; + sinon.stub(util, "checkDiskUsage").resolves(diskUsage); const saveOverlayStatusStub = sinon .stub(overlayStatus, "saveOverlayStatus") @@ -434,13 +438,21 @@ test("does not save overlay status when analysis completed successfully", async overlayDatabaseMode: OverlayDatabaseMode.OverlayBase, }), parseRepositoryNwo("github/codeql-action"), - createFeatures([]), + createFeatures([Feature.OverlayAnalysisStatusSave]), getRunnerLogger(true), ); t.true( - saveOverlayStatusStub.notCalled, - "saveOverlayStatus should not be called when analysis completed successfully", + saveOverlayStatusStub.calledOnce, + "saveOverlayStatus should be called exactly once", + ); + t.deepEqual( + saveOverlayStatusStub.firstCall.args[3], + { + attemptedToBuildOverlayBaseDatabase: true, + builtOverlayBaseDatabase: true, + }, + "fourth arg should be the overlay status recording a successful build attempt", ); }); }); diff --git a/src/init-action-post-helper.ts b/src/init-action-post-helper.ts index 4ef636820..1f6e08798 100644 --- a/src/init-action-post-helper.ts +++ b/src/init-action-post-helper.ts @@ -259,11 +259,12 @@ async function recordOverlayStatus( ) { if ( config.overlayDatabaseMode === OverlayDatabaseMode.OverlayBase && - process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] !== "true" && (await features.getValue(Feature.OverlayAnalysisStatusSave)) ) { const overlayStatus = { - builtOverlayBaseDatabase: false, + attemptedToBuildOverlayBaseDatabase: true, + builtOverlayBaseDatabase: + process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] === "true", } satisfies OverlayStatus; const diskUsage = await checkDiskUsage(logger); diff --git a/src/overlay/status.ts b/src/overlay/status.ts index d8c30b881..a6873b8e7 100644 --- a/src/overlay/status.ts +++ b/src/overlay/status.ts @@ -30,6 +30,8 @@ const STATUS_FILE_NAME = "overlay-status.json"; /** Status of an overlay analysis for a set of languages. */ export interface OverlayStatus { + /** Whether the job attempted to build an overlay base database. */ + attemptedToBuildOverlayBaseDatabase: boolean; /** Whether the job successfully built an overlay base database. */ builtOverlayBaseDatabase: boolean; } @@ -48,7 +50,10 @@ export async function shouldSkipOverlayAnalysis( logger.debug("No cached overlay status found."); return false; } - if (!status.builtOverlayBaseDatabase) { + if ( + status.attemptedToBuildOverlayBaseDatabase && + !status.builtOverlayBaseDatabase + ) { logger.info( "Cached overlay status indicates that building an overlay base database was unsuccessful, so will skip overlay analysis.", );