Remove caching mechanism

This commit is contained in:
Henry Mercer
2025-12-17 11:56:23 +00:00
parent 32795b3c52
commit e052dbd57d
2 changed files with 23 additions and 105 deletions

View File

@@ -465,59 +465,7 @@ test("getGitVersionOrThrow throws when git command fails", async (t) => {
} }
}); });
test("getGitVersion returns version and caches it", async (t) => {
gitUtils.resetCachedGitVersion();
const runGitCommandStub = sinon
.stub(gitUtils as any, "runGitCommand")
.resolves("git version 2.40.0\n");
const messages: LoggedMessage[] = [];
const logger = getRecordingLogger(messages);
try {
// First call should fetch and cache
const version1 = await gitUtils.getGitVersion(logger);
t.is(version1, "2.40.0");
t.is(runGitCommandStub.callCount, 1);
// Second call should use cache
const version2 = await gitUtils.getGitVersion(logger);
t.is(version2, "2.40.0");
t.is(runGitCommandStub.callCount, 1); // Should still be 1
} finally {
runGitCommandStub.restore();
gitUtils.resetCachedGitVersion();
}
});
test("getGitVersion returns undefined when version cannot be determined", async (t) => {
gitUtils.resetCachedGitVersion();
const runGitCommandStub = sinon
.stub(gitUtils as any, "runGitCommand")
.rejects(new Error("git not found"));
const messages: LoggedMessage[] = [];
const logger = getRecordingLogger(messages);
try {
const version = await gitUtils.getGitVersion(logger);
t.is(version, undefined);
t.true(
messages.some(
(m) =>
m.type === "debug" &&
typeof m.message === "string" &&
m.message.includes("Could not determine Git version"),
),
);
} finally {
runGitCommandStub.restore();
gitUtils.resetCachedGitVersion();
}
});
test("gitVersionAtLeast returns true for version meeting requirement", async (t) => { test("gitVersionAtLeast returns true for version meeting requirement", async (t) => {
gitUtils.resetCachedGitVersion();
const runGitCommandStub = sinon const runGitCommandStub = sinon
.stub(gitUtils as any, "runGitCommand") .stub(gitUtils as any, "runGitCommand")
.resolves("git version 2.40.0\n"); .resolves("git version 2.40.0\n");
@@ -537,12 +485,10 @@ test("gitVersionAtLeast returns true for version meeting requirement", async (t)
); );
} finally { } finally {
runGitCommandStub.restore(); runGitCommandStub.restore();
gitUtils.resetCachedGitVersion();
} }
}); });
test("gitVersionAtLeast returns false for version not meeting requirement", async (t) => { test("gitVersionAtLeast returns false for version not meeting requirement", async (t) => {
gitUtils.resetCachedGitVersion();
const runGitCommandStub = sinon const runGitCommandStub = sinon
.stub(gitUtils as any, "runGitCommand") .stub(gitUtils as any, "runGitCommand")
.resolves("git version 2.30.0\n"); .resolves("git version 2.30.0\n");
@@ -555,12 +501,10 @@ test("gitVersionAtLeast returns false for version not meeting requirement", asyn
t.false(result); t.false(result);
} finally { } finally {
runGitCommandStub.restore(); runGitCommandStub.restore();
gitUtils.resetCachedGitVersion();
} }
}); });
test("gitVersionAtLeast returns false when version cannot be determined", async (t) => { test("gitVersionAtLeast returns false when version cannot be determined", async (t) => {
gitUtils.resetCachedGitVersion();
const runGitCommandStub = sinon const runGitCommandStub = sinon
.stub(gitUtils as any, "runGitCommand") .stub(gitUtils as any, "runGitCommand")
.rejects(new Error("git not found")); .rejects(new Error("git not found"));
@@ -581,6 +525,5 @@ test("gitVersionAtLeast returns false when version cannot be determined", async
); );
} finally { } finally {
runGitCommandStub.restore(); runGitCommandStub.restore();
gitUtils.resetCachedGitVersion();
} }
}); });

View File

@@ -23,16 +23,6 @@ import {
*/ */
export const GIT_MINIMUM_VERSION_FOR_OVERLAY = "2.38.0"; export const GIT_MINIMUM_VERSION_FOR_OVERLAY = "2.38.0";
/** Cached git version to avoid recomputing it multiple times. */
let cachedGitVersion: string | undefined;
/**
* Resets the cached git version. This is intended for use in tests only.
*/
export function resetCachedGitVersion(): void {
cachedGitVersion = undefined;
}
/** /**
* Gets the version of Git installed on the system and throws an error if * Gets the version of Git installed on the system and throws an error if
* the version cannot be determined. * the version cannot be determined.
@@ -55,27 +45,6 @@ export async function getGitVersionOrThrow(): Promise<string> {
throw new Error(`Could not parse Git version from output: ${stdout.trim()}`); throw new Error(`Could not parse Git version from output: ${stdout.trim()}`);
} }
/**
* Gets the cached Git version, or fetches and caches it if not yet cached.
*
* @param logger A logger to use for logging errors.
* @returns The cached Git version, or undefined if the version could not be determined.
*/
export async function getGitVersion(
logger: Logger,
): Promise<string | undefined> {
if (cachedGitVersion !== undefined) {
return cachedGitVersion;
}
try {
cachedGitVersion = await getGitVersionOrThrow();
return cachedGitVersion;
} catch (e) {
logger.debug(`Could not determine Git version: ${getErrorMessage(e)}`);
return undefined;
}
}
/** /**
* Logs the Git version as a telemetry diagnostic. Should be called once during * Logs the Git version as a telemetry diagnostic. Should be called once during
* initialization after the config is available. * initialization after the config is available.
@@ -87,19 +56,23 @@ export async function logGitVersionTelemetry(
config: Config, config: Config,
logger: Logger, logger: Logger,
): Promise<void> { ): Promise<void> {
const version = await getGitVersion(logger); try {
if (version !== undefined && config.languages.length > 0) { const version = await getGitVersionOrThrow();
addDiagnostic( if (config.languages.length > 0) {
config, addDiagnostic(
// Arbitrarily choose the first language. We could also choose all languages, but that config,
// increases the risk of misinterpreting the data. // Arbitrarily choose the first language. We could also choose all languages, but that
config.languages[0], // increases the risk of misinterpreting the data.
makeTelemetryDiagnostic( config.languages[0],
"codeql-action/git-version-telemetry", makeTelemetryDiagnostic(
"Git version telemetry", "codeql-action/git-version-telemetry",
{ gitVersion: version }, "Git version telemetry",
), { gitVersion: version },
); ),
);
}
} catch (e) {
logger.debug(`Could not determine Git version: ${getErrorMessage(e)}`);
} }
} }
@@ -115,12 +88,14 @@ export async function gitVersionAtLeast(
requiredVersion: string, requiredVersion: string,
logger: Logger, logger: Logger,
): Promise<boolean> { ): Promise<boolean> {
const version = await getGitVersion(logger); try {
if (version === undefined) { const version = await getGitVersionOrThrow();
logger.debug(`Installed Git version is ${version}.`);
return semver.gte(version, requiredVersion);
} catch (e) {
logger.debug(`Could not determine Git version: ${getErrorMessage(e)}`);
return false; return false;
} }
logger.debug(`Installed Git version is ${version}.`);
return semver.gte(version, requiredVersion);
} }
export const runGitCommand = async function ( export const runGitCommand = async function (