Skip to content

Commit dd43370

Browse files
authored
Merge pull request #98 from TrueNine/dev
chore: release 2026.10324.10325
2 parents 57ff152 + c3f0272 commit dd43370

File tree

20 files changed

+385
-73
lines changed

20 files changed

+385
-73
lines changed

.githooks/sync-versions.test.ts

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import {execFileSync} from 'node:child_process'
2+
import {mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync} from 'node:fs'
3+
import {tmpdir} from 'node:os'
4+
import {dirname, join} from 'node:path'
5+
import {afterEach, describe, expect, it} from 'vitest'
6+
import {runSyncVersions} from './sync-versions'
7+
8+
function writeJson(filePath: string, value: Record<string, unknown>): void {
9+
mkdirSync(dirname(filePath), {recursive: true})
10+
writeFileSync(filePath, JSON.stringify(value, null, 2) + '\n', 'utf-8')
11+
}
12+
13+
function writeText(filePath: string, content: string): void {
14+
mkdirSync(dirname(filePath), {recursive: true})
15+
writeFileSync(filePath, content, 'utf-8')
16+
}
17+
18+
function runGit(rootDir: string, args: readonly string[]): string {
19+
return execFileSync('git', args, {
20+
cwd: rootDir,
21+
encoding: 'utf-8',
22+
stdio: ['ignore', 'pipe', 'pipe']
23+
}).trim()
24+
}
25+
26+
function createFixtureRepo(): string {
27+
const rootDir = mkdtempSync(join(tmpdir(), 'tnmsc-sync-versions-'))
28+
const initialVersion = '2026.10324.10015'
29+
30+
writeJson(join(rootDir, 'package.json'), {
31+
name: '@truenine/memory-sync',
32+
version: initialVersion
33+
})
34+
writeJson(join(rootDir, 'cli', 'package.json'), {
35+
name: '@truenine/memory-sync-cli',
36+
version: initialVersion
37+
})
38+
writeJson(join(rootDir, 'cli', 'npm', 'darwin-arm64', 'package.json'), {
39+
name: '@truenine/memory-sync-cli-darwin-arm64',
40+
version: initialVersion
41+
})
42+
writeJson(join(rootDir, 'libraries', 'logger', 'package.json'), {
43+
name: '@truenine/logger',
44+
version: initialVersion
45+
})
46+
writeText(join(rootDir, 'Cargo.toml'), [
47+
'[workspace]',
48+
'members = ["cli-crate"]',
49+
'',
50+
'[workspace.package]',
51+
`version = "${initialVersion}"`,
52+
''
53+
].join('\n'))
54+
writeText(join(rootDir, 'cli-crate', 'Cargo.toml'), [
55+
'[package]',
56+
'name = "cli-crate"',
57+
`version = "${initialVersion}"`,
58+
''
59+
].join('\n'))
60+
writeJson(join(rootDir, 'gui', 'src-tauri', 'tauri.conf.json'), {
61+
version: initialVersion,
62+
productName: 'Memory Sync'
63+
})
64+
65+
runGit(rootDir, ['init'])
66+
runGit(rootDir, ['config', 'user.email', 'codex@example.com'])
67+
runGit(rootDir, ['config', 'user.name', 'Codex'])
68+
runGit(rootDir, ['add', '.'])
69+
runGit(rootDir, ['commit', '-m', 'initial'])
70+
71+
return rootDir
72+
}
73+
74+
const tempDirs: string[] = []
75+
76+
afterEach(() => {
77+
while (tempDirs.length > 0) {
78+
const rootDir = tempDirs.pop()
79+
if (rootDir != null) {
80+
rmSync(rootDir, {recursive: true, force: true})
81+
}
82+
}
83+
})
84+
85+
describe('sync-versions hook', () => {
86+
it('uses a staged package.json version as the sync source and stages all propagated changes', () => {
87+
const rootDir = createFixtureRepo()
88+
tempDirs.push(rootDir)
89+
90+
const nextVersion = '2026.10324.10314'
91+
writeJson(join(rootDir, 'cli', 'npm', 'darwin-arm64', 'package.json'), {
92+
name: '@truenine/memory-sync-cli-darwin-arm64',
93+
version: nextVersion
94+
})
95+
runGit(rootDir, ['add', 'cli/npm/darwin-arm64/package.json'])
96+
97+
const result = runSyncVersions({rootDir})
98+
const stagedFiles = new Set(runGit(rootDir, ['diff', '--cached', '--name-only']).split(/\r?\n/).filter(Boolean))
99+
100+
expect(result.targetVersion).toBe(nextVersion)
101+
expect(result.versionSource).toBe('cli/npm/darwin-arm64/package.json')
102+
expect(JSON.parse(readFileSync(join(rootDir, 'package.json'), 'utf-8')) as {version: string}).toMatchObject({version: nextVersion})
103+
expect(JSON.parse(readFileSync(join(rootDir, 'cli', 'package.json'), 'utf-8')) as {version: string}).toMatchObject({version: nextVersion})
104+
expect(JSON.parse(readFileSync(join(rootDir, 'libraries', 'logger', 'package.json'), 'utf-8')) as {version: string}).toMatchObject({version: nextVersion})
105+
expect(readFileSync(join(rootDir, 'Cargo.toml'), 'utf-8')).toContain(`version = "${nextVersion}"`)
106+
expect(readFileSync(join(rootDir, 'cli-crate', 'Cargo.toml'), 'utf-8')).toContain(`version = "${nextVersion}"`)
107+
expect(JSON.parse(readFileSync(join(rootDir, 'gui', 'src-tauri', 'tauri.conf.json'), 'utf-8')) as {version: string}).toMatchObject({version: nextVersion})
108+
expect(stagedFiles).toEqual(new Set([
109+
'Cargo.toml',
110+
'cli-crate/Cargo.toml',
111+
'cli/npm/darwin-arm64/package.json',
112+
'cli/package.json',
113+
'gui/src-tauri/tauri.conf.json',
114+
'libraries/logger/package.json',
115+
'package.json'
116+
]))
117+
})
118+
119+
it('fails when staged package.json files propose conflicting versions', () => {
120+
const rootDir = createFixtureRepo()
121+
tempDirs.push(rootDir)
122+
123+
writeJson(join(rootDir, 'cli', 'npm', 'darwin-arm64', 'package.json'), {
124+
name: '@truenine/memory-sync-cli-darwin-arm64',
125+
version: '2026.10324.10314'
126+
})
127+
writeJson(join(rootDir, 'libraries', 'logger', 'package.json'), {
128+
name: '@truenine/logger',
129+
version: '2026.10324.10315'
130+
})
131+
runGit(rootDir, ['add', 'cli/npm/darwin-arm64/package.json', 'libraries/logger/package.json'])
132+
133+
expect(() => runSyncVersions({rootDir})).toThrowError(/Conflicting staged package\.json versions detected/)
134+
})
135+
})

0 commit comments

Comments
 (0)