const { test } = require('node:test'); const assert = require('node:assert/strict'); const { execFileSync, spawnSync } = require('node:child_process'); const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); const CLI = path.join(__dirname, '..', 'src', 'cli.js'); const TOKEN = 'stoke-secret-token-for-sync-tests'; function git(args, cwd) { return execFileSync('git', args, { cwd, encoding: 'utf8' }).trim(); } function commit(directory, message, contents) { fs.writeFileSync(path.join(directory, 'content.txt'), `${contents}\n`); git(['add', 'content.txt'], directory); git(['-c', 'user.name=Tester', '-c', 'user.email=tester@example.com', 'commit', '-m', message], directory); return git(['rev-parse', 'HEAD'], directory); } function fixture() { const root = fs.mkdtempSync(path.join(os.tmpdir(), 'stoke-sync-test-')); const forgeRoot = path.join(root, 'forge'); const forgeRepo = path.join(forgeRoot, 'o', 'r.git'); const seed = path.join(root, 'seed'); const upstreamWork = path.join(root, 'upstream-work'); const upstreamRepo = path.join(root, 'upstream.git'); fs.mkdirSync(path.dirname(forgeRepo), { recursive: true }); git(['init', '-b', 'main', seed], root); const oldSha = commit(seed, 'initial', 'initial'); git(['clone', '--bare', seed, forgeRepo], root); git(['clone', seed, upstreamWork], root); const newSha = commit(upstreamWork, 'upstream advance', 'advanced'); git(['clone', '--bare', upstreamWork, upstreamRepo], root); const config = path.join(root, 'config.json'); fs.writeFileSync(config, JSON.stringify({ url: `file://${forgeRoot}`, token: TOKEN, login: 'tester', })); return { root, forgeRepo, upstreamRepo, config, oldSha, newSha, cleanup() { fs.rmSync(root, { recursive: true, force: true }); }, }; } function runSync(fx, extra = []) { return spawnSync(process.execPath, [ CLI, 'repo', 'sync', '-o', 'o', '-r', 'r', '--from', `file://${fx.upstreamRepo}`, '--branch', 'main', ...extra, ], { encoding: 'utf8', env: { ...process.env, STOKE_CONFIG_FILE: fx.config }, }); } test('repo sync fast-forwards an undiverged forge branch', () => { const fx = fixture(); try { const result = runSync(fx); assert.equal(result.status, 0, result.stderr); assert.equal(git(['rev-parse', 'refs/heads/main'], fx.forgeRepo), fx.newSha); assert.match(result.stdout, new RegExp(`main ${fx.oldSha}\\.\\.${fx.newSha}`)); } finally { fx.cleanup(); } });