fix(core): cache CLI version to ensure consistency during sessions (#18793)

This commit is contained in:
Sehoon Shon
2026-02-11 12:01:50 -05:00
committed by GitHub
parent f5dd1068f6
commit 34a47a51f4
3 changed files with 37 additions and 4 deletions

View File

@@ -18,6 +18,7 @@ import { LoggingContentGenerator } from './loggingContentGenerator.js';
import { loadApiKey } from './apiKeyCredentialStorage.js';
import { FakeContentGenerator } from './fakeContentGenerator.js';
import { RecordingContentGenerator } from './recordingContentGenerator.js';
import { resetVersionCache } from '../utils/version.js';
vi.mock('../code_assist/codeAssist.js');
vi.mock('@google/genai');
@@ -35,6 +36,7 @@ const mockConfig = {
describe('createContentGenerator', () => {
beforeEach(() => {
resetVersionCache();
vi.clearAllMocks();
});

View File

@@ -5,7 +5,7 @@
*/
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { getVersion } from './version.js';
import { getVersion, resetVersionCache } from './version.js';
import { getPackageJson } from './package.js';
vi.mock('./package.js', () => ({
@@ -17,6 +17,8 @@ describe('version', () => {
beforeEach(() => {
vi.resetModules();
vi.clearAllMocks();
resetVersionCache();
process.env = { ...originalEnv };
vi.mocked(getPackageJson).mockResolvedValue({ version: '1.0.0' });
});
@@ -43,4 +45,20 @@ describe('version', () => {
const version = await getVersion();
expect(version).toBe('unknown');
});
it('should cache the version and only call getPackageJson once', async () => {
delete process.env['CLI_VERSION'];
vi.mocked(getPackageJson).mockResolvedValue({ version: '1.2.3' });
const version1 = await getVersion();
expect(version1).toBe('1.2.3');
expect(getPackageJson).toHaveBeenCalledTimes(1);
// Change the mock value to simulate an update on disk
vi.mocked(getPackageJson).mockResolvedValue({ version: '2.0.0' });
const version2 = await getVersion();
expect(version2).toBe('1.2.3'); // Should still be the cached version
expect(getPackageJson).toHaveBeenCalledTimes(1); // Should not have been called again
});
});

View File

@@ -11,7 +11,20 @@ import path from 'node:path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export async function getVersion(): Promise<string> {
const pkgJson = await getPackageJson(__dirname);
return process.env['CLI_VERSION'] || pkgJson?.version || 'unknown';
let versionPromise: Promise<string> | undefined;
export function getVersion(): Promise<string> {
if (versionPromise) {
return versionPromise;
}
versionPromise = (async () => {
const pkgJson = await getPackageJson(__dirname);
return process.env['CLI_VERSION'] || pkgJson?.version || 'unknown';
})();
return versionPromise;
}
/** For testing purposes only */
export function resetVersionCache(): void {
versionPromise = undefined;
}