85 lines
2.5 KiB
JavaScript
85 lines
2.5 KiB
JavaScript
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();
|
|
}
|
|
});
|