mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-10 14:10:37 -07:00
Mk/release hotfix (#8633)
This commit is contained in:
@@ -85,27 +85,73 @@ function getNightlyVersion() {
|
||||
};
|
||||
}
|
||||
|
||||
function getStableVersion() {
|
||||
const { latestVersion, latestTag } = getAndVerifyTags(
|
||||
function validateVersion(version, format, name) {
|
||||
const versionRegex = {
|
||||
'X.Y.Z': /^\d+\.\d+\.\d+$/,
|
||||
'X.Y.Z-preview.N': /^\d+\.\d+\.\d+-preview\.\d+$/,
|
||||
};
|
||||
|
||||
if (!versionRegex[format] || !versionRegex[format].test(version)) {
|
||||
throw new Error(
|
||||
`Invalid ${name}: ${version}. Must be in ${format} format.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function getStableVersion(args) {
|
||||
const { latestVersion: latestPreviewVersion } = getAndVerifyTags(
|
||||
'preview',
|
||||
'v*-preview*',
|
||||
);
|
||||
let releaseVersion;
|
||||
if (args.stable_version_override) {
|
||||
const overrideVersion = args.stable_version_override.replace(/^v/, '');
|
||||
validateVersion(overrideVersion, 'X.Y.Z', 'stable_version_override');
|
||||
releaseVersion = overrideVersion;
|
||||
} else {
|
||||
releaseVersion = latestPreviewVersion.replace(/-preview.*/, '');
|
||||
}
|
||||
|
||||
const { latestTag: previousStableTag } = getAndVerifyTags(
|
||||
'latest',
|
||||
'v[0-9].[0-9].[0-9]',
|
||||
);
|
||||
|
||||
return {
|
||||
releaseVersion: latestVersion.replace(/-preview.*/, ''),
|
||||
releaseVersion,
|
||||
npmTag: 'latest',
|
||||
previousReleaseTag: latestTag,
|
||||
previousReleaseTag: previousStableTag,
|
||||
};
|
||||
}
|
||||
|
||||
function getPreviewVersion() {
|
||||
const { latestVersion, latestTag } = getAndVerifyTags(
|
||||
function getPreviewVersion(args) {
|
||||
const { latestVersion: latestNightlyVersion } = getAndVerifyTags(
|
||||
'nightly',
|
||||
'v*-nightly*',
|
||||
);
|
||||
let releaseVersion;
|
||||
if (args.preview_version_override) {
|
||||
const overrideVersion = args.preview_version_override.replace(/^v/, '');
|
||||
validateVersion(
|
||||
overrideVersion,
|
||||
'X.Y.Z-preview.N',
|
||||
'preview_version_override',
|
||||
);
|
||||
releaseVersion = overrideVersion;
|
||||
} else {
|
||||
releaseVersion =
|
||||
latestNightlyVersion.replace(/-nightly.*/, '') + '-preview.0';
|
||||
}
|
||||
|
||||
const { latestTag: previousPreviewTag } = getAndVerifyTags(
|
||||
'preview',
|
||||
'v*-preview*',
|
||||
);
|
||||
|
||||
return {
|
||||
releaseVersion: latestVersion.replace(/-nightly.*/, '') + '-preview',
|
||||
releaseVersion,
|
||||
npmTag: 'preview',
|
||||
previousReleaseTag: latestTag,
|
||||
previousReleaseTag: previousPreviewTag,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -144,10 +190,10 @@ export function getVersion(options = {}) {
|
||||
versionData = getNightlyVersion();
|
||||
break;
|
||||
case 'stable':
|
||||
versionData = getStableVersion();
|
||||
versionData = getStableVersion(args);
|
||||
break;
|
||||
case 'preview':
|
||||
versionData = getPreviewVersion();
|
||||
versionData = getPreviewVersion(args);
|
||||
break;
|
||||
case 'patch':
|
||||
versionData = getPatchVersion(args['patch-from']);
|
||||
|
||||
@@ -52,17 +52,37 @@ describe('getVersion', () => {
|
||||
const result = getVersion({ type: 'stable' });
|
||||
expect(result.releaseVersion).toBe('0.5.0');
|
||||
expect(result.npmTag).toBe('latest');
|
||||
expect(result.previousReleaseTag).toBe('v0.5.0-preview-2');
|
||||
expect(result.previousReleaseTag).toBe('v0.4.1');
|
||||
});
|
||||
|
||||
it('should use the override version for stable if provided', () => {
|
||||
vi.mocked(execSync).mockImplementation(mockExecSync);
|
||||
const result = getVersion({
|
||||
type: 'stable',
|
||||
stable_version_override: '1.2.3',
|
||||
});
|
||||
expect(result.releaseVersion).toBe('1.2.3');
|
||||
expect(result.npmTag).toBe('latest');
|
||||
expect(result.previousReleaseTag).toBe('v0.4.1');
|
||||
});
|
||||
|
||||
it('should calculate the next preview version from the latest nightly', () => {
|
||||
vi.mocked(execSync).mockImplementation(mockExecSync);
|
||||
const result = getVersion({ type: 'preview' });
|
||||
expect(result.releaseVersion).toBe('0.6.0-preview');
|
||||
expect(result.releaseVersion).toBe('0.6.0-preview.0');
|
||||
expect(result.npmTag).toBe('preview');
|
||||
expect(result.previousReleaseTag).toBe(
|
||||
'v0.6.0-nightly.20250910.a31830a3',
|
||||
);
|
||||
expect(result.previousReleaseTag).toBe('v0.5.0-preview-2');
|
||||
});
|
||||
|
||||
it('should use the override version for preview if provided', () => {
|
||||
vi.mocked(execSync).mockImplementation(mockExecSync);
|
||||
const result = getVersion({
|
||||
type: 'preview',
|
||||
preview_version_override: '4.5.6-preview.0',
|
||||
});
|
||||
expect(result.releaseVersion).toBe('4.5.6-preview.0');
|
||||
expect(result.npmTag).toBe('preview');
|
||||
expect(result.previousReleaseTag).toBe('v0.5.0-preview-2');
|
||||
});
|
||||
|
||||
it('should calculate the next nightly version from the latest nightly', () => {
|
||||
@@ -92,6 +112,44 @@ describe('getVersion', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('Failure Path - Invalid Overrides', () => {
|
||||
it('should throw an error for an invalid stable_version_override', () => {
|
||||
vi.mocked(execSync).mockImplementation(mockExecSync);
|
||||
expect(() =>
|
||||
getVersion({
|
||||
type: 'stable',
|
||||
stable_version_override: '1.2.3-beta',
|
||||
}),
|
||||
).toThrow(
|
||||
'Invalid stable_version_override: 1.2.3-beta. Must be in X.Y.Z format.',
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw an error for an invalid preview_version_override format', () => {
|
||||
vi.mocked(execSync).mockImplementation(mockExecSync);
|
||||
expect(() =>
|
||||
getVersion({
|
||||
type: 'preview',
|
||||
preview_version_override: '4.5.6-preview', // Missing .N
|
||||
}),
|
||||
).toThrow(
|
||||
'Invalid preview_version_override: 4.5.6-preview. Must be in X.Y.Z-preview.N format.',
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw an error for another invalid preview_version_override format', () => {
|
||||
vi.mocked(execSync).mockImplementation(mockExecSync);
|
||||
expect(() =>
|
||||
getVersion({
|
||||
type: 'preview',
|
||||
preview_version_override: '4.5.6',
|
||||
}),
|
||||
).toThrow(
|
||||
'Invalid preview_version_override: 4.5.6. Must be in X.Y.Z-preview.N format.',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Failure Path - Discrepancy Checks', () => {
|
||||
it('should throw an error if the git tag does not match npm', () => {
|
||||
const mockWithMismatchGitTag = (command) => {
|
||||
|
||||
Reference in New Issue
Block a user