diff --git a/lib/analyze-action-post.js b/lib/analyze-action-post.js index 99d289f8f0..c2fcd9c1bc 100644 --- a/lib/analyze-action-post.js +++ b/lib/analyze-action-post.js @@ -117921,15 +117921,6 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -117973,38 +117964,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -118012,7 +117975,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -118134,7 +118097,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -118548,9 +118511,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` diff --git a/lib/analyze-action.js b/lib/analyze-action.js index 29aef44a7a..f8ba08884a 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -90863,14 +90863,14 @@ function checkOverlayBaseDatabase(config, logger, warningPrefix) { return true; } async function uploadOverlayBaseDatabaseToCache(codeql, config, logger) { - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode !== "overlay-base" /* OverlayBase */) { logger.debug( `Overlay database mode is ${overlayDatabaseMode}. Skip uploading overlay-base database to cache.` ); return false; } - if (!config.augmentationProperties.useOverlayDatabaseCaching) { + if (!config.useOverlayDatabaseCaching) { logger.debug( "Overlay database caching is disabled. Skip uploading overlay-base database to cache." ); @@ -91542,15 +91542,6 @@ async function cachePrefix(codeql, language) { } // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -91594,38 +91585,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -91633,7 +91596,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -92646,7 +92609,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -93060,9 +93023,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` @@ -93603,7 +93566,7 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag, const statusReport = {}; const queryFlags = [memoryFlag, threadsFlag]; const incrementalMode = []; - if (config.augmentationProperties.overlayDatabaseMode !== "overlay-base" /* OverlayBase */) { + if (config.overlayDatabaseMode !== "overlay-base" /* OverlayBase */) { queryFlags.push("--expect-discarded-cache"); } statusReport.analysis_is_diff_informed = diffRangePackDir !== void 0; @@ -93612,9 +93575,9 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag, queryFlags.push("--extension-packs=codeql-action/pr-diff-range"); incrementalMode.push("diff-informed"); } - statusReport.analysis_is_overlay = config.augmentationProperties.overlayDatabaseMode === "overlay" /* Overlay */; - statusReport.analysis_builds_overlay_base_database = config.augmentationProperties.overlayDatabaseMode === "overlay-base" /* OverlayBase */; - if (config.augmentationProperties.overlayDatabaseMode === "overlay" /* Overlay */) { + statusReport.analysis_is_overlay = config.overlayDatabaseMode === "overlay" /* Overlay */; + statusReport.analysis_builds_overlay_base_database = config.overlayDatabaseMode === "overlay-base" /* OverlayBase */; + if (config.overlayDatabaseMode === "overlay" /* Overlay */) { incrementalMode.push("overlay"); } const sarifRunPropertyFlag = incrementalMode.length > 0 ? `--sarif-run-property=incrementalMode=${incrementalMode.join(",")}` : void 0; diff --git a/lib/autobuild-action.js b/lib/autobuild-action.js index ca18e315a4..c2d8f0d0ea 100644 --- a/lib/autobuild-action.js +++ b/lib/autobuild-action.js @@ -78923,15 +78923,6 @@ var GitHubFeatureFlags = class { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -78975,38 +78966,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -79014,7 +78977,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -79169,7 +79132,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -79583,9 +79546,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` diff --git a/lib/init-action-post.js b/lib/init-action-post.js index 1995591edc..f4117f9ada 100644 --- a/lib/init-action-post.js +++ b/lib/init-action-post.js @@ -129520,15 +129520,6 @@ ${jsonContents}` var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -129572,38 +129563,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -129611,7 +129574,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -130588,7 +130551,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -131002,9 +130965,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` diff --git a/lib/init-action.js b/lib/init-action.js index 2edef19804..bedab733cf 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -86458,14 +86458,14 @@ function checkOverlayBaseDatabase(config, logger, warningPrefix) { return true; } async function downloadOverlayBaseDatabaseFromCache(codeql, config, logger) { - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode !== "overlay" /* Overlay */) { logger.debug( `Overlay database mode is ${overlayDatabaseMode}. Skip downloading overlay-base database from cache.` ); return void 0; } - if (!config.augmentationProperties.useOverlayDatabaseCaching) { + if (!config.useOverlayDatabaseCaching) { logger.debug( "Overlay database caching is disabled. Skip downloading overlay-base database from cache." ); @@ -87116,15 +87116,6 @@ async function cachePrefix(codeql, language) { // src/config-utils.ts var PACKS_PROPERTY = "packs"; -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; function getPacksStrInvalid(packStr, configFile) { return configFile ? getConfigFilePropertyError( configFile, @@ -87301,6 +87292,7 @@ async function getDefaultConfig({ languages, buildMode, originalUserInput: {}, + computedConfig: {}, tempDir, codeQLCmd: codeql.getPath(), gitHubVersion: githubVersion, @@ -87311,7 +87303,10 @@ async function getDefaultConfig({ augmentationProperties, trapCaches, trapCacheDownloadTime, - dependencyCachingEnabled: getCachingKind(dependencyCachingEnabled) + dependencyCachingEnabled: getCachingKind(dependencyCachingEnabled), + extraQueryExclusions: [], + overlayDatabaseMode: "none" /* None */, + useOverlayDatabaseCaching: false }; } async function downloadCacheWithTime(trapCachingEnabled, codeQL, languages, logger) { @@ -87355,10 +87350,7 @@ async function calculateAugmentation(rawPacksInput, rawQueriesInput, languages) packsInputCombines, packsInput: packsInput?.[languages[0]], queriesInput, - queriesInputCombines, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false + queriesInputCombines }; } function parseQueriesFromInput(rawQueriesInput, queriesInputCombines) { @@ -87610,8 +87602,11 @@ async function initConfig(inputs) { ); } const config = await getDefaultConfig(inputs); - const augmentationProperties = config.augmentationProperties; config.originalUserInput = userConfig; + config.computedConfig = generateCodeScanningConfig( + userConfig, + config.augmentationProperties + ); const { overlayDatabaseMode, useOverlayDatabaseCaching } = await getOverlayDatabaseMode( inputs.codeql, inputs.repository, @@ -87619,20 +87614,20 @@ async function initConfig(inputs) { config.languages, inputs.sourceRoot, config.buildMode, - generateCodeScanningConfig(userConfig, augmentationProperties), + config.computedConfig, logger ); logger.info( `Using overlay database mode: ${overlayDatabaseMode} ${useOverlayDatabaseCaching ? "with" : "without"} caching.` ); - augmentationProperties.overlayDatabaseMode = overlayDatabaseMode; - augmentationProperties.useOverlayDatabaseCaching = useOverlayDatabaseCaching; + config.overlayDatabaseMode = overlayDatabaseMode; + config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; if (overlayDatabaseMode === "overlay" /* Overlay */ || await shouldPerformDiffInformedAnalysis( inputs.codeql, inputs.features, logger )) { - augmentationProperties.extraQueryExclusions.push({ + config.extraQueryExclusions.push({ exclude: { tags: "exclude-from-incremental" } }); } @@ -87825,13 +87820,20 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { delete augmentedConfig.packs; } + return augmentedConfig; +} +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; + } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly // excludes all queries that are not included. If it is an exclusion, // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -89192,7 +89194,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -89606,9 +89608,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` @@ -90391,20 +90393,20 @@ async function run() { } let overlayBaseDatabaseStats; try { - if (config.augmentationProperties.overlayDatabaseMode === "overlay" /* Overlay */ && config.augmentationProperties.useOverlayDatabaseCaching) { + if (config.overlayDatabaseMode === "overlay" /* Overlay */ && config.useOverlayDatabaseCaching) { overlayBaseDatabaseStats = await downloadOverlayBaseDatabaseFromCache( codeql, config, logger ); if (!overlayBaseDatabaseStats) { - config.augmentationProperties.overlayDatabaseMode = "none" /* None */; + config.overlayDatabaseMode = "none" /* None */; logger.info( `No overlay-base database found in cache, reverting overlay database mode to ${"none" /* None */}.` ); } } - if (config.augmentationProperties.overlayDatabaseMode !== "overlay" /* Overlay */) { + if (config.overlayDatabaseMode !== "overlay" /* Overlay */) { cleanupDatabaseClusterDirectory(config, logger); } if (zstdAvailability) { @@ -90581,11 +90583,11 @@ exec ${goBinaryPath} "$@"` qlconfigFile, logger ); - if (config.augmentationProperties.overlayDatabaseMode !== "none" /* None */ && !await checkPacksForOverlayCompatibility(codeql, config, logger)) { + if (config.overlayDatabaseMode !== "none" /* None */ && !await checkPacksForOverlayCompatibility(codeql, config, logger)) { logger.info( "Reverting overlay database mode to None due to incompatible packs." ); - config.augmentationProperties.overlayDatabaseMode = "none" /* None */; + config.overlayDatabaseMode = "none" /* None */; cleanupDatabaseClusterDirectory(config, logger, { disableExistingDirectoryWarning: true }); diff --git a/lib/resolve-environment-action.js b/lib/resolve-environment-action.js index 7c46b8092b..11761c618f 100644 --- a/lib/resolve-environment-action.js +++ b/lib/resolve-environment-action.js @@ -78650,15 +78650,6 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -78702,38 +78693,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -78741,7 +78704,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -78869,7 +78832,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -79283,9 +79246,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` diff --git a/lib/start-proxy-action-post.js b/lib/start-proxy-action-post.js index c9317c4cd2..a203807e9c 100644 --- a/lib/start-proxy-action-post.js +++ b/lib/start-proxy-action-post.js @@ -117330,15 +117330,6 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/upload-lib.js b/lib/upload-lib.js index 825744e8d4..ff2f43e49f 100644 --- a/lib/upload-lib.js +++ b/lib/upload-lib.js @@ -89367,15 +89367,6 @@ ${jsonContents}` var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -89419,38 +89410,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -89458,7 +89421,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -90435,7 +90398,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -90849,9 +90812,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` diff --git a/lib/upload-sarif-action-post.js b/lib/upload-sarif-action-post.js index 4e569eb512..cb13fd3c6c 100644 --- a/lib/upload-sarif-action-post.js +++ b/lib/upload-sarif-action-post.js @@ -117495,15 +117495,6 @@ var featureConfig = { var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, diff --git a/lib/upload-sarif-action.js b/lib/upload-sarif-action.js index e785cef377..a1ba491b14 100644 --- a/lib/upload-sarif-action.js +++ b/lib/upload-sarif-action.js @@ -90047,15 +90047,6 @@ ${jsonContents}` var actionsCache2 = __toESM(require_cache3()); // src/config-utils.ts -var defaultAugmentationProperties = { - queriesInputCombines: false, - packsInputCombines: false, - packsInput: void 0, - queriesInput: void 0, - extraQueryExclusions: [], - overlayDatabaseMode: "none" /* None */, - useOverlayDatabaseCaching: false -}; var OVERLAY_ANALYSIS_FEATURES = { actions: "overlay_analysis_actions" /* OverlayAnalysisActions */, cpp: "overlay_analysis_cpp" /* OverlayAnalysisCpp */, @@ -90099,38 +90090,10 @@ async function getConfig(tempDir, logger) { logger.debug(configString); return JSON.parse(configString); } -function generateCodeScanningConfig(originalUserInput, augmentationProperties) { - const augmentedConfig = cloneObject(originalUserInput); - if (augmentationProperties.queriesInput) { - if (augmentationProperties.queriesInputCombines) { - augmentedConfig.queries = (augmentedConfig.queries || []).concat( - augmentationProperties.queriesInput - ); - } else { - augmentedConfig.queries = augmentationProperties.queriesInput; - } - } - if (augmentedConfig.queries?.length === 0) { - delete augmentedConfig.queries; - } - if (augmentationProperties.packsInput) { - if (augmentationProperties.packsInputCombines) { - if (Array.isArray(augmentedConfig.packs)) { - augmentedConfig.packs = (augmentedConfig.packs || []).concat( - augmentationProperties.packsInput - ); - } else if (!augmentedConfig.packs) { - augmentedConfig.packs = augmentationProperties.packsInput; - } else { - const language = Object.keys(augmentedConfig.packs)[0]; - augmentedConfig.packs[language] = augmentedConfig.packs[language].concat(augmentationProperties.packsInput); - } - } else { - augmentedConfig.packs = augmentationProperties.packsInput; - } - } - if (Array.isArray(augmentedConfig.packs) && !augmentedConfig.packs.length) { - delete augmentedConfig.packs; +function appendExtraQueryExclusions(extraQueryExclusions, cliConfig) { + const augmentedConfig = cloneObject(cliConfig); + if (extraQueryExclusions.length === 0) { + return augmentedConfig; } augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly @@ -90138,7 +90101,7 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) { // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...augmentedConfig["query-filters"] || [], - ...augmentationProperties.extraQueryExclusions + ...extraQueryExclusions ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; @@ -91115,7 +91078,7 @@ async function getCodeQLForCmd(cmd, checkVersion) { await this.getVersion(), "forceOverwrite" /* ForceOverwrite */ ) ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === "overlay" /* Overlay */) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -91529,9 +91492,9 @@ async function runCli(cmd, args = [], opts = {}) { } async function writeCodeScanningConfigFile(config, logger) { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig ); logger.info( `Writing augmented user configuration file to ${codeScanningConfigFile}` diff --git a/src/analyze.ts b/src/analyze.ts index 19bfcf028f..a8ab5ca91d 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -626,10 +626,7 @@ export async function runQueries( const incrementalMode: string[] = []; // Preserve cached intermediate results for overlay-base databases. - if ( - config.augmentationProperties.overlayDatabaseMode !== - OverlayDatabaseMode.OverlayBase - ) { + if (config.overlayDatabaseMode !== OverlayDatabaseMode.OverlayBase) { queryFlags.push("--expect-discarded-cache"); } @@ -641,15 +638,10 @@ export async function runQueries( } statusReport.analysis_is_overlay = - config.augmentationProperties.overlayDatabaseMode === - OverlayDatabaseMode.Overlay; + config.overlayDatabaseMode === OverlayDatabaseMode.Overlay; statusReport.analysis_builds_overlay_base_database = - config.augmentationProperties.overlayDatabaseMode === - OverlayDatabaseMode.OverlayBase; - if ( - config.augmentationProperties.overlayDatabaseMode === - OverlayDatabaseMode.Overlay - ) { + config.overlayDatabaseMode === OverlayDatabaseMode.OverlayBase; + if (config.overlayDatabaseMode === OverlayDatabaseMode.Overlay) { incrementalMode.push("overlay"); } diff --git a/src/codeql.test.ts b/src/codeql.test.ts index 29e4b27ef3..e6df746c73 100644 --- a/src/codeql.test.ts +++ b/src/codeql.test.ts @@ -18,6 +18,7 @@ import { AugmentationProperties, Config, defaultAugmentationProperties, + generateCodeScanningConfig, } from "./config-utils"; import * as defaults from "./defaults.json"; import { DocUrl } from "./doc-url"; @@ -504,6 +505,10 @@ const injectedConfigMacro = test.macro({ tempDir, augmentationProperties, }; + thisStubConfig.computedConfig = generateCodeScanningConfig( + thisStubConfig.originalUserInput, + thisStubConfig.augmentationProperties, + ); await codeqlObject.databaseInitCluster( thisStubConfig, diff --git a/src/codeql.ts b/src/codeql.ts index 81c8e3decd..567eb80875 100644 --- a/src/codeql.ts +++ b/src/codeql.ts @@ -13,7 +13,7 @@ import { } from "./actions-util"; import * as api from "./api-client"; import { CliError, wrapCliConfigurationError } from "./cli-errors"; -import { generateCodeScanningConfig, type Config } from "./config-utils"; +import { appendExtraQueryExclusions, type Config } from "./config-utils"; import { DocUrl } from "./doc-url"; import { EnvVar } from "./environment"; import { @@ -593,8 +593,7 @@ export async function getCodeQLForCmd( ? "--force-overwrite" : "--overwrite"; - const overlayDatabaseMode = - config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode === OverlayDatabaseMode.Overlay) { const overlayChangesFile = await writeOverlayChangesFile( config, @@ -1150,20 +1149,26 @@ async function runCli( } /** - * Generates a code scanning configuration that is to be used for a scan. + * Writes the code scanning configuration that is to be used by the CLI. * * @param codeql The CodeQL object to use. - * @param config The configuration to use. - * @returns the path to the generated user configuration file. + * @param config The CodeQL Action state to use. + * @returns The path to the generated user configuration file. */ async function writeCodeScanningConfigFile( config: Config, logger: Logger, ): Promise { const codeScanningConfigFile = getGeneratedCodeScanningConfigPath(config); - const augmentedConfig = generateCodeScanningConfig( - config.originalUserInput, - config.augmentationProperties, + + // Apply the `extraQueryExclusions` from the CodeQL Action state to the CLI configuration. + // We do this here at the latest possible point before passing the CLI configuration on to + // the CLI so that the `extraQueryExclusions` appear after all user-configured `query-filters`. + // See the comment in `applyExtraQueryExclusions` for more information, as well as + // https://github.com/github/codeql-action/pull/2938 + const augmentedConfig = appendExtraQueryExclusions( + config.extraQueryExclusions, + config.computedConfig, ); logger.info( diff --git a/src/config-utils.test.ts b/src/config-utils.test.ts index e57cb5f6f4..b133f500bc 100644 --- a/src/config-utils.test.ts +++ b/src/config-utils.test.ts @@ -322,18 +322,21 @@ test("load non-empty input", async (t) => { fs.mkdirSync(path.join(tempDir, "foo")); + const userConfig: configUtils.UserConfig = { + name: "my config", + "disable-default-queries": true, + queries: [{ uses: "./foo" }], + "paths-ignore": ["a", "b"], + paths: ["c/d"], + }; + // And the config we expect it to parse to const expectedConfig: configUtils.Config = { analysisKinds: [AnalysisKind.CodeScanning], languages: [KnownLanguage.javascript], buildMode: BuildMode.None, - originalUserInput: { - name: "my config", - "disable-default-queries": true, - queries: [{ uses: "./foo" }], - "paths-ignore": ["a", "b"], - paths: ["c/d"], - }, + originalUserInput: userConfig, + computedConfig: userConfig, tempDir, codeQLCmd: codeql.getPath(), gitHubVersion: githubVersion, @@ -345,6 +348,9 @@ test("load non-empty input", async (t) => { trapCaches: {}, trapCacheDownloadTime: 0, dependencyCachingEnabled: CachingKind.None, + extraQueryExclusions: [], + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, }; const languagesInput = "javascript"; diff --git a/src/config-utils.ts b/src/config-utils.ts index 477cb20e6c..64a1c93b9d 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -145,8 +145,17 @@ export interface Config { */ debugDatabaseName: string; + /** + * Describes how to augment the user configuration with inputs from the action. + */ augmentationProperties: AugmentationProperties; + /** + * The configuration we computed by combining `originalUserInput` with `augmentationProperties`, + * as well as adjustments made to it based on unsupported or required options. + */ + computedConfig: UserConfig; + /** * Partial map from languages to locations of TRAP caches for that language. * If a key is omitted, then TRAP caching should not be used for that language. @@ -160,6 +169,28 @@ export interface Config { /** A value indicating how dependency caching should be used. */ dependencyCachingEnabled: CachingKind; + + /** + * Extra query exclusions to append to the config. + */ + extraQueryExclusions: ExcludeQueryFilter[]; + + /** + * The overlay database mode to use. + */ + overlayDatabaseMode: OverlayDatabaseMode; + + /** + * Whether to use caching for overlay databases. If it is true, the action + * will upload the created overlay-base database to the actions cache, and + * download an overlay-base database from the actions cache before it creates + * a new overlay database. If it is false, the action assumes that the + * workflow will be responsible for managing database storage and retrieval. + * + * This property has no effect unless `overlayDatabaseMode` is `Overlay` or + * `OverlayBase`. + */ + useOverlayDatabaseCaching: boolean; } /** @@ -192,28 +223,6 @@ export interface AugmentationProperties { * The packs input from the `with` block of the action declaration */ packsInput?: string[]; - - /** - * Extra query exclusions to append to the config. - */ - extraQueryExclusions: ExcludeQueryFilter[]; - - /** - * The overlay database mode to use. - */ - overlayDatabaseMode: OverlayDatabaseMode; - - /** - * Whether to use caching for overlay databases. If it is true, the action - * will upload the created overlay-base database to the actions cache, and - * download an overlay-base database from the actions cache before it creates - * a new overlay database. If it is false, the action assumes that the - * workflow will be responsible for managing database storage and retrieval. - * - * This property has no effect unless `overlayDatabaseMode` is `Overlay` or - * `OverlayBase`. - */ - useOverlayDatabaseCaching: boolean; } /** @@ -225,9 +234,6 @@ export const defaultAugmentationProperties: AugmentationProperties = { packsInputCombines: false, packsInput: undefined, queriesInput: undefined, - extraQueryExclusions: [], - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, }; export type Packs = Partial>; @@ -576,6 +582,7 @@ export async function getDefaultConfig({ languages, buildMode, originalUserInput: {}, + computedConfig: {}, tempDir, codeQLCmd: codeql.getPath(), gitHubVersion: githubVersion, @@ -587,6 +594,9 @@ export async function getDefaultConfig({ trapCaches, trapCacheDownloadTime, dependencyCachingEnabled: getCachingKind(dependencyCachingEnabled), + extraQueryExclusions: [], + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, }; } @@ -673,9 +683,6 @@ export async function calculateAugmentation( packsInput: packsInput?.[languages[0]], queriesInput, queriesInputCombines, - extraQueryExclusions: [], - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, }; } @@ -1098,9 +1105,15 @@ export async function initConfig(inputs: InitConfigInputs): Promise { } const config = await getDefaultConfig(inputs); - const augmentationProperties = config.augmentationProperties; config.originalUserInput = userConfig; + // Compute the full Code Scanning configuration that combines the configuration from the + // configuration file / `config` input with other inputs, such as `queries`. + config.computedConfig = generateCodeScanningConfig( + userConfig, + config.augmentationProperties, + ); + // The choice of overlay database mode depends on the selection of languages // 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 @@ -1113,15 +1126,15 @@ export async function initConfig(inputs: InitConfigInputs): Promise { config.languages, inputs.sourceRoot, config.buildMode, - generateCodeScanningConfig(userConfig, augmentationProperties), + config.computedConfig, logger, ); logger.info( `Using overlay database mode: ${overlayDatabaseMode} ` + `${useOverlayDatabaseCaching ? "with" : "without"} caching.`, ); - augmentationProperties.overlayDatabaseMode = overlayDatabaseMode; - augmentationProperties.useOverlayDatabaseCaching = useOverlayDatabaseCaching; + config.overlayDatabaseMode = overlayDatabaseMode; + config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; if ( overlayDatabaseMode === OverlayDatabaseMode.Overlay || @@ -1131,7 +1144,7 @@ export async function initConfig(inputs: InitConfigInputs): Promise { logger, )) ) { - augmentationProperties.extraQueryExclusions.push({ + config.extraQueryExclusions.push({ exclude: { tags: "exclude-from-incremental" }, }); } @@ -1461,17 +1474,42 @@ export function generateCodeScanningConfig( delete augmentedConfig.packs; } + return augmentedConfig; +} + +/** + * Appends `extraQueryExclusions` to `cliConfig`'s `query-filters`. + * + * @param extraQueryExclusions The extra query exclusions to append to the `query-filters`. + * @param cliConfig The CodeQL CLI configuration to extend. + * @returns Returns `cliConfig` if there are no extra query exclusions + * or a copy of `cliConfig` where the extra query exclusions + * have been appended to `query-filters`. + */ +export function appendExtraQueryExclusions( + extraQueryExclusions: ExcludeQueryFilter[], + cliConfig: UserConfig, +): Readonly { + // make a copy so we can modify it and so that modifications to the input + // object do not affect the result that is marked as `Readonly`. + const augmentedConfig = cloneObject(cliConfig); + + if (extraQueryExclusions.length === 0) { + return augmentedConfig; + } + augmentedConfig["query-filters"] = [ // Ordering matters. If the first filter is an inclusion, it implicitly // excludes all queries that are not included. If it is an exclusion, // it implicitly includes all queries that are not excluded. So user // filters (if any) should always be first to preserve intent. ...(augmentedConfig["query-filters"] || []), - ...augmentationProperties.extraQueryExclusions, + ...extraQueryExclusions, ]; if (augmentedConfig["query-filters"]?.length === 0) { delete augmentedConfig["query-filters"]; } + return augmentedConfig; } diff --git a/src/init-action.ts b/src/init-action.ts index df22fe6a54..35bc83d2df 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -449,9 +449,8 @@ async function run() { let overlayBaseDatabaseStats: OverlayBaseDatabaseDownloadStats | undefined; try { if ( - config.augmentationProperties.overlayDatabaseMode === - OverlayDatabaseMode.Overlay && - config.augmentationProperties.useOverlayDatabaseCaching + config.overlayDatabaseMode === OverlayDatabaseMode.Overlay && + config.useOverlayDatabaseCaching ) { // OverlayDatabaseMode.Overlay comes in two flavors: with database // caching, or without. The flavor with database caching is intended to be @@ -470,8 +469,7 @@ async function run() { logger, ); if (!overlayBaseDatabaseStats) { - config.augmentationProperties.overlayDatabaseMode = - OverlayDatabaseMode.None; + config.overlayDatabaseMode = OverlayDatabaseMode.None; logger.info( "No overlay-base database found in cache, " + `reverting overlay database mode to ${OverlayDatabaseMode.None}.`, @@ -479,10 +477,7 @@ async function run() { } } - if ( - config.augmentationProperties.overlayDatabaseMode !== - OverlayDatabaseMode.Overlay - ) { + if (config.overlayDatabaseMode !== OverlayDatabaseMode.Overlay) { cleanupDatabaseClusterDirectory(config, logger); } @@ -739,15 +734,13 @@ async function run() { // revert to `OverlayDatabaseMode.None`, re-initialize the database cluster // with the new overlay database mode. if ( - config.augmentationProperties.overlayDatabaseMode !== - OverlayDatabaseMode.None && + config.overlayDatabaseMode !== OverlayDatabaseMode.None && !(await checkPacksForOverlayCompatibility(codeql, config, logger)) ) { logger.info( "Reverting overlay database mode to None due to incompatible packs.", ); - config.augmentationProperties.overlayDatabaseMode = - OverlayDatabaseMode.None; + config.overlayDatabaseMode = OverlayDatabaseMode.None; cleanupDatabaseClusterDirectory(config, logger, { disableExistingDirectoryWarning: true, }); diff --git a/src/overlay-database-utils.test.ts b/src/overlay-database-utils.test.ts index fb8a48d447..61fcf48af9 100644 --- a/src/overlay-database-utils.test.ts +++ b/src/overlay-database-utils.test.ts @@ -120,10 +120,8 @@ const testDownloadOverlayBaseDatabaseFromCache = test.macro({ const testCase = { ...defaultDownloadTestCase, ...partialTestCase }; - config.augmentationProperties.overlayDatabaseMode = - testCase.overlayDatabaseMode; - config.augmentationProperties.useOverlayDatabaseCaching = - testCase.useOverlayDatabaseCaching; + config.overlayDatabaseMode = testCase.overlayDatabaseMode; + config.useOverlayDatabaseCaching = testCase.useOverlayDatabaseCaching; if (testCase.hasBaseDatabaseOidsFile) { const baseDatabaseOidsFile = path.join( diff --git a/src/overlay-database-utils.ts b/src/overlay-database-utils.ts index a01546f067..1df46aa785 100644 --- a/src/overlay-database-utils.ts +++ b/src/overlay-database-utils.ts @@ -192,7 +192,7 @@ export async function uploadOverlayBaseDatabaseToCache( config: Config, logger: Logger, ): Promise { - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode !== OverlayDatabaseMode.OverlayBase) { logger.debug( `Overlay database mode is ${overlayDatabaseMode}. ` + @@ -200,7 +200,7 @@ export async function uploadOverlayBaseDatabaseToCache( ); return false; } - if (!config.augmentationProperties.useOverlayDatabaseCaching) { + if (!config.useOverlayDatabaseCaching) { logger.debug( "Overlay database caching is disabled. " + "Skip uploading overlay-base database to cache.", @@ -298,7 +298,7 @@ export async function downloadOverlayBaseDatabaseFromCache( config: Config, logger: Logger, ): Promise { - const overlayDatabaseMode = config.augmentationProperties.overlayDatabaseMode; + const overlayDatabaseMode = config.overlayDatabaseMode; if (overlayDatabaseMode !== OverlayDatabaseMode.Overlay) { logger.debug( `Overlay database mode is ${overlayDatabaseMode}. ` + @@ -306,7 +306,7 @@ export async function downloadOverlayBaseDatabaseFromCache( ); return undefined; } - if (!config.augmentationProperties.useOverlayDatabaseCaching) { + if (!config.useOverlayDatabaseCaching) { logger.debug( "Overlay database caching is disabled. " + "Skip downloading overlay-base database from cache.", diff --git a/src/testing-utils.ts b/src/testing-utils.ts index 624bb72cd5..6e1763b00f 100644 --- a/src/testing-utils.ts +++ b/src/testing-utils.ts @@ -11,7 +11,7 @@ import * as apiClient from "./api-client"; import { GitHubApiDetails } from "./api-client"; import { CachingKind } from "./caching-utils"; import * as codeql from "./codeql"; -import { Config } from "./config-utils"; +import { AugmentationProperties, Config } from "./config-utils"; import * as defaults from "./defaults.json"; import { CodeQLDefaultVersionInfo, @@ -360,6 +360,7 @@ export function createTestConfig(overrides: Partial): Config { languages: [], buildMode: undefined, originalUserInput: {}, + computedConfig: {}, tempDir: "", codeQLCmd: "", gitHubVersion: { @@ -372,13 +373,13 @@ export function createTestConfig(overrides: Partial): Config { augmentationProperties: { packsInputCombines: false, queriesInputCombines: false, - extraQueryExclusions: [], - overlayDatabaseMode: OverlayDatabaseMode.None, - useOverlayDatabaseCaching: false, - }, + } satisfies AugmentationProperties, trapCaches: {}, trapCacheDownloadTime: 0, dependencyCachingEnabled: CachingKind.None, + extraQueryExclusions: [], + overlayDatabaseMode: OverlayDatabaseMode.None, + useOverlayDatabaseCaching: false, } satisfies Config, overrides, );