From 36dca862cc089ab742c2bb7d3f3d65624b7475e6 Mon Sep 17 00:00:00 2001 From: Sandy Tao Date: Mon, 13 Apr 2026 10:55:11 -0700 Subject: [PATCH] fix(release): prefix git hash in nightly versions to prevent semver normalization (#25304) --- scripts/get-release-version.js | 4 ++-- scripts/tests/get-release-version.test.js | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/scripts/get-release-version.js b/scripts/get-release-version.js index b40f836599..019280aadf 100644 --- a/scripts/get-release-version.js +++ b/scripts/get-release-version.js @@ -285,7 +285,7 @@ function promoteNightlyVersion({ args } = {}) { const date = new Date().toISOString().slice(0, 10).replace(/-/g, ''); const gitShortHash = execSync('git rev-parse --short HEAD').toString().trim(); return { - releaseVersion: `${major}.${nextMinor}.0-nightly.${date}.${gitShortHash}`, + releaseVersion: `${major}.${nextMinor}.0-nightly.${date}.g${gitShortHash}`, npmTag: TAG_NIGHTLY, previousReleaseTag: previousNightlyTag, }; @@ -296,7 +296,7 @@ function getNightlyVersion() { const baseVersion = packageJson.version.split('-')[0]; const date = new Date().toISOString().slice(0, 10).replace(/-/g, ''); const gitShortHash = execSync('git rev-parse --short HEAD').toString().trim(); - const releaseVersion = `${baseVersion}-nightly.${date}.${gitShortHash}`; + const releaseVersion = `${baseVersion}-nightly.${date}.g${gitShortHash}`; const previousReleaseTag = getLatestTag('v*-nightly*'); return { diff --git a/scripts/tests/get-release-version.test.js b/scripts/tests/get-release-version.test.js index 78eb32337c..fedf53b16d 100644 --- a/scripts/tests/get-release-version.test.js +++ b/scripts/tests/get-release-version.test.js @@ -93,7 +93,7 @@ describe('getVersion', () => { vi.mocked(execSync).mockImplementation(mockExecSync); const result = getVersion({ type: 'nightly' }); // Note: The base version now comes from package.json, not the previous nightly tag. - expect(result.releaseVersion).toBe('0.8.0-nightly.20250917.d3bf8a3d'); + expect(result.releaseVersion).toBe('0.8.0-nightly.20250917.gd3bf8a3d'); expect(result.npmTag).toBe('nightly'); expect(result.previousReleaseTag).toBe('v0.8.0-nightly.20250916.abcdef'); }); @@ -191,5 +191,19 @@ describe('getVersion', () => { // Should have skipped preview.0 and landed on preview.1 expect(result.releaseVersion).toBe('0.8.0-preview.1'); }); + + it('should preserve a git hash with a leading zero via the g prefix', () => { + const mockWithLeadingZeroHash = (command) => { + // Return an all-numeric hash with a leading zero + if (command.includes('git rev-parse --short HEAD')) return '017972622'; + return mockExecSync(command); + }; + vi.mocked(execSync).mockImplementation(mockWithLeadingZeroHash); + + const result = getVersion({ type: 'nightly' }); + // The 'g' prefix forces semver to treat this as an alphanumeric + // identifier, preventing it from stripping the leading zero. + expect(result.releaseVersion).toBe('0.8.0-nightly.20250917.g017972622'); + }); }); });