From 8bdea824e2d904a190430615583a0f4cde99fd51 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 18:51:35 +0100 Subject: [PATCH 01/10] Move `ConfigurationError` out of `util.ts` --- lib/entry-points.js | 6 ++++-- src/errors/index.ts | 5 +++++ src/util.ts | 8 ++------ 3 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 src/errors/index.ts diff --git a/lib/entry-points.js b/lib/entry-points.js index 1a99a44427..3d3dc758fb 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -169373,6 +169373,10 @@ var semver = __toESM(require_semver2()); var maximumVersion = "3.23"; var minimumVersion = "3.18"; +// src/errors/index.ts +var ConfigurationError = class extends Error { +}; + // src/json/index.ts function parseString(data) { return JSON.parse(data); @@ -169830,8 +169834,6 @@ var HTTPError = class extends Error { this.status = status; } }; -var ConfigurationError = class extends Error { -}; function asHTTPError(arg) { if (!isObject2(arg) || !isString(arg.message)) { return void 0; diff --git a/src/errors/index.ts b/src/errors/index.ts new file mode 100644 index 0000000000..26bb63a9c7 --- /dev/null +++ b/src/errors/index.ts @@ -0,0 +1,5 @@ +/** + * An Error class that indicates an error that occurred due to + * a misconfiguration of the action or the CodeQL CLI. + */ +export class ConfigurationError extends Error {} diff --git a/src/util.ts b/src/util.ts index 02e105d577..f12059ced0 100644 --- a/src/util.ts +++ b/src/util.ts @@ -23,11 +23,13 @@ import { getEnv, type Env, } from "./environment"; +import { ConfigurationError } from "./errors"; import * as json from "./json"; import { Language } from "./languages"; import { Logger } from "./logging"; // Re-export for backwards compatibility to avoid updating a lot of imports elsewhere. +export { ConfigurationError } from "./errors"; export { getRequiredEnvParam, getOptionalEnvVar, @@ -573,12 +575,6 @@ export class HTTPError extends Error { } } -/** - * An Error class that indicates an error that occurred due to - * a misconfiguration of the action or the CodeQL CLI. - */ -export class ConfigurationError extends Error {} - export function asHTTPError(arg: any): HTTPError | undefined { if (!json.isObject(arg) || !json.isString(arg.message)) { return undefined; From 071544a67ac93f3feb1b157904250dc7ec0c23b7 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 19:02:10 +0100 Subject: [PATCH 02/10] Move `HTTPError` out of `util.ts` --- lib/entry-points.js | 46 +++++++++++++++++++------------------- src/errors/index.ts | 30 +++++++++++++++++++++++++ src/tools-download.test.ts | 3 ++- src/util.ts | 26 +-------------------- 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index 3d3dc758fb..89234fdf37 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -169373,10 +169373,6 @@ var semver = __toESM(require_semver2()); var maximumVersion = "3.23"; var minimumVersion = "3.18"; -// src/errors/index.ts -var ConfigurationError = class extends Error { -}; - // src/json/index.ts function parseString(data) { return JSON.parse(data); @@ -169559,6 +169555,29 @@ function checkSchema(schema, obj, options = {}, path30 = "") { return result; } +// src/errors/index.ts +var ConfigurationError = class extends Error { +}; +var HTTPError = class extends Error { + status; + constructor(message, status) { + super(message); + this.status = status; + } +}; +function asHTTPError(arg) { + if (!isObject2(arg) || !isString(arg.message)) { + return void 0; + } + if (Number.isInteger(arg.status)) { + return new HTTPError(arg.message, arg.status); + } + if (Number.isInteger(arg.httpStatusCode)) { + return new HTTPError(arg.message, arg.httpStatusCode); + } + return void 0; +} + // src/util.ts var BASE_DATABASE_OIDS_FILE_NAME = "base-database-oids.json"; var BROKEN_VERSIONS = ["0.0.0-20211207"]; @@ -169827,25 +169846,6 @@ function initializeEnvironment(version, env = getEnv()) { env.export("CODEQL_ACTION_FEATURE_WILL_UPLOAD" /* FEATURE_WILL_UPLOAD */, "true"); env.export("CODEQL_ACTION_VERSION" /* VERSION */, version); } -var HTTPError = class extends Error { - status; - constructor(message, status) { - super(message); - this.status = status; - } -}; -function asHTTPError(arg) { - if (!isObject2(arg) || !isString(arg.message)) { - return void 0; - } - if (Number.isInteger(arg.status)) { - return new HTTPError(arg.message, arg.status); - } - if (Number.isInteger(arg.httpStatusCode)) { - return new HTTPError(arg.message, arg.httpStatusCode); - } - return void 0; -} async function codeQlVersionAtLeast(codeql, requiredVersion) { return semver.gte((await codeql.getVersion()).version, requiredVersion); } diff --git a/src/errors/index.ts b/src/errors/index.ts index 26bb63a9c7..a8887c8ea0 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -1,5 +1,35 @@ +import * as json from "../json"; + /** * An Error class that indicates an error that occurred due to * a misconfiguration of the action or the CodeQL CLI. */ export class ConfigurationError extends Error {} + +/** Minimal representation of errors resulting from HTTP requests. */ +export class HTTPError extends Error { + public status: number; + + constructor(message: string, status: number) { + super(message); + this.status = status; + } +} + +/** + * Tries to convert {@link arg} to a {@link HTTPError}, but returns `undefined` if + * {@link arg} is not like a {@link HTTPError}. + */ +export function asHTTPError(arg: any): HTTPError | undefined { + if (!json.isObject(arg) || !json.isString(arg.message)) { + return undefined; + } + if (Number.isInteger(arg.status)) { + return new HTTPError(arg.message, arg.status as number); + } + // See https://github.com/actions/toolkit/blob/acb230b99a46ed33a3f04a758cd68b47b9a82908/packages/tool-cache/src/tool-cache.ts#L19 + if (Number.isInteger(arg.httpStatusCode)) { + return new HTTPError(arg.message, arg.httpStatusCode as number); + } + return undefined; +} diff --git a/src/tools-download.test.ts b/src/tools-download.test.ts index 407e2ea489..fd11c1801e 100644 --- a/src/tools-download.test.ts +++ b/src/tools-download.test.ts @@ -10,6 +10,7 @@ import { https } from "follow-redirects"; import nock from "nock"; import * as sinon from "sinon"; +import * as errors from "./errors"; import { getRunnerLogger } from "./logging"; import * as tar from "./tar"; import { setupTests } from "./testing-utils"; @@ -164,7 +165,7 @@ test.serial( test.serial( "downloadAndExtract handles an unknown status as a non-HTTP error", async (t) => { - const asHTTPError = sinon.spy(util, "asHTTPError"); + const asHTTPError = sinon.spy(errors, "asHTTPError"); await util.withTmpDir(async (tmpDir) => { sinon.stub(process, "platform").value("linux"); const archivePath = path.join(tmpDir, "codeql-bundle.tar.zst"); diff --git a/src/util.ts b/src/util.ts index f12059ced0..bff332ba3e 100644 --- a/src/util.ts +++ b/src/util.ts @@ -24,12 +24,11 @@ import { type Env, } from "./environment"; import { ConfigurationError } from "./errors"; -import * as json from "./json"; import { Language } from "./languages"; import { Logger } from "./logging"; // Re-export for backwards compatibility to avoid updating a lot of imports elsewhere. -export { ConfigurationError } from "./errors"; +export { ConfigurationError, HTTPError, asHTTPError } from "./errors"; export { getRequiredEnvParam, getOptionalEnvVar, @@ -566,29 +565,6 @@ export function initializeEnvironment(version: string, env: Env = getEnv()) { env.export(EnvVar.VERSION, version); } -export class HTTPError extends Error { - public status: number; - - constructor(message: string, status: number) { - super(message); - this.status = status; - } -} - -export function asHTTPError(arg: any): HTTPError | undefined { - if (!json.isObject(arg) || !json.isString(arg.message)) { - return undefined; - } - if (Number.isInteger(arg.status)) { - return new HTTPError(arg.message, arg.status as number); - } - // See https://github.com/actions/toolkit/blob/acb230b99a46ed33a3f04a758cd68b47b9a82908/packages/tool-cache/src/tool-cache.ts#L19 - if (Number.isInteger(arg.httpStatusCode)) { - return new HTTPError(arg.message, arg.httpStatusCode as number); - } - return undefined; -} - export async function codeQlVersionAtLeast( codeql: CodeQL, requiredVersion: string, From a76419a63223cc025c5d660e8d487ebcd7442cc8 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 21:46:16 +0100 Subject: [PATCH 03/10] Move `wrapError` and `getErrorMessage` out of `util.ts` --- lib/entry-points.js | 12 ++++++------ src/errors/index.ts | 18 ++++++++++++++++++ src/util.ts | 18 ++---------------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index 89234fdf37..c79607d1cf 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -169556,6 +169556,12 @@ function checkSchema(schema, obj, options = {}, path30 = "") { } // src/errors/index.ts +function wrapError(error3) { + return error3 instanceof Error ? error3 : new Error(String(error3)); +} +function getErrorMessage(error3) { + return error3 instanceof Error ? error3.message : String(error3); +} var ConfigurationError = class extends Error { }; var HTTPError = class extends Error { @@ -169983,12 +169989,6 @@ function parseMatrixInput(matrixInput) { ); } } -function wrapError(error3) { - return error3 instanceof Error ? error3 : new Error(String(error3)); -} -function getErrorMessage(error3) { - return error3 instanceof Error ? error3.message : String(error3); -} function prettyPrintPack(pack) { return `${pack.name}${pack.version ? `@${pack.version}` : ""}${pack.path ? `:${pack.path}` : ""}`; } diff --git a/src/errors/index.ts b/src/errors/index.ts index a8887c8ea0..b1281f3af8 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -1,5 +1,23 @@ import * as json from "../json"; +/** + * If {@link error} is not already an instance of {@link Error}, then this function constructs + * an {@link Error} with a string representation of {@link error} as the message. + */ +export function wrapError(error: unknown): Error { + return error instanceof Error ? error : new Error(String(error)); +} + +/** + * Returns an appropriate message for the error. + * + * If the error is an {@link Error} instance, this returns the error message without + * an `Error: ` prefix. + */ +export function getErrorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + /** * An Error class that indicates an error that occurred due to * a misconfiguration of the action or the CodeQL CLI. diff --git a/src/util.ts b/src/util.ts index bff332ba3e..8761cacb23 100644 --- a/src/util.ts +++ b/src/util.ts @@ -23,12 +23,12 @@ import { getEnv, type Env, } from "./environment"; -import { ConfigurationError } from "./errors"; +import { ConfigurationError, getErrorMessage, wrapError } from "./errors"; import { Language } from "./languages"; import { Logger } from "./logging"; // Re-export for backwards compatibility to avoid updating a lot of imports elsewhere. -export { ConfigurationError, HTTPError, asHTTPError } from "./errors"; +export * from "./errors"; export { getRequiredEnvParam, getOptionalEnvVar, @@ -839,20 +839,6 @@ export function parseMatrixInput( } } -export function wrapError(error: unknown): Error { - return error instanceof Error ? error : new Error(String(error)); -} - -/** - * Returns an appropriate message for the error. - * - * If the error is an `Error` instance, this returns the error message without - * an `Error: ` prefix. - */ -export function getErrorMessage(error: unknown): string { - return error instanceof Error ? error.message : String(error); -} - export function prettyPrintPack(pack: Pack) { return `${pack.name}${pack.version ? `@${pack.version}` : ""}${ pack.path ? `:${pack.path}` : "" From 929f5c0db4911649e069de2df00230b5066ad203 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 21:50:09 +0100 Subject: [PATCH 04/10] Move `isDiskConfigurationError` out of `codeql.ts` --- lib/entry-points.js | 20 ++++++++++---------- src/codeql.ts | 25 ++++--------------------- src/errors/index.ts | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index c79607d1cf..7fdec233b7 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -169562,6 +169562,16 @@ function wrapError(error3) { function getErrorMessage(error3) { return error3 instanceof Error ? error3.message : String(error3); } +function isDiskConfigurationError(e) { + if (!(e instanceof Error)) { + return false; + } + return ( + // out of disk space + e.message.includes("ENOSPC") || // access denied + e.message.includes("EACCES") + ); +} var ConfigurationError = class extends Error { }; var HTTPError = class extends Error { @@ -177004,16 +177014,6 @@ var CODEQL_NEXT_MINIMUM_VERSION = "2.21.3"; var GHES_VERSION_MOST_RECENTLY_DEPRECATED = "3.17"; var GHES_MOST_RECENT_DEPRECATION_DATE = "2026-09-24"; var EXTRACTION_DEBUG_MODE_VERBOSITY = "progress++"; -function isDiskConfigurationError(e) { - if (!(e instanceof Error)) { - return false; - } - return ( - // out of disk space - e.message.includes("ENOSPC") || // access denied - e.message.includes("EACCES") - ); -} async function setupCodeQL(toolsInput, apiDetails, tempDir, variant, defaultCliVersion, rawLanguages, otherLanguagePacksReason, useOverlayAwareDefaultCliVersion, features, logger2, checkVersion) { try { const { diff --git a/src/codeql.ts b/src/codeql.ts index a76e29727a..706ca32106 100644 --- a/src/codeql.ts +++ b/src/codeql.ts @@ -19,6 +19,7 @@ import type { ActionConfig } from "./config/action-config"; import { appendExtraQueryExclusions, type Config } from "./config-utils"; import { DocUrl } from "./doc-url"; import { EnvVar, getEnv, exportEnvVar } from "./environment"; +import { getErrorMessage, isDiskConfigurationError } from "./errors"; import { CodeQLDefaultVersionInfo, Feature, @@ -34,7 +35,9 @@ import { ToolsDownloadStatusReport } from "./tools-download"; import { ToolsFeature, isSupportedToolsFeature } from "./tools-features"; import { shouldEnableIndirectTracing } from "./tracer-config"; import * as util from "./util"; -import { BuildMode, CleanupLevel, getErrorMessage } from "./util"; +import { BuildMode, CleanupLevel } from "./util"; + +export { isDiskConfigurationError } from "./errors"; type Options = Array; @@ -274,26 +277,6 @@ const GHES_MOST_RECENT_DEPRECATION_DATE = "2026-09-24"; /** The CLI verbosity level to use for extraction in debug mode. */ const EXTRACTION_DEBUG_MODE_VERBOSITY = "progress++"; -/** - * Decides whether `e` is a disk-related error outside of our control - * that should be classified as a `ConfigurationError`. - * - * @param e The error to check. - * @returns True if the error should be treated as a `ConfigurationError` or false if not. - */ -export function isDiskConfigurationError(e: unknown): boolean { - if (!(e instanceof Error)) { - return false; - } - - return ( - // out of disk space - e.message.includes("ENOSPC") || - // access denied - e.message.includes("EACCES") - ); -} - /** * Set up CodeQL CLI access. * diff --git a/src/errors/index.ts b/src/errors/index.ts index b1281f3af8..24ce40d189 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -18,6 +18,26 @@ export function getErrorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error); } +/** + * Decides whether `e` is a disk-related error outside of our control + * that should be classified as a `ConfigurationError`. + * + * @param e The error to check. + * @returns True if the error should be treated as a `ConfigurationError` or false if not. + */ +export function isDiskConfigurationError(e: unknown): boolean { + if (!(e instanceof Error)) { + return false; + } + + return ( + // out of disk space + e.message.includes("ENOSPC") || + // access denied + e.message.includes("EACCES") + ); +} + /** * An Error class that indicates an error that occurred due to * a misconfiguration of the action or the CodeQL CLI. From 9c72af5b2b5de7f083fe72969eda020adf36d6d6 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 19:12:19 +0100 Subject: [PATCH 05/10] Move `codeQlVersionAtLeast` out of `util.ts` and into `CodeQL` --- lib/entry-points.js | 56 +++++++++++++++++++++----------------------- src/codeql.ts | 26 ++++++++++++++++++-- src/config-utils.ts | 8 ++----- src/feature-flags.ts | 2 +- src/init-action.ts | 3 +-- src/util.ts | 7 ------ 6 files changed, 55 insertions(+), 47 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index 7fdec233b7..f5cb6b25c9 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -34719,7 +34719,7 @@ var require_cacheUtils = __commonJS({ var crypto3 = __importStar2(require("crypto")); var fs32 = __importStar2(require("fs")); var path30 = __importStar2(require("path")); - var semver11 = __importStar2(require_semver3()); + var semver12 = __importStar2(require_semver3()); var util4 = __importStar2(require("util")); var constants_1 = require_constants7(); var versionSalt = "1.0"; @@ -34812,7 +34812,7 @@ var require_cacheUtils = __commonJS({ function getCompressionMethod() { return __awaiter2(this, void 0, void 0, function* () { const versionOutput = yield getVersion("zstd", ["--quiet"]); - const version = semver11.clean(versionOutput); + const version = semver12.clean(versionOutput); core29.debug(`zstd version: ${version}`); if (versionOutput === "") { return constants_1.CompressionMethod.Gzip; @@ -106361,7 +106361,7 @@ var require_manifest = __commonJS({ exports2._findMatch = _findMatch; exports2._getOsVersion = _getOsVersion; exports2._readLinuxVersionFile = _readLinuxVersionFile; - var semver11 = __importStar2(require_semver2()); + var semver12 = __importStar2(require_semver2()); var core_1 = require_core(); var os7 = require("os"); var cp = require("child_process"); @@ -106375,7 +106375,7 @@ var require_manifest = __commonJS({ for (const candidate of candidates) { const version = candidate.version; (0, core_1.debug)(`check ${version} satisfies ${versionSpec}`); - if (semver11.satisfies(version, versionSpec) && (!stable || candidate.stable === stable)) { + if (semver12.satisfies(version, versionSpec) && (!stable || candidate.stable === stable)) { file = candidate.files.find((item) => { (0, core_1.debug)(`${item.arch}===${archFilter} && ${item.platform}===${platFilter}`); let chk = item.arch === archFilter && item.platform === platFilter; @@ -106384,7 +106384,7 @@ var require_manifest = __commonJS({ if (osVersion === item.platform_version) { chk = true; } else { - chk = semver11.satisfies(osVersion, item.platform_version); + chk = semver12.satisfies(osVersion, item.platform_version); } } return chk; @@ -106644,7 +106644,7 @@ var require_tool_cache = __commonJS({ var os7 = __importStar2(require("os")); var path30 = __importStar2(require("path")); var httpm = __importStar2(require_lib()); - var semver11 = __importStar2(require_semver2()); + var semver12 = __importStar2(require_semver2()); var stream2 = __importStar2(require("stream")); var util4 = __importStar2(require("util")); var assert_1 = require("assert"); @@ -106917,7 +106917,7 @@ var require_tool_cache = __commonJS({ } function cacheDir2(sourceDir, tool, version, arch2) { return __awaiter2(this, void 0, void 0, function* () { - version = semver11.clean(version) || version; + version = semver12.clean(version) || version; arch2 = arch2 || os7.arch(); core29.debug(`Caching tool ${tool} ${version} ${arch2}`); core29.debug(`source dir: ${sourceDir}`); @@ -106935,7 +106935,7 @@ var require_tool_cache = __commonJS({ } function cacheFile(sourceFile, targetFile, tool, version, arch2) { return __awaiter2(this, void 0, void 0, function* () { - version = semver11.clean(version) || version; + version = semver12.clean(version) || version; arch2 = arch2 || os7.arch(); core29.debug(`Caching tool ${tool} ${version} ${arch2}`); core29.debug(`source file: ${sourceFile}`); @@ -106965,7 +106965,7 @@ var require_tool_cache = __commonJS({ } let toolPath = ""; if (versionSpec) { - versionSpec = semver11.clean(versionSpec) || ""; + versionSpec = semver12.clean(versionSpec) || ""; const cachePath = path30.join(_getCacheDirectory(), toolName, versionSpec, arch2); core29.debug(`checking cache: ${cachePath}`); if (fs32.existsSync(cachePath) && fs32.existsSync(`${cachePath}.complete`)) { @@ -107045,7 +107045,7 @@ var require_tool_cache = __commonJS({ } function _createToolPath(tool, version, arch2) { return __awaiter2(this, void 0, void 0, function* () { - const folderPath = path30.join(_getCacheDirectory(), tool, semver11.clean(version) || version, arch2 || ""); + const folderPath = path30.join(_getCacheDirectory(), tool, semver12.clean(version) || version, arch2 || ""); core29.debug(`destination ${folderPath}`); const markerPath = `${folderPath}.complete`; yield io9.rmRF(folderPath); @@ -107055,15 +107055,15 @@ var require_tool_cache = __commonJS({ }); } function _completeToolPath(tool, version, arch2) { - const folderPath = path30.join(_getCacheDirectory(), tool, semver11.clean(version) || version, arch2 || ""); + const folderPath = path30.join(_getCacheDirectory(), tool, semver12.clean(version) || version, arch2 || ""); const markerPath = `${folderPath}.complete`; fs32.writeFileSync(markerPath, ""); core29.debug("finished caching tool"); } function isExplicitVersion(versionSpec) { - const c = semver11.clean(versionSpec) || ""; + const c = semver12.clean(versionSpec) || ""; core29.debug(`isExplicit: ${c}`); - const valid4 = semver11.valid(c) != null; + const valid4 = semver12.valid(c) != null; core29.debug(`explicit? ${valid4}`); return valid4; } @@ -107071,14 +107071,14 @@ var require_tool_cache = __commonJS({ let version = ""; core29.debug(`evaluating ${versions.length} versions`); versions = versions.sort((a, b) => { - if (semver11.gt(a, b)) { + if (semver12.gt(a, b)) { return 1; } return -1; }); for (let i = versions.length - 1; i >= 0; i--) { const potential = versions[i]; - const satisfied = semver11.satisfies(potential, versionSpec); + const satisfied = semver12.satisfies(potential, versionSpec); if (satisfied) { version = potential; break; @@ -169862,9 +169862,6 @@ function initializeEnvironment(version, env = getEnv()) { env.export("CODEQL_ACTION_FEATURE_WILL_UPLOAD" /* FEATURE_WILL_UPLOAD */, "true"); env.export("CODEQL_ACTION_VERSION" /* VERSION */, version); } -async function codeQlVersionAtLeast(codeql, requiredVersion) { - return semver.gte((await codeql.getVersion()).version, requiredVersion); -} function getBaseDatabaseOidsFilePath(config) { return path.join(config.dbLocation, BASE_DATABASE_OIDS_FILE_NAME); } @@ -172262,7 +172259,7 @@ var OfflineFeatures = class { } const minimumVersion2 = config.minimumVersion; if (codeql && minimumVersion2) { - if (!await codeQlVersionAtLeast(codeql, minimumVersion2)) { + if (!await codeql.isVersionAtLeast(minimumVersion2)) { this.logger.debug( `Feature ${feature} is disabled because the CodeQL CLI version is older than the minimum version ${minimumVersion2}.` ); @@ -172685,6 +172682,7 @@ var fs16 = __toESM(require("fs")); var path15 = __toESM(require("path")); var core12 = __toESM(require_core()); var toolrunner3 = __toESM(require_toolrunner()); +var semver10 = __toESM(require_semver2()); // src/cli-errors.ts var SUPPORTED_PLATFORMS = [ @@ -174673,10 +174671,7 @@ function runnerHasSufficientDiskSpace(diskUsage, logger2, minimumDiskSpaceMb) { return true; } async function runnerHasSufficientMemory(codeql, ramInput, logger2) { - if (await codeQlVersionAtLeast( - codeql, - CODEQL_VERSION_REDUCED_OVERLAY_MEMORY_USAGE - )) { + if (await codeql.isVersionAtLeast(CODEQL_VERSION_REDUCED_OVERLAY_MEMORY_USAGE)) { logger2.debug( `Skipping memory check for overlay analysis because CodeQL version is at least ${CODEQL_VERSION_REDUCED_OVERLAY_MEMORY_USAGE}.` ); @@ -174814,7 +174809,7 @@ async function validateOverlayDatabaseMode(overlayDatabaseMode, useOverlayDataba ); return new Failure("incompatible-build-mode" /* IncompatibleBuildMode */); } - if (!await codeQlVersionAtLeast(codeql, CODEQL_OVERLAY_MINIMUM_VERSION)) { + if (!await codeql.isVersionAtLeast(CODEQL_OVERLAY_MINIMUM_VERSION)) { logger2.warning( `Cannot build an ${overlayDatabaseMode} database because the CodeQL CLI is older than ${CODEQL_OVERLAY_MINIMUM_VERSION}. Falling back to creating a normal full database instead.` ); @@ -177088,6 +177083,9 @@ async function getCodeQLForCmd(logger2, cmd, checkVersion) { } return result; }, + async isVersionAtLeast(requiredVersion) { + return semver10.gte((await this.getVersion()).version, requiredVersion); + }, async printVersion() { core12.info(JSON.stringify(await this.getVersion(), null, 2)); }, @@ -177476,11 +177474,11 @@ Output was: ${extractorPath}` await runCli(cmd, args); } }; - if (checkVersion && !await codeQlVersionAtLeast(codeql, CODEQL_MINIMUM_VERSION)) { + if (checkVersion && !await codeql.isVersionAtLeast(CODEQL_MINIMUM_VERSION)) { throw new ConfigurationError( `Expected a CodeQL CLI with version at least ${CODEQL_MINIMUM_VERSION} but got version ${(await codeql.getVersion()).version}` ); - } else if (checkVersion && process.env["CODEQL_ACTION_SUPPRESS_DEPRECATED_SOON_WARNING" /* SUPPRESS_DEPRECATED_SOON_WARNING */] !== "true" && !await codeQlVersionAtLeast(codeql, CODEQL_NEXT_MINIMUM_VERSION)) { + } else if (checkVersion && process.env["CODEQL_ACTION_SUPPRESS_DEPRECATED_SOON_WARNING" /* SUPPRESS_DEPRECATED_SOON_WARNING */] !== "true" && !await codeql.isVersionAtLeast(CODEQL_NEXT_MINIMUM_VERSION)) { const result = await codeql.getVersion(); core12.warning( `CodeQL CLI version ${result.version} was discontinued on ${GHES_MOST_RECENT_DEPRECATION_DATE} alongside GitHub Enterprise Server ${GHES_VERSION_MOST_RECENTLY_DEPRECATED} and will not be supported by the next minor release of the CodeQL Action. Please update to CodeQL CLI version ${CODEQL_NEXT_MINIMUM_VERSION} or later. For instance, if you have specified a custom version of the CLI using the 'tools' input to the 'init' Action, you can remove this input to use the default version. @@ -186038,7 +186036,7 @@ var fs29 = __toESM(require("fs")); var path25 = __toESM(require("path")); var core19 = __toESM(require_core()); var io7 = __toESM(require_io()); -var semver10 = __toESM(require_semver2()); +var semver11 = __toESM(require_semver2()); // src/config/inputs.ts async function getToolsInput(action, repositoryProperties) { @@ -186548,7 +186546,7 @@ async function run3(actionState) { ) { const publicPreview = "2.22.1"; const actualVer = (await codeql.getVersion()).version; - if (semver10.lt(actualVer, publicPreview)) { + if (semver11.lt(actualVer, publicPreview)) { actionState.env.export("CODEQL_ENABLE_EXPERIMENTAL_FEATURES" /* EXPERIMENTAL_FEATURES */, "true"); logger2.info("Experimental Rust analysis enabled"); } @@ -186781,7 +186779,7 @@ exec ${goBinaryPath} "$@"` logger2.debug( `${"CODEQL_EXTRACTOR_JAVA_OPTION_MINIMIZE_DEPENDENCY_JARS" /* JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS */} is already set to '${process.env["CODEQL_EXTRACTOR_JAVA_OPTION_MINIMIZE_DEPENDENCY_JARS" /* JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS */]}', so the Action will not override it.` ); - } else if (await codeQlVersionAtLeast(codeql, CODEQL_VERSION_JAR_MINIMIZATION) && config.dependencyCachingEnabled && config.buildMode === "none" /* None */ && config.languages.includes("java" /* java */)) { + } else if (await codeql.isVersionAtLeast(CODEQL_VERSION_JAR_MINIMIZATION) && config.dependencyCachingEnabled && config.buildMode === "none" /* None */ && config.languages.includes("java" /* java */)) { actionState.env.export( "CODEQL_EXTRACTOR_JAVA_OPTION_MINIMIZE_DEPENDENCY_JARS" /* JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS */, "true" diff --git a/src/codeql.ts b/src/codeql.ts index 706ca32106..07153a7499 100644 --- a/src/codeql.ts +++ b/src/codeql.ts @@ -4,6 +4,7 @@ import * as path from "path"; import * as core from "@actions/core"; import * as toolrunner from "@actions/exec/lib/toolrunner"; import * as yaml from "js-yaml"; +import * as semver from "semver"; import { CommandInvocationError, @@ -73,6 +74,11 @@ export interface CodeQL { * Get a string containing the semver version of the CodeQL executable. */ getVersion(): Promise; + /** + * Determines whether the CLI installation represented by this {@link CodeQL} instance + * has at least the {@link requiredVersion}. + */ + isVersionAtLeast(requiredVersion: string): Promise; /** * Print version information about CodeQL. */ @@ -414,6 +420,19 @@ export function createStubCodeQL(partialCodeql: Partial): CodeQL { getVersion: resolveFunction(partialCodeql, "getVersion", async () => ({ version: "1.0.0", })), + isVersionAtLeast: resolveFunction( + partialCodeql, + "codeQlVersionAtLeast", + async (requiredVersion) => { + return ( + !!partialCodeql.getVersion && + semver.gte( + (await partialCodeql.getVersion()).version, + requiredVersion, + ) + ); + }, + ), printVersion: resolveFunction(partialCodeql, "printVersion"), supportsFeature: resolveFunction( partialCodeql, @@ -517,6 +536,9 @@ async function getCodeQLForCmd( } return result; }, + async isVersionAtLeast(requiredVersion: string) { + return semver.gte((await this.getVersion()).version, requiredVersion); + }, async printVersion() { // Reuse the cached version information rather than invoking the CLI again. core.info(JSON.stringify(await this.getVersion(), null, 2)); @@ -1011,7 +1033,7 @@ async function getCodeQLForCmd( // CodeQL object is created. if ( checkVersion && - !(await util.codeQlVersionAtLeast(codeql, CODEQL_MINIMUM_VERSION)) + !(await codeql.isVersionAtLeast(CODEQL_MINIMUM_VERSION)) ) { throw new util.ConfigurationError( `Expected a CodeQL CLI with version at least ${CODEQL_MINIMUM_VERSION} but got version ${ @@ -1021,7 +1043,7 @@ async function getCodeQLForCmd( } else if ( checkVersion && process.env[EnvVar.SUPPRESS_DEPRECATED_SOON_WARNING] !== "true" && - !(await util.codeQlVersionAtLeast(codeql, CODEQL_NEXT_MINIMUM_VERSION)) + !(await codeql.isVersionAtLeast(CODEQL_NEXT_MINIMUM_VERSION)) ) { const result = await codeql.getVersion(); core.warning( diff --git a/src/config-utils.ts b/src/config-utils.ts index de506aac05..5c2a89776d 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -82,7 +82,6 @@ import { GitHubVersion, ConfigurationError, BuildMode, - codeQlVersionAtLeast, cloneObject, isDefined, checkDiskUsage, @@ -652,10 +651,7 @@ async function runnerHasSufficientMemory( logger: Logger, ): Promise { if ( - await codeQlVersionAtLeast( - codeql, - CODEQL_VERSION_REDUCED_OVERLAY_MEMORY_USAGE, - ) + await codeql.isVersionAtLeast(CODEQL_VERSION_REDUCED_OVERLAY_MEMORY_USAGE) ) { logger.debug( `Skipping memory check for overlay analysis because CodeQL version is at least ${CODEQL_VERSION_REDUCED_OVERLAY_MEMORY_USAGE}.`, @@ -899,7 +895,7 @@ async function validateOverlayDatabaseMode( ); return new Failure(OverlayDisabledReason.IncompatibleBuildMode); } - if (!(await codeQlVersionAtLeast(codeql, CODEQL_OVERLAY_MINIMUM_VERSION))) { + if (!(await codeql.isVersionAtLeast(CODEQL_OVERLAY_MINIMUM_VERSION))) { logger.warning( `Cannot build an ${overlayDatabaseMode} database because ` + `the CodeQL CLI is older than ${CODEQL_OVERLAY_MINIMUM_VERSION}. ` + diff --git a/src/feature-flags.ts b/src/feature-flags.ts index 5cf7c7414c..e64b69eabe 100644 --- a/src/feature-flags.ts +++ b/src/feature-flags.ts @@ -589,7 +589,7 @@ class OfflineFeatures implements FeatureEnablement { // Never use this feature if the CLI version explicitly can't support it. const minimumVersion = config.minimumVersion; if (codeql && minimumVersion) { - if (!(await util.codeQlVersionAtLeast(codeql, minimumVersion))) { + if (!(await codeql.isVersionAtLeast(minimumVersion))) { this.logger.debug( `Feature ${feature} is disabled because the CodeQL CLI version is older than the minimum ` + `version ${minimumVersion}.`, diff --git a/src/init-action.ts b/src/init-action.ts index f58d4ccca7..7f9178304c 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -88,7 +88,6 @@ import { checkDiskUsage, checkForTimeout, checkGitHubVersionInRange, - codeQlVersionAtLeast, DEFAULT_DEBUG_ARTIFACT_NAME, DEFAULT_DEBUG_DATABASE_NAME, getCodeQLMemoryLimit, @@ -686,7 +685,7 @@ async function run( `${EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS} is already set to '${process.env[EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS]}', so the Action will not override it.`, ); } else if ( - (await codeQlVersionAtLeast(codeql, CODEQL_VERSION_JAR_MINIMIZATION)) && + (await codeql.isVersionAtLeast(CODEQL_VERSION_JAR_MINIMIZATION)) && config.dependencyCachingEnabled && config.buildMode === BuildMode.None && config.languages.includes(BuiltInLanguage.java) diff --git a/src/util.ts b/src/util.ts index 8761cacb23..19fbc4368b 100644 --- a/src/util.ts +++ b/src/util.ts @@ -565,13 +565,6 @@ export function initializeEnvironment(version: string, env: Env = getEnv()) { env.export(EnvVar.VERSION, version); } -export async function codeQlVersionAtLeast( - codeql: CodeQL, - requiredVersion: string, -): Promise { - return semver.gte((await codeql.getVersion()).version, requiredVersion); -} - export function getBaseDatabaseOidsFilePath( config: ActionConfig<"dbLocation">, ): string { From 86bc4448d3cac2bb3a975703685964f56bd3d48c Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 21:52:19 +0100 Subject: [PATCH 06/10] Mark additional imports in `util.ts` as `type`-only --- src/util.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util.ts b/src/util.ts index 19fbc4368b..d1729acdc1 100644 --- a/src/util.ts +++ b/src/util.ts @@ -24,8 +24,8 @@ import { type Env, } from "./environment"; import { ConfigurationError, getErrorMessage, wrapError } from "./errors"; -import { Language } from "./languages"; -import { Logger } from "./logging"; +import type { Language } from "./languages"; +import type { Logger } from "./logging"; // Re-export for backwards compatibility to avoid updating a lot of imports elsewhere. export * from "./errors"; From 02283e954255a3bcc4667da340f00d031edeba00 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 18:55:59 +0100 Subject: [PATCH 07/10] Move more GitHub-related definitions from `util.ts` to `github.ts` --- lib/entry-points.js | 104 ++++++++++++++++++++++---------------------- src/github.ts | 16 ++++++- src/util.ts | 16 +------ 3 files changed, 69 insertions(+), 67 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index f5cb6b25c9..841bb36a12 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -42967,11 +42967,11 @@ var require_tracingPolicy = __commonJS({ var import_log = require_log3(); var import_core_util = require_commonjs4(); var import_restError = require_restError3(); - var import_util59 = require_internal3(); + var import_util58 = require_internal3(); var tracingPolicyName2 = "tracingPolicy"; function tracingPolicy2(options = {}) { const userAgentPromise = (0, import_userAgent.getUserAgentValue)(options.userAgentPrefix); - const sanitizer = new import_util59.Sanitizer({ + const sanitizer = new import_util58.Sanitizer({ additionalAllowedQueryParameters: options.additionalAllowedQueryParameters }); const tracingClient = tryCreateTracingClient(); @@ -46597,11 +46597,11 @@ var require_response2 = __commonJS({ }); module2.exports = __toCommonJS2(response_exports); var import_core_rest_pipeline = require_commonjs6(); - var import_util59 = require_util9(); + var import_util58 = require_util9(); var originalResponse = /* @__PURE__ */ Symbol("Original FullOperationResponse"); function toCompatResponse2(response, options) { - let request3 = (0, import_util59.toWebResourceLike)(response.request); - let headers = (0, import_util59.toHttpHeadersLike)(response.headers); + let request3 = (0, import_util58.toWebResourceLike)(response.request); + let headers = (0, import_util58.toHttpHeadersLike)(response.headers); if (options?.createProxy) { return new Proxy(response, { get(target, prop, receiver) { @@ -46642,7 +46642,7 @@ var require_response2 = __commonJS({ return { ...compatResponse, headers, - request: (0, import_util59.toPipelineRequest)(compatResponse.request) + request: (0, import_util58.toPipelineRequest)(compatResponse.request) }; } } @@ -46749,7 +46749,7 @@ var require_requestPolicyFactoryPolicy = __commonJS({ requestPolicyFactoryPolicyName: () => requestPolicyFactoryPolicyName2 }); module2.exports = __toCommonJS2(requestPolicyFactoryPolicy_exports); - var import_util59 = require_util9(); + var import_util58 = require_util9(); var import_response = require_response2(); var HttpPipelineLogLevel2 = /* @__PURE__ */ ((HttpPipelineLogLevel22) => { HttpPipelineLogLevel22[HttpPipelineLogLevel22["ERROR"] = 1] = "ERROR"; @@ -46773,14 +46773,14 @@ var require_requestPolicyFactoryPolicy = __commonJS({ async sendRequest(request3, next) { let httpPipeline = { async sendRequest(httpRequest) { - const response2 = await next((0, import_util59.toPipelineRequest)(httpRequest)); + const response2 = await next((0, import_util58.toPipelineRequest)(httpRequest)); return (0, import_response.toCompatResponse)(response2, { createProxy: true }); } }; for (const factory of orderedFactories) { httpPipeline = factory.create(httpPipeline, mockRequestPolicyOptions); } - const webResourceLike = (0, import_util59.toWebResourceLike)(request3, { createProxy: true }); + const webResourceLike = (0, import_util58.toWebResourceLike)(request3, { createProxy: true }); const response = await httpPipeline.sendRequest(webResourceLike); return (0, import_response.toPipelineResponse)(response); } @@ -46815,12 +46815,12 @@ var require_httpClientAdapter = __commonJS({ }); module2.exports = __toCommonJS2(httpClientAdapter_exports); var import_response = require_response2(); - var import_util59 = require_util9(); + var import_util58 = require_util9(); function convertHttpClient2(requestPolicyClient) { return { sendRequest: async (request3) => { const response = await requestPolicyClient.sendRequest( - (0, import_util59.toWebResourceLike)(request3, { createProxy: true }) + (0, import_util58.toWebResourceLike)(request3, { createProxy: true }) ); return (0, import_response.toPipelineResponse)(response); } @@ -46858,7 +46858,7 @@ var require_commonjs9 = __commonJS({ disableKeepAlivePolicyName: () => import_disableKeepAlivePolicy.disableKeepAlivePolicyName, requestPolicyFactoryPolicyName: () => import_requestPolicyFactoryPolicy.requestPolicyFactoryPolicyName, toCompatResponse: () => import_response.toCompatResponse, - toHttpHeadersLike: () => import_util59.toHttpHeadersLike + toHttpHeadersLike: () => import_util58.toHttpHeadersLike }); module2.exports = __toCommonJS2(src_exports); var import_extendedClient = require_extendedClient(); @@ -46866,7 +46866,7 @@ var require_commonjs9 = __commonJS({ var import_requestPolicyFactoryPolicy = require_requestPolicyFactoryPolicy(); var import_disableKeepAlivePolicy = require_disableKeepAlivePolicy(); var import_httpClientAdapter = require_httpClientAdapter(); - var import_util59 = require_util9(); + var import_util58 = require_util9(); } }); @@ -169594,6 +169594,43 @@ function asHTTPError(arg) { return void 0; } +// src/github.ts +var GITHUB_DOTCOM_URL = "https://github.com"; +function parseGitHubUrl(inputUrl) { + const originalUrl = inputUrl; + if (inputUrl.indexOf("://") === -1) { + inputUrl = `https://${inputUrl}`; + } + if (!inputUrl.startsWith("http://") && !inputUrl.startsWith("https://")) { + throw new ConfigurationError(`"${originalUrl}" is not a http or https URL`); + } + let url2; + try { + url2 = new URL(inputUrl); + } catch { + throw new ConfigurationError(`"${originalUrl}" is not a valid URL`); + } + if (url2.hostname === "github.com" || url2.hostname === "api.github.com") { + return GITHUB_DOTCOM_URL; + } + if (url2.pathname.indexOf("/api/v3") !== -1) { + url2.pathname = url2.pathname.substring(0, url2.pathname.indexOf("/api/v3")); + } + if (url2.hostname.startsWith("api.")) { + url2.hostname = url2.hostname.substring(4); + } + if (!url2.pathname.endsWith("/")) { + url2.pathname = `${url2.pathname}/`; + } + return url2.toString(); +} +function getCurrentInstance(env) { + return { + url: env.getRequired("GITHUB_SERVER_URL" /* GITHUB_SERVER_URL */), + apiURL: env.getRequired("GITHUB_API_URL" /* GITHUB_API_URL */) + }; +} + // src/util.ts var BASE_DATABASE_OIDS_FILE_NAME = "base-database-oids.json"; var BROKEN_VERSIONS = ["0.0.0-20211207"]; @@ -170639,43 +170676,6 @@ retry.VERSION = VERSION7; // src/api-client.ts var import_undici = __toESM(require_undici()); -// src/github.ts -var GITHUB_DOTCOM_URL = "https://github.com"; -function parseGitHubUrl(inputUrl) { - const originalUrl = inputUrl; - if (inputUrl.indexOf("://") === -1) { - inputUrl = `https://${inputUrl}`; - } - if (!inputUrl.startsWith("http://") && !inputUrl.startsWith("https://")) { - throw new ConfigurationError(`"${originalUrl}" is not a http or https URL`); - } - let url2; - try { - url2 = new URL(inputUrl); - } catch { - throw new ConfigurationError(`"${originalUrl}" is not a valid URL`); - } - if (url2.hostname === "github.com" || url2.hostname === "api.github.com") { - return GITHUB_DOTCOM_URL; - } - if (url2.pathname.indexOf("/api/v3") !== -1) { - url2.pathname = url2.pathname.substring(0, url2.pathname.indexOf("/api/v3")); - } - if (url2.hostname.startsWith("api.")) { - url2.hostname = url2.hostname.substring(4); - } - if (!url2.pathname.endsWith("/")) { - url2.pathname = `${url2.pathname}/`; - } - return url2.toString(); -} -function getCurrentInstance(env) { - return { - url: env.getRequired("GITHUB_SERVER_URL" /* GITHUB_SERVER_URL */), - apiURL: env.getRequired("GITHUB_API_URL" /* GITHUB_API_URL */) - }; -} - // src/repository.ts function isRepositoryNwoStr(val) { return val.includes("/"); @@ -183090,7 +183090,7 @@ var import_async = __toESM(require_async(), 1); var import_path7 = require("path"); // node_modules/archiver/lib/error.js -var import_util37 = __toESM(require("util"), 1); +var import_util36 = __toESM(require("util"), 1); var ERROR_CODES = { ABORTED: "archive was aborted", DIRECTORYDIRPATHREQUIRED: "diretory dirpath argument must be a non-empty string value", @@ -183115,7 +183115,7 @@ function ArchiverError(code, data) { this.code = code; this.data = data; } -import_util37.default.inherits(ArchiverError, Error); +import_util36.default.inherits(ArchiverError, Error); // node_modules/archiver/lib/core.js var import_readable_stream2 = __toESM(require_ours(), 1); diff --git a/src/github.ts b/src/github.ts index 6350fb3f30..e39cddfb05 100644 --- a/src/github.ts +++ b/src/github.ts @@ -1,5 +1,19 @@ import { ActionsEnvVars, type ReadOnlyEnv } from "./environment"; -import { ConfigurationError } from "./util"; +import { ConfigurationError } from "./errors"; + +export enum GitHubVariant { + /** [GitHub.com](https://github.com) */ + DOTCOM = "GitHub.com", + /** [GitHub Enterprise Server](https://docs.github.com/en/enterprise-server@latest/admin/overview/about-github-enterprise-server) */ + GHES = "GitHub Enterprise Server", + /** [GitHub Enterprise Cloud with data residency](https://docs.github.com/en/enterprise-cloud@latest/admin/data-residency/about-github-enterprise-cloud-with-data-residency) */ + GHEC_DR = "GitHub Enterprise Cloud with data residency", +} + +export type GitHubVersion = + | { type: GitHubVariant.DOTCOM } + | { type: GitHubVariant.GHEC_DR } + | { type: GitHubVariant.GHES; version: string }; /** A string representing a GitHub instance address. */ export type InstanceURL = string; diff --git a/src/util.ts b/src/util.ts index d1729acdc1..032c158f45 100644 --- a/src/util.ts +++ b/src/util.ts @@ -24,6 +24,7 @@ import { type Env, } from "./environment"; import { ConfigurationError, getErrorMessage, wrapError } from "./errors"; +import { GitHubVariant, type GitHubVersion } from "./github"; import type { Language } from "./languages"; import type { Logger } from "./logging"; @@ -35,6 +36,7 @@ export { getEnv, isInTestMode, } from "./environment"; +export { GitHubVariant, type GitHubVersion } from "./github"; /** * The name of the file containing the base database OIDs, as stored in the @@ -471,20 +473,6 @@ const CODEQL_ACTION_WARNED_ABOUT_VERSION_ENV_VAR = let hasBeenWarnedAboutVersion = false; -export enum GitHubVariant { - /** [GitHub.com](https://github.com) */ - DOTCOM = "GitHub.com", - /** [GitHub Enterprise Server](https://docs.github.com/en/enterprise-server@latest/admin/overview/about-github-enterprise-server) */ - GHES = "GitHub Enterprise Server", - /** [GitHub Enterprise Cloud with data residency](https://docs.github.com/en/enterprise-cloud@latest/admin/data-residency/about-github-enterprise-cloud-with-data-residency) */ - GHEC_DR = "GitHub Enterprise Cloud with data residency", -} - -export type GitHubVersion = - | { type: GitHubVariant.DOTCOM } - | { type: GitHubVariant.GHEC_DR } - | { type: GitHubVariant.GHES; version: string }; - export function checkGitHubVersionInRange( version: GitHubVersion, logger: Logger, From dc2ed81cc7467eab39dd4658e8047f18c8048bf2 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 22:04:05 +0100 Subject: [PATCH 08/10] Remove `InstanceURL` from `util.ts` --- src/setup/repository.ts | 3 +-- src/util.ts | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/setup/repository.ts b/src/setup/repository.ts index 341a278755..ff02a1560b 100644 --- a/src/setup/repository.ts +++ b/src/setup/repository.ts @@ -2,13 +2,12 @@ import { ActionState } from "../action-common"; import { isRunningLocalAction } from "../actions-util"; import * as api from "../api-client"; import { ActionsEnvVars } from "../environment"; -import { GITHUB_DOTCOM_URL } from "../github"; +import { GITHUB_DOTCOM_URL, type InstanceURL } from "../github"; import { isRepositoryNwoStr, parseRepositoryNwo, type RepositoryNwoStr, } from "../repository"; -import { type InstanceURL } from "../util"; /** The NWO of the standard CodeQL Action repository. */ export const CODEQL_DEFAULT_ACTION_REPOSITORY = "github/codeql-action"; diff --git a/src/util.ts b/src/util.ts index 032c158f45..7ba59c6751 100644 --- a/src/util.ts +++ b/src/util.ts @@ -50,9 +50,6 @@ const BASE_DATABASE_OIDS_FILE_NAME = "base-database-oids.json"; */ const BROKEN_VERSIONS = ["0.0.0-20211207"]; -/** A string representing a GitHub instance. */ -export type InstanceURL = string; - /** * Default name of the debugging artifact. */ From a234b846e29f616853ce76128de2edc3fecc8fb8 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 22:04:24 +0100 Subject: [PATCH 09/10] Remove unused type parameters from `Env` classes --- src/environment.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/environment.ts b/src/environment.ts index 9f61070257..bbb29aab11 100644 --- a/src/environment.ts +++ b/src/environment.ts @@ -281,8 +281,8 @@ export function getOptionalEnvVar(paramName: string): string | undefined { * in tests, while clearly signalling in regular code that the consumer of the `ReadOnlyEnv` instance * will only read from it. */ -export class ReadOnlyEnv { - constructor(protected readonly vars: Record) {} +export class ReadOnlyEnv { + constructor(protected readonly vars: Record) {} /** Clones the object while detaching the underlying environment from the original. */ public clone(): this { @@ -290,7 +290,7 @@ export class ReadOnlyEnv { } /** Gets a copy of the underlying environment. */ - public get(): Record { + public get(): Record { return { ...this.vars }; } @@ -305,7 +305,7 @@ export class ReadOnlyEnv { } /** Gets the entries of the underlying `ProcessEnv`. */ - public entries(): Array<[string, T]> { + public entries(): Array<[string, string | undefined]> { return Object.entries(this.vars); } @@ -335,19 +335,17 @@ export class ReadOnlyEnv { * Use `ReadOnlyEnv` instead if you only plan to read from the environment. * This type allows writing to the environment. */ -export class Env< - T extends string | undefined = string | undefined, -> extends ReadOnlyEnv { +export class Env extends ReadOnlyEnv { private changed: boolean = false; /** Sets an environment variable. */ - public set(name: string, value: T): void { + public set(name: string, value: string): void { this.vars[name] = value; this.changed = true; } /** Sets all environment variables given by `vars`. */ - public setAll(vars: Record): void { + public setAll(vars: Record): void { for (const [key, val] of Object.entries(vars)) { this.set(key, val); } @@ -361,7 +359,7 @@ export class Env< * @param name The name of the environment variable to set and export. * @param val The value to set and export for the environment variable. */ - public export(name: string, val: T): void { + public export(name: string, val: string): void { // Setting the environment variable for this instance is always OK, including // in tests, since we use fresh `Env` instances whenever needed. This allows // tests to pass that rely on that part of the `core.exportVariable` behaviour. From c252c71195d4610143364e3eae587bc2ba094b60 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 16 Oct 2026 22:15:06 +0100 Subject: [PATCH 10/10] Move `initializeEnvironment` out of `util.ts` --- lib/entry-points.js | 48 ++++++++++++++-------- src/actions-util.test.ts | 9 ++-- src/analyze-action.ts | 2 +- src/api-client.test.ts | 4 +- src/autobuild-action.ts | 15 +++++-- src/codeql.test.ts | 4 +- src/database-upload.test.ts | 11 ++--- src/environment.ts | 12 ++++++ src/feature-flags.test.ts | 5 ++- src/feature-flags/offline-features.test.ts | 4 +- src/init-action.ts | 3 +- src/setup-codeql-action.ts | 3 +- src/setup-codeql.test.ts | 18 ++++---- src/setup/repository.test.ts | 3 +- src/upload-lib.test.ts | 5 ++- src/upload-sarif-action.ts | 13 +++--- src/util.ts | 14 ------- 17 files changed, 93 insertions(+), 80 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index 841bb36a12..9e674a2c1c 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -166182,6 +166182,17 @@ var Env = class extends ReadOnlyEnv { core.exportVariable(name, val); } } + /** + * Set some initial environment variables that we can set even without + * knowing what version of CodeQL we're running. + */ + initialise(version) { + this.export("CODEQL_ACTION_FEATURE_MULTI_LANGUAGE" /* FEATURE_MULTI_LANGUAGE */, "false"); + this.export("CODEQL_ACTION_FEATURE_SANDWICH" /* FEATURE_SANDWICH */, "false"); + this.export("CODEQL_ACTION_FEATURE_SARIF_COMBINE" /* FEATURE_SARIF_COMBINE */, "true"); + this.export("CODEQL_ACTION_FEATURE_WILL_UPLOAD" /* FEATURE_WILL_UPLOAD */, "true"); + this.export("CODEQL_ACTION_VERSION" /* VERSION */, version); + } /** Gets a value indicating whether `set` was called at least once. */ hasChanged() { return this.changed; @@ -169892,13 +169903,6 @@ var ExhaustivityCheckingError = class extends Error { function assertNever(value) { throw new ExhaustivityCheckingError(value); } -function initializeEnvironment(version, env = getEnv()) { - env.export("CODEQL_ACTION_FEATURE_MULTI_LANGUAGE" /* FEATURE_MULTI_LANGUAGE */, "false"); - env.export("CODEQL_ACTION_FEATURE_SANDWICH" /* FEATURE_SANDWICH */, "false"); - env.export("CODEQL_ACTION_FEATURE_SARIF_COMBINE" /* FEATURE_SARIF_COMBINE */, "true"); - env.export("CODEQL_ACTION_FEATURE_WILL_UPLOAD" /* FEATURE_WILL_UPLOAD */, "true"); - env.export("CODEQL_ACTION_VERSION" /* VERSION */, version); -} function getBaseDatabaseOidsFilePath(config) { return path.join(config.dbLocation, BASE_DATABASE_OIDS_FILE_NAME); } @@ -180759,7 +180763,7 @@ async function run(action) { let dependencyCacheResults; let databaseUploadResults = []; try { - initializeEnvironment(getActionVersion()); + action.env.initialise(getActionVersion()); persistInputs(); const statusReportBase = await createStatusReportBase( "finish" /* Analyze */, @@ -185938,8 +185942,8 @@ async function runWrapper2() { // src/autobuild-action.ts var core17 = __toESM(require_core()); -async function sendCompletedStatusReport(config, logger2, startedAt, allLanguages, failingLanguage, cause) { - initializeEnvironment(getActionVersion()); +async function sendCompletedStatusReport(env, config, logger2, startedAt, allLanguages, failingLanguage, cause) { + env.initialise(getActionVersion()); const status = getActionsStatus(cause, failingLanguage); const statusReportBase = await createStatusReportBase( "autobuild" /* Autobuild */, @@ -186011,6 +186015,7 @@ async function run2({ `We were unable to automatically build your code. Please replace the call to the autobuild action with your custom build steps. ${error3.message}` ); await sendCompletedStatusReport( + env, config, logger2, startedAt, @@ -186021,7 +186026,13 @@ async function run2({ return; } env.export("CODEQL_ACTION_AUTOBUILD_DID_COMPLETE_SUCCESSFULLY" /* AUTOBUILD_DID_COMPLETE_SUCCESSFULLY */, "true"); - await sendCompletedStatusReport(config, logger2, startedAt, languages ?? []); + await sendCompletedStatusReport( + env, + config, + logger2, + startedAt, + languages ?? [] + ); } var autobuild = { name: "autobuild" /* Autobuild */, @@ -186449,7 +186460,7 @@ async function run3(actionState) { let toolsSource; let toolsVersion; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); persistInputs(); apiDetails = { auth: getRequiredInput("token"), @@ -187492,7 +187503,7 @@ async function run6(actionState) { let toolsSource; let toolsVersion; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); const apiDetails = { auth: getRequiredInput("token"), externalRepoAuth: getOptionalInput("external-repository-token"), @@ -188444,9 +188455,10 @@ async function sendSuccessStatusReport2(startedAt, uploadStats, logger2) { await sendStatusReport(statusReport); } } -async function run8({ startedAt, logger: logger2 }) { +async function run8(action) { + const logger2 = action.logger; try { - initializeEnvironment(getActionVersion()); + action.env.initialise(getActionVersion()); const gitHubVersion = await getGitHubVersion(); checkActionVersion(getActionVersion(), gitHubVersion); persistInputs(); @@ -188460,7 +188472,7 @@ async function run8({ startedAt, logger: logger2 }) { const startingStatusReportBase = await createStatusReportBase( "upload-sarif" /* UploadSarif */, "starting", - startedAt, + action.startedAt, void 0, await checkDiskUsage(logger2), logger2 @@ -188503,7 +188515,7 @@ async function run8({ startedAt, logger: logger2 }) { } } await sendSuccessStatusReport2( - startedAt, + action.startedAt, codeScanningResult?.statusReport || {}, logger2 ); @@ -188514,7 +188526,7 @@ async function run8({ startedAt, logger: logger2 }) { const errorStatusReportBase = await createStatusReportBase( "upload-sarif" /* UploadSarif */, getActionsStatus(error3), - startedAt, + action.startedAt, void 0, await checkDiskUsage(logger2), logger2, diff --git a/src/actions-util.test.ts b/src/actions-util.test.ts index 17cf96a4a5..8ef947cdc2 100644 --- a/src/actions-util.test.ts +++ b/src/actions-util.test.ts @@ -12,8 +12,8 @@ import { import { computeAutomationID } from "./api-client"; import { EnvVar } from "./environment"; import { getRunnerLogger } from "./logging"; -import { RecordingLogger, setupTests } from "./testing-utils"; -import { initializeEnvironment, withTmpDir } from "./util"; +import { getTestEnv, RecordingLogger, setupTests } from "./testing-utils"; +import { withTmpDir } from "./util"; setupTests(test); @@ -228,8 +228,9 @@ test.serial( ); test.serial("initializeEnvironment", (t) => { - initializeEnvironment("1.2.3"); - t.deepEqual(process.env[EnvVar.VERSION], "1.2.3"); + const env = getTestEnv(); + env.initialise("1.2.3"); + t.deepEqual(env.getOptional(EnvVar.VERSION), "1.2.3"); }); test.serial("fixCodeQualityCategory", (t) => { diff --git a/src/analyze-action.ts b/src/analyze-action.ts index 9efbb529b0..f7cad45f39 100644 --- a/src/analyze-action.ts +++ b/src/analyze-action.ts @@ -238,7 +238,7 @@ async function run(action: ActionState<["Base", "Logger", "Env", "Actions"]>) { let databaseUploadResults: DatabaseUploadResult[] = []; try { - util.initializeEnvironment(actionsUtil.getActionVersion()); + action.env.initialise(actionsUtil.getActionVersion()); // Make inputs accessible in the `post` step, details at // https://github.com/github/codeql-action/issues/2553 diff --git a/src/api-client.test.ts b/src/api-client.test.ts index 2bb878f3b7..34ebd52e9d 100644 --- a/src/api-client.test.ts +++ b/src/api-client.test.ts @@ -7,7 +7,7 @@ import { ProxyAgent } from "undici"; import * as actionsUtil from "./actions-util"; import * as api from "./api-client"; import { DO_NOT_RETRY_STATUSES } from "./api-client"; -import { ActionsEnvVars, RegistryProxyVars } from "./environment"; +import { ActionsEnvVars, RegistryProxyVars, getEnv } from "./environment"; import { GITHUB_DOTCOM_API_URL, GITHUB_DOTCOM_URL } from "./github"; import { callee, @@ -21,7 +21,7 @@ import * as util from "./util"; setupTests(test); test.beforeEach(() => { - util.initializeEnvironment(actionsUtil.getActionVersion()); + getEnv().initialise(actionsUtil.getActionVersion()); }); test.serial("getApiClient", async (t) => { diff --git a/src/autobuild-action.ts b/src/autobuild-action.ts index 18aad11855..3e2eb1a3f2 100644 --- a/src/autobuild-action.ts +++ b/src/autobuild-action.ts @@ -10,7 +10,7 @@ import { getGitHubVersion } from "./api-client"; import { determineAutobuildLanguages, runAutobuild } from "./autobuild"; import { getCodeQL } from "./codeql"; import { Config, getConfig } from "./config-utils"; -import { EnvVar } from "./environment"; +import { EnvVar, type Env } from "./environment"; import { Language } from "./languages"; import { Logger } from "./logging"; import { @@ -26,7 +26,6 @@ import { checkDiskUsage, checkGitHubVersionInRange, ConfigurationError, - initializeEnvironment, wrapError, } from "./util"; @@ -38,6 +37,7 @@ interface AutobuildStatusReport extends StatusReportBase { } async function sendCompletedStatusReport( + env: Env, config: Config | undefined, logger: Logger, startedAt: Date, @@ -45,7 +45,7 @@ async function sendCompletedStatusReport( failingLanguage?: string, cause?: Error, ) { - initializeEnvironment(getActionVersion()); + env.initialise(getActionVersion()); const status = getActionsStatus(cause, failingLanguage); const statusReportBase = await createStatusReportBase( @@ -129,6 +129,7 @@ async function run({ `We were unable to automatically build your code. Please replace the call to the autobuild action with your custom build steps. ${error.message}`, ); await sendCompletedStatusReport( + env, config, logger, startedAt, @@ -141,7 +142,13 @@ async function run({ env.export(EnvVar.AUTOBUILD_DID_COMPLETE_SUCCESSFULLY, "true"); - await sendCompletedStatusReport(config, logger, startedAt, languages ?? []); + await sendCompletedStatusReport( + env, + config, + logger, + startedAt, + languages ?? [], + ); } /** Defines the `autobuild` Action. */ diff --git a/src/codeql.test.ts b/src/codeql.test.ts index e70dcd99f9..e07d1b811d 100644 --- a/src/codeql.test.ts +++ b/src/codeql.test.ts @@ -21,6 +21,7 @@ import { import type { Config } from "./config-utils"; import * as defaults from "./defaults.json"; import { DocUrl } from "./doc-url"; +import { getEnv } from "./environment"; import { BuiltInLanguage } from "./languages"; import { getRunnerLogger } from "./logging"; import { ToolsSource } from "./setup-codeql"; @@ -37,14 +38,13 @@ import { } from "./testing-utils"; import { ToolsDownloadStatusReport } from "./tools-download"; import * as util from "./util"; -import { initializeEnvironment } from "./util"; setupTests(test); let stubConfig: Config; test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); stubConfig = createTestConfig({ languages: [BuiltInLanguage.cpp], diff --git a/src/database-upload.test.ts b/src/database-upload.test.ts index 908994112e..7d7145dd36 100644 --- a/src/database-upload.test.ts +++ b/src/database-upload.test.ts @@ -15,6 +15,7 @@ import { cleanupAndUploadDatabases, uploadBundledDatabase, } from "./database-upload"; +import { getEnv } from "./environment"; import { Feature } from "./feature-flags"; import * as gitUtils from "./git-utils"; import { BuiltInLanguage } from "./languages"; @@ -31,18 +32,12 @@ import { setupActionsVars, setupTests, } from "./testing-utils"; -import { - CleanupLevel, - GitHubVariant, - HTTPError, - initializeEnvironment, - withTmpDir, -} from "./util"; +import { CleanupLevel, GitHubVariant, HTTPError, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); const testRepoName: RepositoryNwo = { owner: "github", repo: "example" }; diff --git a/src/environment.ts b/src/environment.ts index bbb29aab11..cff462fa3c 100644 --- a/src/environment.ts +++ b/src/environment.ts @@ -371,6 +371,18 @@ export class Env extends ReadOnlyEnv { } } + /** + * Set some initial environment variables that we can set even without + * knowing what version of CodeQL we're running. + */ + public initialise(version: string) { + this.export(EnvVar.FEATURE_MULTI_LANGUAGE, "false"); + this.export(EnvVar.FEATURE_SANDWICH, "false"); + this.export(EnvVar.FEATURE_SARIF_COMBINE, "true"); + this.export(EnvVar.FEATURE_WILL_UPLOAD, "true"); + this.export(EnvVar.VERSION, version); + } + /** Gets a value indicating whether `set` was called at least once. */ public hasChanged(): boolean { return this.changed; diff --git a/src/feature-flags.test.ts b/src/feature-flags.test.ts index d8b5eea04d..7b1c1ef3e5 100644 --- a/src/feature-flags.test.ts +++ b/src/feature-flags.test.ts @@ -4,6 +4,7 @@ import * as path from "path"; import test from "ava"; import * as defaults from "./defaults.json"; +import { getEnv } from "./environment"; import { Feature, featureConfig, @@ -26,12 +27,12 @@ import { setupTests, stubFeatureFlagApiEndpoint, } from "./testing-utils"; -import { GitHubVariant, initializeEnvironment, withTmpDir } from "./util"; +import { GitHubVariant, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); test.serial( diff --git a/src/feature-flags/offline-features.test.ts b/src/feature-flags/offline-features.test.ts index 2870ef3b8a..1c3d2a8c1b 100644 --- a/src/feature-flags/offline-features.test.ts +++ b/src/feature-flags/offline-features.test.ts @@ -8,7 +8,7 @@ import { LoggedMessage, setupTests, } from "../testing-utils"; -import { GitHubVariant, initializeEnvironment, withTmpDir } from "../util"; +import { getEnv, GitHubVariant, withTmpDir } from "../util"; import { assertAllFeaturesHaveDefaultValues, @@ -18,7 +18,7 @@ import { setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); test("OfflineFeatures makes no API requests", async (t) => { diff --git a/src/init-action.ts b/src/init-action.ts index 7f9178304c..b5749e9c8d 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -92,7 +92,6 @@ import { DEFAULT_DEBUG_DATABASE_NAME, getCodeQLMemoryLimit, getThreadsFlagValue, - initializeEnvironment, ConfigurationError, wrapError, checkActionVersion, @@ -225,7 +224,7 @@ async function run( let toolsVersion: string; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); // Make inputs accessible in the `post` step. persistInputs(); diff --git a/src/setup-codeql-action.ts b/src/setup-codeql-action.ts index 757b26fac5..1bbfdacecc 100644 --- a/src/setup-codeql-action.ts +++ b/src/setup-codeql-action.ts @@ -38,7 +38,6 @@ import { checkDiskUsage, checkForTimeout, checkGitHubVersionInRange, - initializeEnvironment, ConfigurationError, wrapError, checkActionVersion, @@ -108,7 +107,7 @@ async function run( let toolsVersion: string; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); const apiDetails = { auth: getRequiredInput("token"), diff --git a/src/setup-codeql.test.ts b/src/setup-codeql.test.ts index 7dfac19148..319729acd7 100644 --- a/src/setup-codeql.test.ts +++ b/src/setup-codeql.test.ts @@ -11,7 +11,13 @@ import * as sinon from "sinon"; import * as actionsUtil from "./actions-util"; import * as api from "./api-client"; import * as diagnostics from "./diagnostics"; -import { ActionsEnvVars, Env, EnvVar, ReadOnlyEnv } from "./environment"; +import { + ActionsEnvVars, + Env, + EnvVar, + getEnv, + ReadOnlyEnv, +} from "./environment"; import { Feature } from "./feature-flags"; import { BuiltInLanguage } from "./languages"; import { getRunnerLogger } from "./logging"; @@ -37,18 +43,12 @@ import { setupTests, } from "./testing-utils"; import * as toolsDownload from "./tools-download"; -import { - getErrorMessage, - GitHubVariant, - HTTPError, - initializeEnvironment, - withTmpDir, -} from "./util"; +import { getErrorMessage, GitHubVariant, HTTPError, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); function stubDownloadAndExtract() { diff --git a/src/setup/repository.test.ts b/src/setup/repository.test.ts index d1c6d034c0..9fabd84884 100644 --- a/src/setup/repository.test.ts +++ b/src/setup/repository.test.ts @@ -6,7 +6,6 @@ import * as sinon from "sinon"; import * as actionsUtil from "../actions-util"; import { ActionsEnvVars } from "../environment"; import { callee, getTestEnv, setupTests } from "../testing-utils"; -import { initializeEnvironment } from "../util"; import { getCodeQLActionRepository } from "./repository"; @@ -16,7 +15,7 @@ test.serial("getCodeQLActionRepository", async (t) => { const initialEnv = getTestEnv({ [ActionsEnvVars.RUNNER_TEMP]: path.dirname(__dirname), }); - initializeEnvironment("1.2.3", initialEnv); + initialEnv.initialise("1.2.3"); const target = callee(getCodeQLActionRepository) .withArgs() diff --git a/src/upload-lib.test.ts b/src/upload-lib.test.ts index 2c27d56c1c..393e3720d6 100644 --- a/src/upload-lib.test.ts +++ b/src/upload-lib.test.ts @@ -10,17 +10,18 @@ import * as analyses from "./analyses"; import { AnalysisKind, CodeQuality, CodeScanning } from "./analyses"; import * as api from "./api-client"; import * as diffUtils from "./diff-informed-analysis-utils"; +import { getEnv } from "./environment"; import { getRunnerLogger, Logger } from "./logging"; import * as sarif from "./sarif"; import { setupTests } from "./testing-utils"; import * as uploadLib from "./upload-lib"; import { UploadPayload } from "./upload-lib/types"; -import { GitHubVariant, initializeEnvironment, withTmpDir } from "./util"; +import { GitHubVariant, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); test.serial("validateSarifFileSchema - valid", (t) => { diff --git a/src/upload-sarif-action.ts b/src/upload-sarif-action.ts index d3437510ce..7d67c55675 100644 --- a/src/upload-sarif-action.ts +++ b/src/upload-sarif-action.ts @@ -23,7 +23,6 @@ import { ConfigurationError, checkActionVersion, checkDiskUsage, - initializeEnvironment, shouldSkipSarifUpload, wrapError, } from "./util"; @@ -54,11 +53,13 @@ async function sendSuccessStatusReport( } } -async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { +async function run(action: ActionState<["Base", "Env", "Logger"]>) { // To capture errors appropriately, keep as much code within the try-catch as // possible, and only use safe functions outside. + const logger = action.logger; + try { - initializeEnvironment(getActionVersion()); + action.env.initialise(getActionVersion()); const gitHubVersion = await getGitHubVersion(); checkActionVersion(getActionVersion(), gitHubVersion); @@ -77,7 +78,7 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { const startingStatusReportBase = await createStatusReportBase( ActionName.UploadSarif, "starting", - startedAt, + action.startedAt, undefined, await checkDiskUsage(logger), logger, @@ -131,7 +132,7 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { // so we can't wait for that here. } await sendSuccessStatusReport( - startedAt, + action.startedAt, codeScanningResult?.statusReport || {}, logger, ); @@ -147,7 +148,7 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { const errorStatusReportBase = await createStatusReportBase( ActionName.UploadSarif, getActionsStatus(error), - startedAt, + action.startedAt, undefined, await checkDiskUsage(logger), logger, diff --git a/src/util.ts b/src/util.ts index 7ba59c6751..b9f51011eb 100644 --- a/src/util.ts +++ b/src/util.ts @@ -20,8 +20,6 @@ import { getRequiredEnvParam, isInTestMode, exportEnvVar, - getEnv, - type Env, } from "./environment"; import { ConfigurationError, getErrorMessage, wrapError } from "./errors"; import { GitHubVariant, type GitHubVersion } from "./github"; @@ -538,18 +536,6 @@ export function assertNever(value: never): never { throw new ExhaustivityCheckingError(value); } -/** - * Set some initial environment variables that we can set even without - * knowing what version of CodeQL we're running. - */ -export function initializeEnvironment(version: string, env: Env = getEnv()) { - env.export(EnvVar.FEATURE_MULTI_LANGUAGE, "false"); - env.export(EnvVar.FEATURE_SANDWICH, "false"); - env.export(EnvVar.FEATURE_SARIF_COMBINE, "true"); - env.export(EnvVar.FEATURE_WILL_UPLOAD, "true"); - env.export(EnvVar.VERSION, version); -} - export function getBaseDatabaseOidsFilePath( config: ActionConfig<"dbLocation">, ): string {