ReviewOS

also looking at this

stacks/bumpx

fix: synchronize drifted native versions in recursive releases

#2015
Merged chris wants to merge codex/recursive-native-version-drift into main
2 files +26 -2
packages/bumpx/src/utils.tsmodified+6-2
Changes to packages/bumpx/src/utils.ts
@@ -413,8 +413,11 @@ export function updateVersionInFile(filePath: string, oldVersion: string, newVer
413413 if (isZigZon) {
414414 // Handle Zig build.zig.zon files
415415 // Format: .version = "0.0.0",
416 const declaredVersion = forceUpdate
417 ? content.match(/\.version\s*=\s*"([^"]+)"/)?.[1] ?? oldVersion
418 : oldVersion
416419 const versionRegex = new RegExp(
417 `(\\.version\\s*=\\s*")${oldVersion.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}("\\s*,)`,
420 `(\\.version\\s*=\\s*")${declaredVersion.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}("\\s*,)`,
418421 'g',
419422 )
420423 if (content.match(versionRegex) || forceUpdate) {
@@ -433,6 +436,7 @@ export function updateVersionInFile(filePath: string, oldVersion: string, newVer
433436 }
434437
435438 const packageJson = JSON.parse(jsonContent)
439 const declaredVersion = forceUpdate ? String(packageJson.version) : oldVersion
436440 if (packageJson.version === oldVersion || forceUpdate) {
437441 packageJson.version = newVersion
438442
@@ -440,7 +444,7 @@ export function updateVersionInFile(filePath: string, oldVersion: string, newVer
440444 if (isJsonc) {
441445 // Replace the version value while preserving comments and formatting
442446 const versionRegex = new RegExp(
443 `(["']version["']\\s*:\\s*)["']${oldVersion.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["']`,
447 `(["']version["']\\s*:\\s*)["']${declaredVersion.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["']`,
444448 'g',
445449 )
446450 newContent = content.replace(versionRegex, `$1"${newVersion}"`)
packages/bumpx/test/additional-release-manifests.test.tsmodified+20-0
Changes to packages/bumpx/test/additional-release-manifests.test.ts
@@ -68,3 +68,23 @@ test('additional manifests participate in changed-package dependency propagation
6868 rmSync(root, { recursive: true, force: true })
6969 }
7070})
71
72test('recursive CLI synchronizes native metadata whose starting version differs from the root', () => {
73 const root = fixture()
74 try {
75 mkdirSync(join(root, 'packages/zig'), { recursive: true })
76 writeFileSync(join(root, 'packages/zig/build.zig.zon'), '.{ .version = "0.8.0", }\n')
77 writeFileSync(join(root, 'packages/zig/pantry.json'), '{"version":"0.7.0"}\n')
78 writeFileSync(join(root, 'packages/zig/package.jsonc'), '{/* metadata */ "version":"0.6.0"}\n')
79 writeFileSync(join(root, 'bumpx.config.ts'), `export default {
80 additionalFiles: ['packages/zig/build.zig.zon', 'packages/zig/pantry.json', 'packages/zig/package.jsonc'],
81 }\n`)
82 bump(root)
83 expect(version(root, '.')).toBe('1.0.1')
84 expect(version(root, 'packages/runtime')).toBe('1.0.1')
85 expect(readFileSync(join(root, 'packages/zig/build.zig.zon'), 'utf8')).toContain('.version = "1.0.1"')
86 expect(JSON.parse(readFileSync(join(root, 'packages/zig/pantry.json'), 'utf8')).version).toBe('1.0.1')
87 expect(readFileSync(join(root, 'packages/zig/package.jsonc'), 'utf8')).toContain('"version":"1.0.1"')
88 }
89 finally { rmSync(root, { recursive: true, force: true }) }
90})