Compare commits

..

13 Commits

Author SHA1 Message Date
Kasper Svendsen
c43362b91a Merge pull request #3340 from github/kaspersv/check-for-overlayBaseSpecifier
Overlay: Check database metadata for overlayBaseSpecifier
2025-12-09 11:37:30 +01:00
Kasper Svendsen
002a7f25fd Overlay: log overlayBaseSpecifier at debug log-level 2025-12-09 09:44:56 +01:00
Kasper Svendsen
5b7e7fcc9c Update src/codeql.ts
Co-authored-by: Henry Mercer <henrymercer@github.com>
2025-12-09 09:41:33 +01:00
Óscar San José
149d184a51 Merge pull request #3345 from github/mergeback/v4.31.7-to-main-cf1bb45a
Mergeback v4.31.7 refs/heads/releases/v4 into main
2025-12-05 21:43:41 +01:00
github-actions[bot]
97c2630b10 Rebuild 2025-12-05 17:21:46 +00:00
github-actions[bot]
b93926dc35 Update changelog and version after v4.31.7 2025-12-05 17:19:09 +00:00
Óscar San José
cf1bb45a27 Merge pull request #3344 from github/update-v4.31.7-f5c63fadd
Merge main into releases/v4
2025-12-05 18:17:21 +01:00
github-actions[bot]
f4ebe95061 Update changelog for v4.31.7 2025-12-05 15:18:53 +00:00
Óscar San José
f5c63fadd5 Merge pull request #3343 from github/update-bundle/codeql-bundle-v2.23.7
Update default bundle to 2.23.7
2025-12-05 15:06:47 +01:00
github-actions[bot]
a2c01e776e Add changelog note 2025-12-05 13:39:53 +00:00
github-actions[bot]
ac34c13834 Update default bundle to codeql-bundle-v2.23.7 2025-12-05 13:39:45 +00:00
Kasper Svendsen
c4efbda299 Overlay: Check database metadata for overlayBaseSpecifier 2025-12-03 13:40:24 +01:00
Kasper Svendsen
dd8914320f CodeQL: Add resolveDatabase method 2025-12-03 13:40:24 +01:00
20 changed files with 334 additions and 50 deletions

View File

@@ -6,6 +6,10 @@ See the [releases page](https://github.com/github/codeql-action/releases) for th
No user facing changes. No user facing changes.
## 4.31.7 - 05 Dec 2025
- Update default CodeQL bundle version to 2.23.7. [#3343](https://github.com/github/codeql-action/pull/3343)
## 4.31.6 - 01 Dec 2025 ## 4.31.6 - 01 Dec 2025
No user facing changes. No user facing changes.

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -120735,6 +120735,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

45
lib/analyze-action.js generated
View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -88211,8 +88211,8 @@ var path4 = __toESM(require("path"));
var semver4 = __toESM(require_semver2()); var semver4 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs3 = __toESM(require("fs")); var fs3 = __toESM(require("fs"));
@@ -88512,7 +88512,7 @@ function computeChangedFiles(baseFileOids, overlayFileOids) {
var CACHE_VERSION = 1; var CACHE_VERSION = 1;
var CACHE_PREFIX = "codeql-overlay-base-database"; var CACHE_PREFIX = "codeql-overlay-base-database";
var MAX_CACHE_OPERATION_MS = 6e5; var MAX_CACHE_OPERATION_MS = 6e5;
function checkOverlayBaseDatabase(config, logger, warningPrefix) { async function checkOverlayBaseDatabase(codeql, config, logger, warningPrefix) {
const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config); const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config);
if (!fs3.existsSync(baseDatabaseOidsFilePath)) { if (!fs3.existsSync(baseDatabaseOidsFilePath)) {
logger.warning( logger.warning(
@@ -88520,6 +88520,23 @@ function checkOverlayBaseDatabase(config, logger, warningPrefix) {
); );
return false; return false;
} }
for (const language of config.languages) {
const dbPath = getCodeQLDatabasePath(config, language);
try {
const resolveDatabaseOutput = await codeql.resolveDatabase(dbPath);
if (resolveDatabaseOutput === void 0 || !("overlayBaseSpecifier" in resolveDatabaseOutput)) {
logger.info(`${warningPrefix}: no overlayBaseSpecifier defined`);
return false;
} else {
logger.debug(
`Overlay base specifier for ${language} overlay-base database found: ${resolveDatabaseOutput.overlayBaseSpecifier}`
);
}
} catch (e) {
logger.warning(`${warningPrefix}: failed to resolve database: ${e}`);
return false;
}
}
return true; return true;
} }
async function cleanupAndUploadOverlayBaseDatabaseToCache(codeql, config, logger) { async function cleanupAndUploadOverlayBaseDatabaseToCache(codeql, config, logger) {
@@ -88542,7 +88559,8 @@ async function cleanupAndUploadOverlayBaseDatabaseToCache(codeql, config, logger
); );
return false; return false;
} }
const databaseIsValid = checkOverlayBaseDatabase( const databaseIsValid = await checkOverlayBaseDatabase(
codeql,
config, config,
logger, logger,
"Abort uploading overlay-base database to cache" "Abort uploading overlay-base database to cache"
@@ -90887,6 +90905,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -83701,8 +83701,8 @@ var path3 = __toESM(require("path"));
var semver4 = __toESM(require_semver2()); var semver4 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs2 = __toESM(require("fs")); var fs2 = __toESM(require("fs"));
@@ -84973,6 +84973,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

View File

@@ -1,6 +1,6 @@
{ {
"bundleVersion": "codeql-bundle-v2.23.6", "bundleVersion": "codeql-bundle-v2.23.7",
"cliVersion": "2.23.6", "cliVersion": "2.23.7",
"priorBundleVersion": "codeql-bundle-v2.23.5", "priorBundleVersion": "codeql-bundle-v2.23.6",
"priorCliVersion": "2.23.5" "priorCliVersion": "2.23.6"
} }

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -123084,8 +123084,8 @@ var path4 = __toESM(require("path"));
var semver4 = __toESM(require_semver2()); var semver4 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs3 = __toESM(require("fs")); var fs3 = __toESM(require("fs"));
@@ -125350,6 +125350,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

45
lib/init-action.js generated
View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -85635,8 +85635,8 @@ var path5 = __toESM(require("path"));
var semver4 = __toESM(require_semver2()); var semver4 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs3 = __toESM(require("fs")); var fs3 = __toESM(require("fs"));
@@ -85914,7 +85914,7 @@ function computeChangedFiles(baseFileOids, overlayFileOids) {
var CACHE_VERSION = 1; var CACHE_VERSION = 1;
var CACHE_PREFIX = "codeql-overlay-base-database"; var CACHE_PREFIX = "codeql-overlay-base-database";
var MAX_CACHE_OPERATION_MS = 6e5; var MAX_CACHE_OPERATION_MS = 6e5;
function checkOverlayBaseDatabase(config, logger, warningPrefix) { async function checkOverlayBaseDatabase(codeql, config, logger, warningPrefix) {
const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config); const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config);
if (!fs3.existsSync(baseDatabaseOidsFilePath)) { if (!fs3.existsSync(baseDatabaseOidsFilePath)) {
logger.warning( logger.warning(
@@ -85922,6 +85922,23 @@ function checkOverlayBaseDatabase(config, logger, warningPrefix) {
); );
return false; return false;
} }
for (const language of config.languages) {
const dbPath = getCodeQLDatabasePath(config, language);
try {
const resolveDatabaseOutput = await codeql.resolveDatabase(dbPath);
if (resolveDatabaseOutput === void 0 || !("overlayBaseSpecifier" in resolveDatabaseOutput)) {
logger.info(`${warningPrefix}: no overlayBaseSpecifier defined`);
return false;
} else {
logger.debug(
`Overlay base specifier for ${language} overlay-base database found: ${resolveDatabaseOutput.overlayBaseSpecifier}`
);
}
} catch (e) {
logger.warning(`${warningPrefix}: failed to resolve database: ${e}`);
return false;
}
}
return true; return true;
} }
async function downloadOverlayBaseDatabaseFromCache(codeql, config, logger) { async function downloadOverlayBaseDatabaseFromCache(codeql, config, logger) {
@@ -86009,7 +86026,8 @@ async function downloadOverlayBaseDatabaseFromCache(codeql, config, logger) {
); );
return void 0; return void 0;
} }
const databaseIsValid = checkOverlayBaseDatabase( const databaseIsValid = await checkOverlayBaseDatabase(
codeql,
config, config,
logger, logger,
"Downloaded overlay-base database is invalid" "Downloaded overlay-base database is invalid"
@@ -89147,6 +89165,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -84672,6 +84672,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -83589,8 +83589,8 @@ var path4 = __toESM(require("path"));
var semver3 = __toESM(require_semver2()); var semver3 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs3 = __toESM(require("fs")); var fs3 = __toESM(require("fs"));
@@ -85975,6 +85975,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {

View File

@@ -47321,7 +47321,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -99720,8 +99720,8 @@ function getActionsLogger() {
var core7 = __toESM(require_core()); var core7 = __toESM(require_core());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/languages.ts // src/languages.ts
var KnownLanguage = /* @__PURE__ */ ((KnownLanguage2) => { var KnownLanguage = /* @__PURE__ */ ((KnownLanguage2) => {

23
lib/upload-lib.js generated
View File

@@ -28924,7 +28924,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -86724,8 +86724,8 @@ var path4 = __toESM(require("path"));
var semver4 = __toESM(require_semver2()); var semver4 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs3 = __toESM(require("fs")); var fs3 = __toESM(require("fs"));
@@ -88697,6 +88697,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {

View File

@@ -27627,7 +27627,7 @@ var require_package = __commonJS({
"package.json"(exports2, module2) { "package.json"(exports2, module2) {
module2.exports = { module2.exports = {
name: "codeql", name: "codeql",
version: "4.31.7", version: "4.31.8",
private: true, private: true,
description: "CodeQL action", description: "CodeQL action",
scripts: { scripts: {
@@ -86505,8 +86505,8 @@ var path4 = __toESM(require("path"));
var semver3 = __toESM(require_semver2()); var semver3 = __toESM(require_semver2());
// src/defaults.json // src/defaults.json
var bundleVersion = "codeql-bundle-v2.23.6"; var bundleVersion = "codeql-bundle-v2.23.7";
var cliVersion = "2.23.6"; var cliVersion = "2.23.7";
// src/overlay-database-utils.ts // src/overlay-database-utils.ts
var fs3 = __toESM(require("fs")); var fs3 = __toESM(require("fs"));
@@ -89215,6 +89215,23 @@ ${output}`
); );
} }
}, },
async resolveDatabase(databasePath) {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"])
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output);
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`
);
}
},
async mergeResults(sarifFiles, outputFile, { async mergeResults(sarifFiles, outputFile, {
mergeRunsFromEqualCategory = false mergeRunsFromEqualCategory = false
}) { }) {

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "codeql", "name": "codeql",
"version": "4.31.7", "version": "4.31.8",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "codeql", "name": "codeql",
"version": "4.31.7", "version": "4.31.8",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/artifact": "^4.0.0", "@actions/artifact": "^4.0.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "codeql", "name": "codeql",
"version": "4.31.7", "version": "4.31.8",
"private": true, "private": true,
"description": "CodeQL action", "description": "CodeQL action",
"scripts": { "scripts": {

View File

@@ -206,6 +206,7 @@ export interface CodeQL {
* Run 'codeql resolve queries --format=startingpacks'. * Run 'codeql resolve queries --format=startingpacks'.
*/ */
resolveQueriesStartingPacks(queries: string[]): Promise<string[]>; resolveQueriesStartingPacks(queries: string[]): Promise<string[]>;
resolveDatabase(databasePath: string): Promise<ResolveDatabaseOutput>;
/** /**
* Run 'codeql github merge-results'. * Run 'codeql github merge-results'.
*/ */
@@ -230,6 +231,10 @@ export interface VersionInfo {
overlayVersion?: number; overlayVersion?: number;
} }
export interface ResolveDatabaseOutput {
overlayBaseSpecifier?: string;
}
export interface ResolveLanguagesOutput { export interface ResolveLanguagesOutput {
[language: string]: [string]; [language: string]: [string];
} }
@@ -493,6 +498,7 @@ export function createStubCodeQL(partialCodeql: Partial<CodeQL>): CodeQL {
partialCodeql, partialCodeql,
"resolveQueriesStartingPacks", "resolveQueriesStartingPacks",
), ),
resolveDatabase: resolveFunction(partialCodeql, "resolveDatabase"),
mergeResults: resolveFunction(partialCodeql, "mergeResults"), mergeResults: resolveFunction(partialCodeql, "mergeResults"),
}; };
} }
@@ -1003,6 +1009,26 @@ async function getCodeQLForCmd(
); );
} }
}, },
async resolveDatabase(
databasePath: string,
): Promise<ResolveDatabaseOutput> {
const codeqlArgs = [
"resolve",
"database",
databasePath,
"--format=json",
...getExtraOptionsFromEnv(["resolve", "database"]),
];
const output = await runCli(cmd, codeqlArgs, { noStreamStdout: true });
try {
return JSON.parse(output) as ResolveDatabaseOutput;
} catch (e) {
throw new Error(
`Unexpected output from codeql resolve database --format=json: ${e}`,
);
}
},
async mergeResults( async mergeResults(
sarifFiles: string[], sarifFiles: string[],
outputFile: string, outputFile: string,

View File

@@ -1,6 +1,6 @@
{ {
"bundleVersion": "codeql-bundle-v2.23.6", "bundleVersion": "codeql-bundle-v2.23.7",
"cliVersion": "2.23.6", "cliVersion": "2.23.7",
"priorBundleVersion": "codeql-bundle-v2.23.5", "priorBundleVersion": "codeql-bundle-v2.23.6",
"priorCliVersion": "2.23.5" "priorCliVersion": "2.23.6"
} }

View File

@@ -7,7 +7,9 @@ import * as sinon from "sinon";
import * as actionsUtil from "./actions-util"; import * as actionsUtil from "./actions-util";
import * as apiClient from "./api-client"; import * as apiClient from "./api-client";
import { ResolveDatabaseOutput } from "./codeql";
import * as gitUtils from "./git-utils"; import * as gitUtils from "./git-utils";
import { KnownLanguage } from "./languages";
import { getRunnerLogger } from "./logging"; import { getRunnerLogger } from "./logging";
import { import {
downloadOverlayBaseDatabaseFromCache, downloadOverlayBaseDatabaseFromCache,
@@ -95,6 +97,7 @@ interface DownloadOverlayBaseDatabaseTestCase {
hasBaseDatabaseOidsFile: boolean; hasBaseDatabaseOidsFile: boolean;
tryGetFolderBytesSucceeds: boolean; tryGetFolderBytesSucceeds: boolean;
codeQLVersion: string; codeQLVersion: string;
resolveDatabaseOutput: ResolveDatabaseOutput | Error;
} }
const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = { const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
@@ -105,6 +108,7 @@ const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
hasBaseDatabaseOidsFile: true, hasBaseDatabaseOidsFile: true,
tryGetFolderBytesSucceeds: true, tryGetFolderBytesSucceeds: true,
codeQLVersion: "2.20.5", codeQLVersion: "2.20.5",
resolveDatabaseOutput: { overlayBaseSpecifier: "20250626:XXX" },
}; };
const testDownloadOverlayBaseDatabaseFromCache = test.macro({ const testDownloadOverlayBaseDatabaseFromCache = test.macro({
@@ -119,9 +123,11 @@ const testDownloadOverlayBaseDatabaseFromCache = test.macro({
await fs.promises.mkdir(dbLocation, { recursive: true }); await fs.promises.mkdir(dbLocation, { recursive: true });
const logger = getRunnerLogger(true); const logger = getRunnerLogger(true);
const config = createTestConfig({ dbLocation });
const testCase = { ...defaultDownloadTestCase, ...partialTestCase }; const testCase = { ...defaultDownloadTestCase, ...partialTestCase };
const config = createTestConfig({
dbLocation,
languages: [KnownLanguage.java],
});
config.overlayDatabaseMode = testCase.overlayDatabaseMode; config.overlayDatabaseMode = testCase.overlayDatabaseMode;
config.useOverlayDatabaseCaching = testCase.useOverlayDatabaseCaching; config.useOverlayDatabaseCaching = testCase.useOverlayDatabaseCaching;
@@ -163,9 +169,23 @@ const testDownloadOverlayBaseDatabaseFromCache = test.macro({
.resolves(testCase.tryGetFolderBytesSucceeds ? 1024 * 1024 : undefined); .resolves(testCase.tryGetFolderBytesSucceeds ? 1024 * 1024 : undefined);
stubs.push(tryGetFolderBytesStub); stubs.push(tryGetFolderBytesStub);
const codeql = mockCodeQLVersion(testCase.codeQLVersion);
if (testCase.resolveDatabaseOutput instanceof Error) {
const resolveDatabaseStub = sinon
.stub(codeql, "resolveDatabase")
.rejects(testCase.resolveDatabaseOutput);
stubs.push(resolveDatabaseStub);
} else {
const resolveDatabaseStub = sinon
.stub(codeql, "resolveDatabase")
.resolves(testCase.resolveDatabaseOutput);
stubs.push(resolveDatabaseStub);
}
try { try {
const result = await downloadOverlayBaseDatabaseFromCache( const result = await downloadOverlayBaseDatabaseFromCache(
mockCodeQLVersion(testCase.codeQLVersion), codeql,
config, config,
logger, logger,
); );
@@ -255,6 +275,24 @@ test(
false, false,
); );
test(
testDownloadOverlayBaseDatabaseFromCache,
"returns undefined when downloaded database doesn't have an overlayBaseSpecifier",
{
resolveDatabaseOutput: {},
},
false,
);
test(
testDownloadOverlayBaseDatabaseFromCache,
"returns undefined when resolving database metadata fails",
{
resolveDatabaseOutput: new Error("Failed to resolve database metadata"),
},
false,
);
test( test(
testDownloadOverlayBaseDatabaseFromCache, testDownloadOverlayBaseDatabaseFromCache,
"returns undefined when filesystem error occurs", "returns undefined when filesystem error occurs",

View File

@@ -17,6 +17,7 @@ import { getCommitOid, getFileOidsUnderPath } from "./git-utils";
import { Logger, withGroupAsync } from "./logging"; import { Logger, withGroupAsync } from "./logging";
import { import {
CleanupLevel, CleanupLevel,
getCodeQLDatabasePath,
getErrorMessage, getErrorMessage,
isInTestMode, isInTestMode,
tryGetFolderBytes, tryGetFolderBytes,
@@ -176,11 +177,12 @@ const MAX_CACHE_OPERATION_MS = 600_000;
* @param warningPrefix Prefix for the check failure warning message * @param warningPrefix Prefix for the check failure warning message
* @returns True if the verification succeeded, false otherwise * @returns True if the verification succeeded, false otherwise
*/ */
function checkOverlayBaseDatabase( async function checkOverlayBaseDatabase(
codeql: CodeQL,
config: Config, config: Config,
logger: Logger, logger: Logger,
warningPrefix: string, warningPrefix: string,
): boolean { ): Promise<boolean> {
// An overlay-base database should contain the base database OIDs file. // An overlay-base database should contain the base database OIDs file.
const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config); const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config);
if (!fs.existsSync(baseDatabaseOidsFilePath)) { if (!fs.existsSync(baseDatabaseOidsFilePath)) {
@@ -189,6 +191,29 @@ function checkOverlayBaseDatabase(
); );
return false; return false;
} }
for (const language of config.languages) {
const dbPath = getCodeQLDatabasePath(config, language);
try {
const resolveDatabaseOutput = await codeql.resolveDatabase(dbPath);
if (
resolveDatabaseOutput === undefined ||
!("overlayBaseSpecifier" in resolveDatabaseOutput)
) {
logger.info(`${warningPrefix}: no overlayBaseSpecifier defined`);
return false;
} else {
logger.debug(
`Overlay base specifier for ${language} overlay-base database found: ` +
`${resolveDatabaseOutput.overlayBaseSpecifier}`,
);
}
} catch (e) {
logger.warning(`${warningPrefix}: failed to resolve database: ${e}`);
return false;
}
}
return true; return true;
} }
@@ -232,7 +257,8 @@ export async function cleanupAndUploadOverlayBaseDatabaseToCache(
return false; return false;
} }
const databaseIsValid = checkOverlayBaseDatabase( const databaseIsValid = await checkOverlayBaseDatabase(
codeql,
config, config,
logger, logger,
"Abort uploading overlay-base database to cache", "Abort uploading overlay-base database to cache",
@@ -415,7 +441,8 @@ export async function downloadOverlayBaseDatabaseFromCache(
return undefined; return undefined;
} }
const databaseIsValid = checkOverlayBaseDatabase( const databaseIsValid = await checkOverlayBaseDatabase(
codeql,
config, config,
logger, logger,
"Downloaded overlay-base database is invalid", "Downloaded overlay-base database is invalid",