// Shared scratch bare-repository fixture for row 288 library and broker tests. import assert from 'node:assert/strict'; import { mkdirSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { repo, git, mappingEntry, BASE } from './helpers.mjs'; import { sync, syncCommand } from '../src/sync.mjs'; import { mirrorPath, readSyncState } from '../src/mirror.mjs'; export const PATH = 'Book One/Notes/Agent.md'; export const IDENTITY = { name: 'Bean Fixture', email: 'bean@example.test' }; export const EDITOR = { name: 'Human Fixture', email: 'human@example.test' }; export async function world(t, { business = 'acme' } = {}) { const f = repo(t, { ...BASE, [PATH]: 'before\n', 'Book One/Notes/Executable.md': { text: 'exec\n', mode: 0o755 }, 'Book One/Notes/Link.md': { link: 'Agent.md' } }); git(f.repo, 'update-index', '--add', '--cacheinfo', '160000', f.commit, 'Book One/Notes/Submodule.md'); git(f.repo, 'commit', '-qm', 'gitlink fixture'); const remote = join(f.root, 'remote.git'); git(f.root, 'clone', '-q', '--bare', '--no-local', f.repo, remote); const dataRoot = join(f.root, 'data'); mkdirSync(dataRoot, { mode: 0o700 }); const entry = { ...mappingEntry(), user: 'human-fixture', editor: { ...EDITOR } }; entry.universes.harbor.supporting = ['Book One/Notes/']; const context = { business: { id: business, projects: { books: entry } }, project: 'books', dataRoot }; const file = join(f.root, 'fixture-slot'); writeFileSync(file, 'fx288-write\n', { mode: 0o600 }); const credential = { kind: 'seat', user: 'bean-fixture', file }; // Keep the production refspec exactly: a '+' mutant on push would overwrite the racing remote. let beforePush = null, reject = false; const commands = []; const command = (kind, url, opts) => { commands.push(kind); if (kind === 'push' && beforePush) { const fn = beforePush; beforePush = null; fn(); } const c = syncCommand(kind, url, opts); const argv = [...c.argv]; argv.splice(0, 0, '-c', 'protocol.file.allow=always'); const at = argv.indexOf(url); assert.ok(at >= 0); argv[at] = kind === 'push' && reject ? join(f.root, 'missing.git') : remote; return { argv, env: c.env }; }; await sync(context, { credential, command }); const mirror = mirrorPath(context); const refs = () => git(mirror, 'for-each-ref', '--format=%(refname) %(objectname)'); const remoteHead = () => git(remote, 'rev-parse', 'main'); const state = () => readSyncState(mirror, { branch: 'main' }); const external = (path, content) => { writeFileSync(join(f.repo, path), content); git(f.repo, 'add', '-A'); git(f.repo, 'commit', '-qm', 'external'); git(f.repo, 'push', '-q', remote, 'HEAD:main'); }; const args = (extra = {}) => ({ ...context, universe: 'harbor', path: PATH, base: git(mirror, 'rev-parse', `served:${PATH}`), content: 'after\n', ...extra }); const opts = { credential, identity: IDENTITY, agent: `${business}/bean`, command }; return { ...f, remote, context, entry, file, credential, command, mirror, refs, remoteHead, state, external, args, opts, race: fn => { beforePush = fn; }, reject: () => { reject = true; }, commands }; }