Use Results for enablement return types

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