Compare commits

..

1 Commits

Author SHA1 Message Date
Henry Mercer 948a63aed1 Add FF to force JGit-based Git backend 2026-06-01 15:20:13 +01:00
9 changed files with 67 additions and 118 deletions
-4
View File
@@ -6,10 +6,6 @@ See the [releases page](https://github.com/github/codeql-action/releases) for th
No user facing changes. No user facing changes.
## 4.36.1 - 02 Jun 2026
No user facing changes.
## 4.36.0 - 22 May 2026 ## 4.36.0 - 22 May 2026
- _Breaking change_: Bump the minimum required CodeQL bundle version to 2.19.4. [#3894](https://github.com/github/codeql-action/pull/3894) - _Breaking change_: Bump the minimum required CodeQL bundle version to 2.19.4. [#3894](https://github.com/github/codeql-action/pull/3894)
+13 -14
View File
@@ -148366,7 +148366,7 @@ function getDiffRangesJsonFilePath() {
return path2.join(getTemporaryDirectory(), PR_DIFF_RANGE_JSON_FILENAME); return path2.join(getTemporaryDirectory(), PR_DIFF_RANGE_JSON_FILENAME);
} }
function getActionVersion() { function getActionVersion() {
return "4.36.2"; return "4.36.1";
} }
function getWorkflowEventName() { function getWorkflowEventName() {
return getRequiredEnvParam("GITHUB_EVENT_NAME"); return getRequiredEnvParam("GITHUB_EVENT_NAME");
@@ -149396,6 +149396,11 @@ var featureConfig = {
legacyApi: true, legacyApi: true,
minimumVersion: void 0 minimumVersion: void 0
}, },
["force_jgit" /* ForceJGit */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_FORCE_JGIT",
minimumVersion: void 0
},
["force_nightly" /* ForceNightly */]: { ["force_nightly" /* ForceNightly */]: {
defaultValue: false, defaultValue: false,
envVar: "CODEQL_ACTION_FORCE_NIGHTLY", envVar: "CODEQL_ACTION_FORCE_NIGHTLY",
@@ -151711,7 +151716,6 @@ async function initActionState({
extraQueryExclusions: [], extraQueryExclusions: [],
overlayDatabaseMode: "none" /* None */, overlayDatabaseMode: "none" /* None */,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: false,
repositoryProperties, repositoryProperties,
enableFileCoverageInformation enableFileCoverageInformation
}; };
@@ -151840,7 +151844,6 @@ async function checkOverlayEnablement(codeql, features, languages, sourceRoot, b
return validateOverlayDatabaseMode( return validateOverlayDatabaseMode(
modeEnv, modeEnv,
false, false,
true,
codeql, codeql,
languages, languages,
sourceRoot, sourceRoot,
@@ -151915,7 +151918,6 @@ async function checkOverlayEnablement(codeql, features, languages, sourceRoot, b
return validateOverlayDatabaseMode( return validateOverlayDatabaseMode(
overlayDatabaseMode, overlayDatabaseMode,
true, true,
false,
codeql, codeql,
languages, languages,
sourceRoot, sourceRoot,
@@ -151924,7 +151926,7 @@ async function checkOverlayEnablement(codeql, features, languages, sourceRoot, b
logger logger
); );
} }
async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDatabaseCaching, overlayModeSetExplicitly, codeql, languages, sourceRoot, buildMode, gitVersion, logger) { async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDatabaseCaching, codeql, languages, sourceRoot, buildMode, gitVersion, logger) {
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
@@ -151968,8 +151970,7 @@ async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDataba
} }
return new Success({ return new Success({
overlayDatabaseMode, overlayDatabaseMode,
useOverlayDatabaseCaching, useOverlayDatabaseCaching
overlayModeSetExplicitly
}); });
} }
async function isTrapCachingEnabled(features, overlayDatabaseMode) { async function isTrapCachingEnabled(features, overlayDatabaseMode) {
@@ -152007,7 +152008,7 @@ function hasQueryCustomisation(userConfig) {
return isDefined2(userConfig["disable-default-queries"]) || isDefined2(userConfig.queries) || isDefined2(userConfig["query-filters"]); return isDefined2(userConfig["disable-default-queries"]) || isDefined2(userConfig.queries) || isDefined2(userConfig["query-filters"]);
} }
async function applyIncrementalAnalysisSettings(config, hasDiffRanges, codeql, logger) { async function applyIncrementalAnalysisSettings(config, hasDiffRanges, codeql, logger) {
if (config.overlayDatabaseMode === "overlay" /* Overlay */ && !hasDiffRanges && !config.overlayModeSetExplicitly) { if (config.overlayDatabaseMode === "overlay" /* Overlay */ && !hasDiffRanges) {
logger.info( logger.info(
`Reverting overlay database mode to ${"none" /* None */} because the PR diff ranges could not be computed.` `Reverting overlay database mode to ${"none" /* None */} because the PR diff ranges could not be computed.`
); );
@@ -152115,17 +152116,12 @@ async function initConfig(features, inputs) {
logger logger
); );
if (overlayDatabaseModeResult.isSuccess()) { if (overlayDatabaseModeResult.isSuccess()) {
const { const { overlayDatabaseMode, useOverlayDatabaseCaching } = overlayDatabaseModeResult.value;
overlayDatabaseMode,
useOverlayDatabaseCaching,
overlayModeSetExplicitly
} = overlayDatabaseModeResult.value;
logger.info( logger.info(
`Using overlay database mode: ${overlayDatabaseMode} ${useOverlayDatabaseCaching ? "with" : "without"} caching.` `Using overlay database mode: ${overlayDatabaseMode} ${useOverlayDatabaseCaching ? "with" : "without"} caching.`
); );
config.overlayDatabaseMode = overlayDatabaseMode; config.overlayDatabaseMode = overlayDatabaseMode;
config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; config.useOverlayDatabaseCaching = useOverlayDatabaseCaching;
config.overlayModeSetExplicitly = overlayModeSetExplicitly;
} else { } else {
const overlayDisabledReason = overlayDatabaseModeResult.value; const overlayDisabledReason = overlayDatabaseModeResult.value;
logger.info( logger.info(
@@ -159357,6 +159353,9 @@ exec ${goBinaryPath} "$@"`
if (await features.getValue("disable_kotlin_analysis_enabled" /* DisableKotlinAnalysisEnabled */)) { if (await features.getValue("disable_kotlin_analysis_enabled" /* DisableKotlinAnalysisEnabled */)) {
core21.exportVariable("CODEQL_EXTRACTOR_JAVA_AGENT_DISABLE_KOTLIN", "true"); core21.exportVariable("CODEQL_EXTRACTOR_JAVA_AGENT_DISABLE_KOTLIN", "true");
} }
if (await features.getValue("force_jgit" /* ForceJGit */)) {
core21.exportVariable("CODEQL_GIT_BACKEND", "jgit");
}
const kotlinLimitVar = "CODEQL_EXTRACTOR_KOTLIN_OVERRIDE_MAXIMUM_VERSION_LIMIT"; const kotlinLimitVar = "CODEQL_EXTRACTOR_KOTLIN_OVERRIDE_MAXIMUM_VERSION_LIMIT";
if (await codeQlVersionAtLeast(codeql, "2.20.3") && !await codeQlVersionAtLeast(codeql, "2.20.4")) { if (await codeQlVersionAtLeast(codeql, "2.20.3") && !await codeQlVersionAtLeast(codeql, "2.20.4")) {
core21.exportVariable(kotlinLimitVar, "2.1.20"); core21.exportVariable(kotlinLimitVar, "2.1.20");
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "codeql", "name": "codeql",
"version": "4.36.2", "version": "4.36.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "codeql", "name": "codeql",
"version": "4.36.2", "version": "4.36.1",
"license": "MIT", "license": "MIT",
"workspaces": [ "workspaces": [
"pr-checks" "pr-checks"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "codeql", "name": "codeql",
"version": "4.36.2", "version": "4.36.1",
"private": true, "private": true,
"description": "CodeQL action", "description": "CodeQL action",
"scripts": { "scripts": {
+26 -70
View File
@@ -1044,7 +1044,6 @@ const checkOverlayEnablementMacro = makeMacro({
| { | {
overlayDatabaseMode: OverlayDatabaseMode; overlayDatabaseMode: OverlayDatabaseMode;
useOverlayDatabaseCaching: boolean; useOverlayDatabaseCaching: boolean;
overlayModeSetExplicitly?: boolean;
} }
| { | {
disabledReason: OverlayDisabledReason; disabledReason: OverlayDisabledReason;
@@ -1125,13 +1124,7 @@ const checkOverlayEnablementMacro = makeMacro({
if ("disabledReason" in expected) { if ("disabledReason" in expected) {
t.deepEqual(result, new Failure(expected.disabledReason)); t.deepEqual(result, new Failure(expected.disabledReason));
} else { } else {
t.deepEqual( t.deepEqual(result, new Success(expected));
result,
new Success({
overlayModeSetExplicitly: false,
...expected,
}),
);
} }
} finally { } finally {
// Restore the original environment // Restore the original environment
@@ -1150,7 +1143,6 @@ checkOverlayEnablementMacro.serial(
{ {
overlayDatabaseMode: OverlayDatabaseMode.Overlay, overlayDatabaseMode: OverlayDatabaseMode.Overlay,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: true,
}, },
); );
@@ -1162,7 +1154,6 @@ checkOverlayEnablementMacro.serial(
{ {
overlayDatabaseMode: OverlayDatabaseMode.OverlayBase, overlayDatabaseMode: OverlayDatabaseMode.OverlayBase,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: true,
}, },
); );
@@ -1821,7 +1812,6 @@ checkOverlayEnablementMacro.serial(
{ {
overlayDatabaseMode: OverlayDatabaseMode.Overlay, overlayDatabaseMode: OverlayDatabaseMode.Overlay,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: true,
}, },
); );
@@ -1834,7 +1824,6 @@ checkOverlayEnablementMacro.serial(
{ {
overlayDatabaseMode: OverlayDatabaseMode.Overlay, overlayDatabaseMode: OverlayDatabaseMode.Overlay,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: true,
}, },
); );
@@ -1931,7 +1920,6 @@ checkOverlayEnablementMacro.serial(
{ {
overlayDatabaseMode: OverlayDatabaseMode.Overlay, overlayDatabaseMode: OverlayDatabaseMode.Overlay,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: true,
}, },
); );
@@ -1977,7 +1965,6 @@ checkOverlayEnablementMacro.serial(
{ {
overlayDatabaseMode: OverlayDatabaseMode.Overlay, overlayDatabaseMode: OverlayDatabaseMode.Overlay,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: true,
}, },
); );
@@ -2195,64 +2182,33 @@ test("applyIncrementalAnalysisSettings: keeps overlay mode and adds exclusions w
]); ]);
}); });
test.serial( test("applyIncrementalAnalysisSettings: disables overlay analysis when diff ranges are unavailable", async (t) => {
"applyIncrementalAnalysisSettings: disables overlay analysis when diff ranges are unavailable", const config = createTestConfig({
async (t) => { overlayDatabaseMode: OverlayDatabaseMode.Overlay,
const config = createTestConfig({ });
overlayDatabaseMode: OverlayDatabaseMode.Overlay, config.useOverlayDatabaseCaching = true;
}); const codeql = createStubCodeQL({});
config.useOverlayDatabaseCaching = true; const logger = getRunnerLogger(true);
const codeql = createStubCodeQL({}); const addDiagnosticsStub = sinon
const logger = getRunnerLogger(true); .stub(overlayDiagnostics, "addOverlayDisablementDiagnostics")
const addDiagnosticsStub = sinon .resolves();
.stub(overlayDiagnostics, "addOverlayDisablementDiagnostics")
.resolves();
await configUtils.applyIncrementalAnalysisSettings( await configUtils.applyIncrementalAnalysisSettings(
config, config,
false, false,
codeql, codeql,
logger, logger,
); );
t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None); t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
t.is(config.useOverlayDatabaseCaching, false); t.is(config.useOverlayDatabaseCaching, false);
t.deepEqual(config.extraQueryExclusions, []); t.deepEqual(config.extraQueryExclusions, []);
t.true(addDiagnosticsStub.calledOnce); t.true(addDiagnosticsStub.calledOnce);
t.is( t.is(
addDiagnosticsStub.firstCall.args[2], addDiagnosticsStub.firstCall.args[2],
OverlayDisabledReason.DiffInformedAnalysisNotEnabled, OverlayDisabledReason.DiffInformedAnalysisNotEnabled,
); );
}, });
);
test.serial(
"applyIncrementalAnalysisSettings: keeps overlay mode when set explicitly and diff ranges are unavailable",
async (t) => {
const config = createTestConfig({
overlayDatabaseMode: OverlayDatabaseMode.Overlay,
});
config.useOverlayDatabaseCaching = false;
config.overlayModeSetExplicitly = true;
const codeql = createStubCodeQL({});
const logger = getRunnerLogger(true);
const addDiagnosticsStub = sinon
.stub(overlayDiagnostics, "addOverlayDisablementDiagnostics")
.resolves();
await configUtils.applyIncrementalAnalysisSettings(
config,
false,
codeql,
logger,
);
t.is(config.overlayDatabaseMode, OverlayDatabaseMode.Overlay);
t.is(config.useOverlayDatabaseCaching, false);
t.deepEqual(config.extraQueryExclusions, []);
t.true(addDiagnosticsStub.notCalled);
},
);
test("applyIncrementalAnalysisSettings: adds exclusions for diff-informed-only runs", async (t) => { test("applyIncrementalAnalysisSettings: adds exclusions for diff-informed-only runs", async (t) => {
const config = createTestConfig({}); const config = createTestConfig({});
+10 -26
View File
@@ -243,11 +243,6 @@ export interface Config {
*/ */
useOverlayDatabaseCaching: boolean; useOverlayDatabaseCaching: boolean;
/**
* Whether the overlay database mode was set explicitly.
*/
overlayModeSetExplicitly: boolean;
/** /**
* A partial mapping from repository properties that affect us to their values. * A partial mapping from repository properties that affect us to their values.
*/ */
@@ -578,7 +573,6 @@ export async function initActionState(
extraQueryExclusions: [], extraQueryExclusions: [],
overlayDatabaseMode: OverlayDatabaseMode.None, overlayDatabaseMode: OverlayDatabaseMode.None,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: false,
repositoryProperties, repositoryProperties,
enableFileCoverageInformation, enableFileCoverageInformation,
}; };
@@ -778,7 +772,6 @@ async function checkRunnerResources(
interface EnabledOverlayConfig { interface EnabledOverlayConfig {
overlayDatabaseMode: Exclude<OverlayDatabaseMode, OverlayDatabaseMode.None>; overlayDatabaseMode: Exclude<OverlayDatabaseMode, OverlayDatabaseMode.None>;
useOverlayDatabaseCaching: boolean; useOverlayDatabaseCaching: boolean;
overlayModeSetExplicitly: boolean;
} }
/** /**
@@ -833,7 +826,6 @@ export async function checkOverlayEnablement(
return validateOverlayDatabaseMode( return validateOverlayDatabaseMode(
modeEnv, modeEnv,
false, false,
true,
codeql, codeql,
languages, languages,
sourceRoot, sourceRoot,
@@ -925,7 +917,6 @@ export async function checkOverlayEnablement(
return validateOverlayDatabaseMode( return validateOverlayDatabaseMode(
overlayDatabaseMode, overlayDatabaseMode,
true, true,
false,
codeql, codeql,
languages, languages,
sourceRoot, sourceRoot,
@@ -944,7 +935,6 @@ export async function checkOverlayEnablement(
async function validateOverlayDatabaseMode( async function validateOverlayDatabaseMode(
overlayDatabaseMode: Exclude<OverlayDatabaseMode, OverlayDatabaseMode.None>, overlayDatabaseMode: Exclude<OverlayDatabaseMode, OverlayDatabaseMode.None>,
useOverlayDatabaseCaching: boolean, useOverlayDatabaseCaching: boolean,
overlayModeSetExplicitly: boolean,
codeql: CodeQL, codeql: CodeQL,
languages: Language[], languages: Language[],
sourceRoot: string, sourceRoot: string,
@@ -1016,7 +1006,6 @@ async function validateOverlayDatabaseMode(
return new Success({ return new Success({
overlayDatabaseMode, overlayDatabaseMode,
useOverlayDatabaseCaching, useOverlayDatabaseCaching,
overlayModeSetExplicitly,
}); });
} }
@@ -1091,14 +1080,14 @@ function hasQueryCustomisation(userConfig: UserConfig): boolean {
/** /**
* Finalize the incremental-analysis configuration for this run. * Finalize the incremental-analysis configuration for this run.
* *
* Overlay analysis has only been validated in combination with diff-informed analysis, so if * Overlay analysis has only been validated in combination with diff-informed
* `Overlay` mode was selected for a pull request but the diff ranges could not be computed, fall * analysis, so if `Overlay` mode was selected for a pull request but the diff
* back to a full non-overlay analysis. If the overlay mode was set explicitly, this fallback does * ranges could not be computed, fall back to a full non-overlay analysis.
* not apply.
* *
* Query exclusions for incremental-only queries are then applied whenever the diff ranges are * Query exclusions for incremental-only queries are then applied whenever the
* available — which, after the fallback above, is exactly the set of runs where any kind of * diff ranges are available — which, after the fallback above, is exactly the
* incremental analysis (overlay or diff-informed) is in effect. * set of runs where any kind of incremental analysis (overlay or
* diff-informed) is in effect.
*/ */
export async function applyIncrementalAnalysisSettings( export async function applyIncrementalAnalysisSettings(
config: Config, config: Config,
@@ -1108,8 +1097,7 @@ export async function applyIncrementalAnalysisSettings(
): Promise<void> { ): Promise<void> {
if ( if (
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay && config.overlayDatabaseMode === OverlayDatabaseMode.Overlay &&
!hasDiffRanges && !hasDiffRanges
!config.overlayModeSetExplicitly
) { ) {
logger.info( logger.info(
`Reverting overlay database mode to ${OverlayDatabaseMode.None} ` + `Reverting overlay database mode to ${OverlayDatabaseMode.None} ` +
@@ -1263,18 +1251,14 @@ export async function initConfig(
logger, logger,
); );
if (overlayDatabaseModeResult.isSuccess()) { if (overlayDatabaseModeResult.isSuccess()) {
const { const { overlayDatabaseMode, useOverlayDatabaseCaching } =
overlayDatabaseMode, overlayDatabaseModeResult.value;
useOverlayDatabaseCaching,
overlayModeSetExplicitly,
} = overlayDatabaseModeResult.value;
logger.info( logger.info(
`Using overlay database mode: ${overlayDatabaseMode} ` + `Using overlay database mode: ${overlayDatabaseMode} ` +
`${useOverlayDatabaseCaching ? "with" : "without"} caching.`, `${useOverlayDatabaseCaching ? "with" : "without"} caching.`,
); );
config.overlayDatabaseMode = overlayDatabaseMode; config.overlayDatabaseMode = overlayDatabaseMode;
config.useOverlayDatabaseCaching = useOverlayDatabaseCaching; config.useOverlayDatabaseCaching = useOverlayDatabaseCaching;
config.overlayModeSetExplicitly = overlayModeSetExplicitly;
} else { } else {
const overlayDisabledReason = overlayDatabaseModeResult.value; const overlayDisabledReason = overlayDatabaseModeResult.value;
logger.info( logger.info(
+10
View File
@@ -82,6 +82,11 @@ export enum Feature {
DisableJavaBuildlessEnabled = "disable_java_buildless_enabled", DisableJavaBuildlessEnabled = "disable_java_buildless_enabled",
DisableKotlinAnalysisEnabled = "disable_kotlin_analysis_enabled", DisableKotlinAnalysisEnabled = "disable_kotlin_analysis_enabled",
ExportDiagnosticsEnabled = "export_diagnostics_enabled", ExportDiagnosticsEnabled = "export_diagnostics_enabled",
/**
* Emergency override that forces the CodeQL CLI to use the JGit-based Git backend instead of its
* default backend selection.
*/
ForceJGit = "force_jgit",
ForceNightly = "force_nightly", ForceNightly = "force_nightly",
IgnoreGeneratedFiles = "ignore_generated_files", IgnoreGeneratedFiles = "ignore_generated_files",
JavaNetworkDebugging = "java_network_debugging", JavaNetworkDebugging = "java_network_debugging",
@@ -224,6 +229,11 @@ export const featureConfig = {
legacyApi: true, legacyApi: true,
minimumVersion: undefined, minimumVersion: undefined,
}, },
[Feature.ForceJGit]: {
defaultValue: false,
envVar: "CODEQL_ACTION_FORCE_JGIT",
minimumVersion: undefined,
},
[Feature.ForceNightly]: { [Feature.ForceNightly]: {
defaultValue: false, defaultValue: false,
envVar: "CODEQL_ACTION_FORCE_NIGHTLY", envVar: "CODEQL_ACTION_FORCE_NIGHTLY",
+5
View File
@@ -614,6 +614,11 @@ async function run(startedAt: Date) {
core.exportVariable("CODEQL_EXTRACTOR_JAVA_AGENT_DISABLE_KOTLIN", "true"); core.exportVariable("CODEQL_EXTRACTOR_JAVA_AGENT_DISABLE_KOTLIN", "true");
} }
// Emergency override to force the CodeQL CLI back to the JGit-based Git backend.
if (await features.getValue(Feature.ForceJGit)) {
core.exportVariable("CODEQL_GIT_BACKEND", "jgit");
}
const kotlinLimitVar = const kotlinLimitVar =
"CODEQL_EXTRACTOR_KOTLIN_OVERRIDE_MAXIMUM_VERSION_LIMIT"; "CODEQL_EXTRACTOR_KOTLIN_OVERRIDE_MAXIMUM_VERSION_LIMIT";
if ( if (
-1
View File
@@ -585,7 +585,6 @@ export function createTestConfig(overrides: Partial<Config>): Config {
extraQueryExclusions: [], extraQueryExclusions: [],
overlayDatabaseMode: OverlayDatabaseMode.None, overlayDatabaseMode: OverlayDatabaseMode.None,
useOverlayDatabaseCaching: false, useOverlayDatabaseCaching: false,
overlayModeSetExplicitly: false,
repositoryProperties: {}, repositoryProperties: {},
enableFileCoverageInformation: true, enableFileCoverageInformation: true,
} satisfies Config, } satisfies Config,