diff --git a/lib/init-action.js b/lib/init-action.js index 0fa09f504..7ab924d66 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -106390,10 +106390,7 @@ var OVERLAY_ANALYSIS_CODE_SCANNING_FEATURES = { }; async function checkOverlayAnalysisFeatureEnabled(features, codeql, languages, codeScanningConfig) { if (!await features.getValue("overlay_analysis" /* OverlayAnalysis */, codeql)) { - return { - enabled: false, - reason: "overall-feature-not-enabled" /* OverallFeatureNotEnabled */ - }; + return new Failure("overall-feature-not-enabled" /* OverallFeatureNotEnabled */); } let enableForCodeScanningOnly = false; for (const language of languages) { @@ -106406,18 +106403,15 @@ async function checkOverlayAnalysisFeatureEnabled(features, codeql, languages, c enableForCodeScanningOnly = true; continue; } - return { enabled: false, reason: "language-not-enabled" /* LanguageNotEnabled */ }; + return new Failure("language-not-enabled" /* LanguageNotEnabled */); } if (enableForCodeScanningOnly) { const usesDefaultQueriesOnly = codeScanningConfig["disable-default-queries"] !== true && codeScanningConfig.packs === void 0 && codeScanningConfig.queries === void 0 && codeScanningConfig["query-filters"] === void 0; if (!usesDefaultQueriesOnly) { - return { - enabled: false, - reason: "non-default-queries" /* NonDefaultQueries */ - }; + return new Failure("non-default-queries" /* NonDefaultQueries */); } } - return { enabled: true }; + return new Success(void 0); } function runnerHasSufficientDiskSpace(diskUsage, logger, useV2ResourceChecks) { const minimumDiskSpaceBytes = useV2ResourceChecks ? OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_V2_BYTES : OVERLAY_MINIMUM_AVAILABLE_DISK_SPACE_BYTES; @@ -106455,34 +106449,21 @@ async function runnerHasSufficientMemory(codeql, ramInput, logger) { } async function checkRunnerResources(codeql, diskUsage, ramInput, logger, useV2ResourceChecks) { if (!runnerHasSufficientDiskSpace(diskUsage, logger, useV2ResourceChecks)) { - return { - sufficient: false, - reason: "insufficient-disk-space" /* InsufficientDiskSpace */ - }; + return new Failure("insufficient-disk-space" /* InsufficientDiskSpace */); } if (!await runnerHasSufficientMemory(codeql, ramInput, logger)) { - return { - sufficient: false, - reason: "insufficient-memory" /* InsufficientMemory */ - }; + return new Failure("insufficient-memory" /* InsufficientMemory */); } - return { sufficient: true }; + return new Success(void 0); } async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, buildMode, ramInput, codeScanningConfig, repositoryProperties, gitVersion, logger) { - const disabledResult = (reason) => ({ - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false, - disabledReason: reason - }); const modeEnv = process.env.CODEQL_OVERLAY_DATABASE_MODE; if (modeEnv === "overlay" /* Overlay */ || modeEnv === "overlay-base" /* OverlayBase */ || modeEnv === "none" /* None */) { logger.info( `Setting overlay database mode to ${modeEnv} from the CODEQL_OVERLAY_DATABASE_MODE environment variable.` ); if (modeEnv === "none" /* None */) { - return disabledResult( - "disabled-by-environment-variable" /* DisabledByEnvironmentVariable */ - ); + return new Failure("disabled-by-environment-variable" /* DisabledByEnvironmentVariable */); } return validateOverlayDatabaseMode( modeEnv, @@ -106499,7 +106480,7 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b logger.info( `Setting overlay database mode to ${"none" /* None */} because the ${"github-codeql-disable-overlay" /* DISABLE_OVERLAY */} repository property is set to true.` ); - return disabledResult("disabled-by-repository-property" /* DisabledByRepositoryProperty */); + return new Failure("disabled-by-repository-property" /* DisabledByRepositoryProperty */); } const featureResult = await checkOverlayAnalysisFeatureEnabled( features, @@ -106507,8 +106488,8 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b languages, codeScanningConfig ); - if (!featureResult.enabled) { - return disabledResult(featureResult.reason); + if (featureResult.isFailure()) { + return featureResult; } const performResourceChecks = !await features.getValue( "overlay_analysis_skip_resource_checks" /* OverlayAnalysisSkipResourceChecks */, @@ -106525,7 +106506,7 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b logger.warning( `Unable to determine disk usage, therefore setting overlay database mode to ${"none" /* None */}.` ); - return disabledResult("unable-to-determine-disk-usage" /* UnableToDetermineDiskUsage */); + return new Failure("unable-to-determine-disk-usage" /* UnableToDetermineDiskUsage */); } const resourceResult = performResourceChecks && diskUsage ? await checkRunnerResources( codeql, @@ -106533,15 +106514,15 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b ramInput, logger, useV2ResourceChecks - ) : { sufficient: true }; - if (!resourceResult.sufficient) { - return disabledResult(resourceResult.reason); + ) : new Success(void 0); + if (resourceResult.isFailure()) { + return resourceResult; } if (checkOverlayStatus && diskUsage && await shouldSkipOverlayAnalysis(codeql, languages, diskUsage, logger)) { logger.info( `Setting overlay database mode to ${"none" /* None */} because overlay analysis previously failed with this combination of languages, disk space, and CodeQL version.` ); - return disabledResult("skipped-due-to-cached-status" /* SkippedDueToCachedStatus */); + return new Failure("skipped-due-to-cached-status" /* SkippedDueToCachedStatus */); } let overlayDatabaseMode; if (isAnalyzingPullRequest()) { @@ -106555,7 +106536,7 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b `Setting overlay database mode to ${overlayDatabaseMode} with caching because we are analyzing the default branch.` ); } else { - return disabledResult("not-pull-request-or-default-branch" /* NotPullRequestOrDefaultBranch */); + return new Failure("not-pull-request-or-default-branch" /* NotPullRequestOrDefaultBranch */); } return validateOverlayDatabaseMode( overlayDatabaseMode, @@ -106569,11 +106550,6 @@ async function getOverlayDatabaseMode(codeql, features, languages, sourceRoot, b ); } async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDatabaseCaching, codeql, languages, sourceRoot, buildMode, gitVersion, logger) { - const disabledResult = (reason) => ({ - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false, - disabledReason: reason - }); if (buildMode !== "none" /* None */ && (await Promise.all( languages.map( async (l) => l !== "go" /* go */ && // Workaround to allow overlay analysis for Go with any build @@ -106586,37 +106562,36 @@ async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDataba logger.warning( `Cannot build an ${overlayDatabaseMode} database because build-mode is set to "${buildMode}" instead of "none". Falling back to creating a normal full database instead.` ); - return disabledResult("incompatible-build-mode" /* IncompatibleBuildMode */); + return new Failure("incompatible-build-mode" /* IncompatibleBuildMode */); } if (!await codeQlVersionAtLeast(codeql, CODEQL_OVERLAY_MINIMUM_VERSION)) { logger.warning( `Cannot build an ${overlayDatabaseMode} database because the CodeQL CLI is older than ${CODEQL_OVERLAY_MINIMUM_VERSION}. Falling back to creating a normal full database instead.` ); - return disabledResult("incompatible-codeql" /* IncompatibleCodeQl */); + return new Failure("incompatible-codeql" /* IncompatibleCodeQl */); } if (await getGitRoot(sourceRoot) === void 0) { logger.warning( `Cannot build an ${overlayDatabaseMode} database because the source root "${sourceRoot}" is not inside a git repository. Falling back to creating a normal full database instead.` ); - return disabledResult("no-git-root" /* NoGitRoot */); + return new Failure("no-git-root" /* NoGitRoot */); } if (gitVersion === void 0) { logger.warning( `Cannot build an ${overlayDatabaseMode} database because the Git version could not be determined. Falling back to creating a normal full database instead.` ); - return disabledResult("incompatible-git" /* IncompatibleGit */); + return new Failure("incompatible-git" /* IncompatibleGit */); } if (!gitVersion.isAtLeast(GIT_MINIMUM_VERSION_FOR_OVERLAY)) { logger.warning( `Cannot build an ${overlayDatabaseMode} database because the installed Git version is older than ${GIT_MINIMUM_VERSION_FOR_OVERLAY}. Falling back to creating a normal full database instead.` ); - return disabledResult("incompatible-git" /* IncompatibleGit */); + return new Failure("incompatible-git" /* IncompatibleGit */); } - return { + return new Success({ overlayDatabaseMode, - useOverlayDatabaseCaching, - disabledReason: void 0 - }; + useOverlayDatabaseCaching + }); } function dbLocationOrDefault(dbLocation, tempDir) { return dbLocation || path9.resolve(tempDir, "codeql_databases"); @@ -106704,11 +106679,7 @@ async function initConfig(features, inputs) { } else { logger.debug(`Skipping check for generated files.`); } - const { - overlayDatabaseMode, - useOverlayDatabaseCaching, - disabledReason: overlayDisabledReason - } = await getOverlayDatabaseMode( + const overlayDatabaseModeResult = await getOverlayDatabaseMode( inputs.codeql, inputs.features, config.languages, @@ -106720,19 +106691,27 @@ async function initConfig(features, inputs) { gitVersion, logger ); - logger.info( - `Using overlay database mode: ${overlayDatabaseMode} ${useOverlayDatabaseCaching ? "with" : "without"} caching.` - ); - config.overlayDatabaseMode = overlayDatabaseMode; - config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; - if (overlayDisabledReason !== void 0) { + if (overlayDatabaseModeResult.isSuccess()) { + const { overlayDatabaseMode, useOverlayDatabaseCaching } = overlayDatabaseModeResult.value; + logger.info( + `Using overlay database mode: ${overlayDatabaseMode} ${useOverlayDatabaseCaching ? "with" : "without"} caching.` + ); + config.overlayDatabaseMode = overlayDatabaseMode; + config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; + } else { + const overlayDisabledReason = overlayDatabaseModeResult.value; + logger.info( + `Using overlay database mode: ${"none" /* None */} without caching.` + ); + config.overlayDatabaseMode = "none" /* None */; + config.useOverlayDatabaseCaching = false; await addOverlayDisablementDiagnostics( config, inputs.codeql, overlayDisabledReason ); } - if (overlayDatabaseMode === "overlay" /* Overlay */ || await shouldPerformDiffInformedAnalysis( + if (config.overlayDatabaseMode === "overlay" /* Overlay */ || await shouldPerformDiffInformedAnalysis( inputs.codeql, inputs.features, logger diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts index e6ba04725..f00e1a40e 100644 --- a/src/config-utils.test.ts +++ b/src/config-utils.test.ts @@ -40,6 +40,8 @@ import { withTmpDir, BuildMode, DiskUsage, + Success, + Failure, } from "./util"; import * as util from "./util"; @@ -1017,11 +1019,14 @@ const getOverlayDatabaseModeMacro = test.macro({ t: ExecutionContext, _title: string, setupOverrides: Partial, - expected: { - overlayDatabaseMode: OverlayDatabaseMode; - useOverlayDatabaseCaching: boolean; - disabledReason?: OverlayDisabledReason; - }, + expected: + | { + overlayDatabaseMode: OverlayDatabaseMode; + useOverlayDatabaseCaching: boolean; + } + | { + disabledReason: OverlayDisabledReason; + }, ) => { return await withTmpDir(async (tempDir) => { const messages: LoggedMessage[] = []; @@ -1092,11 +1097,11 @@ const getOverlayDatabaseModeMacro = test.macro({ logger, ); - if (!("disabledReason" in expected)) { - expected.disabledReason = undefined; + if ("disabledReason" in expected) { + t.deepEqual(result, new Failure(expected.disabledReason)); + } else { + t.deepEqual(result, new Success(expected)); } - - t.deepEqual(result, expected); } finally { // Restore the original environment process.env = originalEnv; @@ -1137,8 +1142,6 @@ test( overlayDatabaseEnvVar: "none", }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.DisabledByEnvironmentVariable, }, ); @@ -1150,8 +1153,6 @@ test( overlayDatabaseEnvVar: "invalid-mode", }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.OverallFeatureNotEnabled, }, ); @@ -1164,8 +1165,6 @@ test( features: [Feature.OverlayAnalysis, Feature.OverlayAnalysisJavascript], }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NotPullRequestOrDefaultBranch, }, ); @@ -1234,8 +1233,6 @@ test( }, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.InsufficientDiskSpace, }, ); @@ -1253,8 +1250,6 @@ test( diskUsage: undefined, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.UnableToDetermineDiskUsage, }, ); @@ -1298,8 +1293,6 @@ test( }, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.InsufficientDiskSpace, }, ); @@ -1342,8 +1335,6 @@ test( }, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.InsufficientDiskSpace, }, ); @@ -1361,8 +1352,6 @@ test( memoryFlagValue: 3072, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.InsufficientMemory, }, ); @@ -1419,8 +1408,6 @@ test( shouldSkipOverlayAnalysisDueToCachedStatus: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.SkippedDueToCachedStatus, }, ); @@ -1439,8 +1426,6 @@ test( shouldSkipOverlayAnalysisDueToCachedStatus: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.SkippedDueToCachedStatus, }, ); @@ -1460,8 +1445,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1481,8 +1464,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1502,8 +1483,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1523,8 +1502,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1538,8 +1515,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.OverallFeatureNotEnabled, }, ); @@ -1553,8 +1528,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.OverallFeatureNotEnabled, }, ); @@ -1568,8 +1541,6 @@ test( isDefaultBranch: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.LanguageNotEnabled, }, ); @@ -1638,8 +1609,6 @@ test( }, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.InsufficientDiskSpace, }, ); @@ -1679,8 +1648,6 @@ test( diskUsage: undefined, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.UnableToDetermineDiskUsage, }, ); @@ -1698,8 +1665,6 @@ test( memoryFlagValue: 3072, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.InsufficientMemory, }, ); @@ -1757,8 +1722,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1778,8 +1741,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1799,8 +1760,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1820,8 +1779,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NonDefaultQueries, }, ); @@ -1835,8 +1792,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.OverallFeatureNotEnabled, }, ); @@ -1850,8 +1805,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.OverallFeatureNotEnabled, }, ); @@ -1865,8 +1818,6 @@ test( isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.LanguageNotEnabled, }, ); @@ -1919,8 +1870,6 @@ test( languages: [KnownLanguage.java], }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.IncompatibleBuildMode, }, ); @@ -1934,8 +1883,6 @@ test( languages: [KnownLanguage.java], }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.IncompatibleBuildMode, }, ); @@ -1948,8 +1895,6 @@ test( codeqlVersion: "2.14.0", }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.IncompatibleCodeQl, }, ); @@ -1962,8 +1907,6 @@ test( gitRoot: undefined, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.NoGitRoot, }, ); @@ -1976,8 +1919,6 @@ test( gitVersion: new GitVersionInfo("2.30.0", "2.30.0"), // Version below required 2.38.0 }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.IncompatibleGit, }, ); @@ -1990,8 +1931,6 @@ test( gitVersion: undefined, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.IncompatibleGit, }, ); @@ -2008,8 +1947,6 @@ test( }, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.DisabledByRepositoryProperty, }, ); @@ -2057,8 +1994,6 @@ for (const language in KnownLanguage) { isPullRequest: true, }, { - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, disabledReason: OverlayDisabledReason.LanguageNotEnabled, }, ); diff --git a/src/config-utils.ts b/src/config-utils.ts index 30b415380..2fe9ce546 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -69,6 +69,9 @@ import { isInTestMode, joinAtMost, DiskUsage, + Result, + Success, + Failure, } from "./util"; /** @@ -662,14 +665,9 @@ async function checkOverlayAnalysisFeatureEnabled( codeql: CodeQL, languages: Language[], codeScanningConfig: UserConfig, -): Promise< - { enabled: true } | { enabled: false; reason: OverlayDisabledReason } -> { +): Promise> { if (!(await features.getValue(Feature.OverlayAnalysis, codeql))) { - return { - enabled: false, - reason: OverlayDisabledReason.OverallFeatureNotEnabled, - }; + return new Failure(OverlayDisabledReason.OverallFeatureNotEnabled); } let enableForCodeScanningOnly = false; for (const language of languages) { @@ -686,7 +684,7 @@ async function checkOverlayAnalysisFeatureEnabled( enableForCodeScanningOnly = true; continue; } - return { enabled: false, reason: OverlayDisabledReason.LanguageNotEnabled }; + return new Failure(OverlayDisabledReason.LanguageNotEnabled); } if (enableForCodeScanningOnly) { // A code-scanning configuration runs only the (default) code-scanning suite @@ -698,13 +696,10 @@ async function checkOverlayAnalysisFeatureEnabled( codeScanningConfig.queries === undefined && codeScanningConfig["query-filters"] === undefined; if (!usesDefaultQueriesOnly) { - return { - enabled: false, - reason: OverlayDisabledReason.NonDefaultQueries, - }; + return new Failure(OverlayDisabledReason.NonDefaultQueries); } } - return { enabled: true }; + return new Success(undefined); } /** Checks if the runner has enough disk space for overlay analysis. */ @@ -771,22 +766,19 @@ async function checkRunnerResources( ramInput: string | undefined, logger: Logger, useV2ResourceChecks: boolean, -): Promise< - { sufficient: true } | { sufficient: false; reason: OverlayDisabledReason } -> { +): Promise> { if (!runnerHasSufficientDiskSpace(diskUsage, logger, useV2ResourceChecks)) { - return { - sufficient: false, - reason: OverlayDisabledReason.InsufficientDiskSpace, - }; + return new Failure(OverlayDisabledReason.InsufficientDiskSpace); } if (!(await runnerHasSufficientMemory(codeql, ramInput, logger))) { - return { - sufficient: false, - reason: OverlayDisabledReason.InsufficientMemory, - }; + return new Failure(OverlayDisabledReason.InsufficientMemory); } - return { sufficient: true }; + return new Success(undefined); +} + +interface OverlayParameters { + overlayDatabaseMode: Exclude; + useOverlayDatabaseCaching: boolean; } /** @@ -821,17 +813,7 @@ export async function getOverlayDatabaseMode( repositoryProperties: RepositoryProperties, gitVersion: GitVersionInfo | undefined, logger: Logger, -): Promise<{ - overlayDatabaseMode: OverlayDatabaseMode; - useOverlayDatabaseCaching: boolean; - disabledReason: OverlayDisabledReason | undefined; -}> { - const disabledResult = (reason: OverlayDisabledReason | undefined) => ({ - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, - disabledReason: reason, - }); - +): Promise> { const modeEnv = process.env.CODEQL_OVERLAY_DATABASE_MODE; // Any unrecognized CODEQL_OVERLAY_DATABASE_MODE value will be ignored and // treated as if the environment variable was not set. @@ -845,9 +827,7 @@ export async function getOverlayDatabaseMode( "from the CODEQL_OVERLAY_DATABASE_MODE environment variable.", ); if (modeEnv === OverlayDatabaseMode.None) { - return disabledResult( - OverlayDisabledReason.DisabledByEnvironmentVariable, - ); + return new Failure(OverlayDisabledReason.DisabledByEnvironmentVariable); } return validateOverlayDatabaseMode( modeEnv, @@ -866,7 +846,7 @@ export async function getOverlayDatabaseMode( `Setting overlay database mode to ${OverlayDatabaseMode.None} ` + `because the ${RepositoryPropertyName.DISABLE_OVERLAY} repository property is set to true.`, ); - return disabledResult(OverlayDisabledReason.DisabledByRepositoryProperty); + return new Failure(OverlayDisabledReason.DisabledByRepositoryProperty); } const featureResult = await checkOverlayAnalysisFeatureEnabled( @@ -875,8 +855,8 @@ export async function getOverlayDatabaseMode( languages, codeScanningConfig, ); - if (!featureResult.enabled) { - return disabledResult(featureResult.reason); + if (featureResult.isFailure()) { + return featureResult; } const performResourceChecks = !(await features.getValue( @@ -900,7 +880,7 @@ export async function getOverlayDatabaseMode( logger.warning( `Unable to determine disk usage, therefore setting overlay database mode to ${OverlayDatabaseMode.None}.`, ); - return disabledResult(OverlayDisabledReason.UnableToDetermineDiskUsage); + return new Failure(OverlayDisabledReason.UnableToDetermineDiskUsage); } const resourceResult = performResourceChecks && diskUsage @@ -911,9 +891,9 @@ export async function getOverlayDatabaseMode( logger, useV2ResourceChecks, ) - : { sufficient: true as const }; - if (!resourceResult.sufficient) { - return disabledResult(resourceResult.reason); + : new Success(undefined); + if (resourceResult.isFailure()) { + return resourceResult; } if ( checkOverlayStatus && @@ -925,7 +905,7 @@ export async function getOverlayDatabaseMode( "because overlay analysis previously failed with this combination of languages, " + "disk space, and CodeQL version.", ); - return disabledResult(OverlayDisabledReason.SkippedDueToCachedStatus); + return new Failure(OverlayDisabledReason.SkippedDueToCachedStatus); } let overlayDatabaseMode: OverlayDatabaseMode; @@ -942,7 +922,7 @@ export async function getOverlayDatabaseMode( "with caching because we are analyzing the default branch.", ); } else { - return disabledResult(OverlayDisabledReason.NotPullRequestOrDefaultBranch); + return new Failure(OverlayDisabledReason.NotPullRequestOrDefaultBranch); } return validateOverlayDatabaseMode( @@ -972,17 +952,7 @@ async function validateOverlayDatabaseMode( buildMode: BuildMode | undefined, gitVersion: GitVersionInfo | undefined, logger: Logger, -): Promise<{ - overlayDatabaseMode: OverlayDatabaseMode; - useOverlayDatabaseCaching: boolean; - disabledReason: OverlayDisabledReason | undefined; -}> { - const disabledResult = (reason: OverlayDisabledReason) => ({ - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, - disabledReason: reason, - }); - +): Promise> { if ( buildMode !== BuildMode.None && ( @@ -1003,7 +973,7 @@ async function validateOverlayDatabaseMode( `build-mode is set to "${buildMode}" instead of "none". ` + "Falling back to creating a normal full database instead.", ); - return disabledResult(OverlayDisabledReason.IncompatibleBuildMode); + return new Failure(OverlayDisabledReason.IncompatibleBuildMode); } if (!(await codeQlVersionAtLeast(codeql, CODEQL_OVERLAY_MINIMUM_VERSION))) { logger.warning( @@ -1011,7 +981,7 @@ async function validateOverlayDatabaseMode( `the CodeQL CLI is older than ${CODEQL_OVERLAY_MINIMUM_VERSION}. ` + "Falling back to creating a normal full database instead.", ); - return disabledResult(OverlayDisabledReason.IncompatibleCodeQl); + return new Failure(OverlayDisabledReason.IncompatibleCodeQl); } if ((await getGitRoot(sourceRoot)) === undefined) { logger.warning( @@ -1019,7 +989,7 @@ async function validateOverlayDatabaseMode( `the source root "${sourceRoot}" is not inside a git repository. ` + "Falling back to creating a normal full database instead.", ); - return disabledResult(OverlayDisabledReason.NoGitRoot); + return new Failure(OverlayDisabledReason.NoGitRoot); } if (gitVersion === undefined) { logger.warning( @@ -1027,7 +997,7 @@ async function validateOverlayDatabaseMode( "the Git version could not be determined. " + "Falling back to creating a normal full database instead.", ); - return disabledResult(OverlayDisabledReason.IncompatibleGit); + return new Failure(OverlayDisabledReason.IncompatibleGit); } if (!gitVersion.isAtLeast(GIT_MINIMUM_VERSION_FOR_OVERLAY)) { logger.warning( @@ -1035,14 +1005,13 @@ async function validateOverlayDatabaseMode( `the installed Git version is older than ${GIT_MINIMUM_VERSION_FOR_OVERLAY}. ` + "Falling back to creating a normal full database instead.", ); - return disabledResult(OverlayDisabledReason.IncompatibleGit); + return new Failure(OverlayDisabledReason.IncompatibleGit); } - return { + return new Success({ overlayDatabaseMode, useOverlayDatabaseCaching, - disabledReason: undefined, - }; + }); } function dbLocationOrDefault( @@ -1188,11 +1157,7 @@ export async function initConfig( // and queries, which in turn depends on the user config and the augmentation // properties. So we need to calculate the overlay database mode after the // rest of the config has been populated. - const { - overlayDatabaseMode, - useOverlayDatabaseCaching, - disabledReason: overlayDisabledReason, - } = await getOverlayDatabaseMode( + const overlayDatabaseModeResult = await getOverlayDatabaseMode( inputs.codeql, inputs.features, config.languages, @@ -1204,14 +1169,22 @@ export async function initConfig( gitVersion, logger, ); - logger.info( - `Using overlay database mode: ${overlayDatabaseMode} ` + - `${useOverlayDatabaseCaching ? "with" : "without"} caching.`, - ); - config.overlayDatabaseMode = overlayDatabaseMode; - config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; - - if (overlayDisabledReason !== undefined) { + if (overlayDatabaseModeResult.isSuccess()) { + const { overlayDatabaseMode, useOverlayDatabaseCaching } = + overlayDatabaseModeResult.value; + logger.info( + `Using overlay database mode: ${overlayDatabaseMode} ` + + `${useOverlayDatabaseCaching ? "with" : "without"} caching.`, + ); + config.overlayDatabaseMode = overlayDatabaseMode; + config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; + } else { + const overlayDisabledReason = overlayDatabaseModeResult.value; + logger.info( + `Using overlay database mode: ${OverlayDatabaseMode.None} without caching.`, + ); + config.overlayDatabaseMode = OverlayDatabaseMode.None; + config.useOverlayDatabaseCaching = false; await addOverlayDisablementDiagnostics( config, inputs.codeql, @@ -1220,7 +1193,7 @@ export async function initConfig( } if ( - overlayDatabaseMode === OverlayDatabaseMode.Overlay || + config.overlayDatabaseMode === OverlayDatabaseMode.Overlay || (await shouldPerformDiffInformedAnalysis( inputs.codeql, inputs.features,