Files
stablyai--orca/config/scripts/release-rc-history.test.mjs
2026-07-13 13:05:33 +08:00

79 lines
2.5 KiB
JavaScript

import { execFileSync } from 'node:child_process'
import { mkdtempSync, rmSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { describe, expect, it } from 'vitest'
import {
highestRcForBase,
rcNumberFromReleaseSubject,
rcNumberFromTag
} from './release-rc-history.mjs'
function git(cwd, args) {
return execFileSync('git', args, {
cwd,
encoding: 'utf8',
stdio: ['ignore', 'pipe', 'pipe']
}).trim()
}
function withGitRepo(run) {
const dir = mkdtempSync(join(tmpdir(), 'orca-rc-history-'))
try {
git(dir, ['init', '--initial-branch=main'])
git(dir, ['config', 'user.name', 'Test Bot'])
git(dir, ['config', 'user.email', 'test@example.com'])
run(dir)
} finally {
rmSync(dir, { recursive: true, force: true })
}
}
function commit(cwd, message, { allowEmpty = true } = {}) {
const args = ['commit', '-m', message]
if (allowEmpty) {
args.splice(1, 0, '--allow-empty')
}
git(cwd, args)
}
describe('release RC history', () => {
it('parses only exact desktop RC tag suffixes', () => {
expect(rcNumberFromTag('1.4.36', 'v1.4.36-rc.7')).toBe(7)
expect(rcNumberFromTag('1.4.36', 'v1.4.36-rc.7-extra')).toBeNull()
expect(rcNumberFromTag('1.4.36', 'v1.4.35-rc.7')).toBeNull()
})
it('parses release commit subjects with optional slot markers', () => {
expect(rcNumberFromReleaseSubject('1.4.36', 'release: v1.4.36-rc.6')).toBe(6)
expect(
rcNumberFromReleaseSubject('1.4.36', 'release: v1.4.36-rc.6 [rc-slot:2026-05-30-03]')
).toBe(6)
expect(rcNumberFromReleaseSubject('1.4.36', 'release: v1.4.36-rc.6-extra')).toBeNull()
expect(rcNumberFromReleaseSubject('1.4.36', 'fix: v1.4.36-rc.6')).toBeNull()
})
it('keeps RC numbers monotonic after a stale tag is deleted', () => {
withGitRepo((repo) => {
commit(repo, 'initial')
commit(repo, 'release: v1.4.36-rc.5')
git(repo, ['tag', 'v1.4.36-rc.5'])
commit(repo, 'release: v1.4.36-rc.6')
expect(highestRcForBase('1.4.36', { cwd: repo })).toBe(6)
})
})
it('considers origin/main when releasing from an older ref', () => {
withGitRepo((repo) => {
commit(repo, 'initial')
git(repo, ['update-ref', 'refs/remotes/origin/main', 'HEAD'])
commit(repo, 'release: v1.4.36-rc.6')
git(repo, ['update-ref', 'refs/remotes/origin/main', 'HEAD'])
git(repo, ['checkout', 'HEAD~1'])
expect(highestRcForBase('1.4.36', { cwd: repo })).toBe(6)
})
})
})