diff --git a/dist/commands/demo.d.ts b/dist/commands/demo.d.ts index d59e3267..957baf8c 100644 --- a/dist/commands/demo.d.ts +++ b/dist/commands/demo.d.ts @@ -14,6 +14,14 @@ import type { Command } from 'commander'; export interface DemoOptions { cwd?: string; + /** + * Directory the temporary repository is created under. Defaults to the + * process-wide temp dir, which is what the CLI uses. A caller that needs to + * assert the temporary directory was removed passes a root it owns: read + * against the shared tmpdir, that assertion answers for every process on the + * machine, not for this call (#364). + */ + tmpRoot?: string; /** For testing: override the detected platform. */ platformOverride?: string; /** For testing: throw mid-execution to verify cleanup. */ diff --git a/dist/commands/demo.js b/dist/commands/demo.js index 6b3e1c67..4945be1d 100644 --- a/dist/commands/demo.js +++ b/dist/commands/demo.js @@ -78,7 +78,7 @@ export const runDemo = async (opts = {}) => { process.prependOnceListener('SIGTERM', onSignal); try { // Create temporary directory with a recognizable prefix for testing - tmpDir = mkdtempSync(join(tmpdir(), 'commitlore-demo-')); + tmpDir = mkdtempSync(join(opts.tmpRoot ?? tmpdir(), 'commitlore-demo-')); // Verify we are NOT operating on the user's repository const userCwd = resolve(opts.cwd ?? process.cwd()); const tmpResolved = resolve(tmpDir); diff --git a/dist/commands/demo.js.map b/dist/commands/demo.js.map index e5c3eb1a..086b69a2 100644 --- a/dist/commands/demo.js.map +++ b/dist/commands/demo.js.map @@ -1 +1 @@ -{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/commitlore.mjs b/dist/commitlore.mjs index 93d7f8e0..df3601a3 100755 --- a/dist/commitlore.mjs +++ b/dist/commitlore.mjs @@ -18030,7 +18030,7 @@ var runDemo = async (opts = {}) => { process.prependOnceListener("SIGINT", onSignal); process.prependOnceListener("SIGTERM", onSignal); try { - tmpDir = mkdtempSync(join6(tmpdir(), "commitlore-demo-")); + tmpDir = mkdtempSync(join6(opts.tmpRoot ?? tmpdir(), "commitlore-demo-")); const userCwd = resolve10(opts.cwd ?? process.cwd()); const tmpResolved = resolve10(tmpDir); if (tmpResolved === userCwd || tmpResolved.startsWith(userCwd + "/") || userCwd.startsWith(tmpResolved + "/")) { diff --git a/src/commands/demo.ts b/src/commands/demo.ts index 2a6888ce..8729a4e6 100644 --- a/src/commands/demo.ts +++ b/src/commands/demo.ts @@ -46,6 +46,14 @@ const checkPlatform = (override?: string): string | null => { export interface DemoOptions { cwd?: string; + /** + * Directory the temporary repository is created under. Defaults to the + * process-wide temp dir, which is what the CLI uses. A caller that needs to + * assert the temporary directory was removed passes a root it owns: read + * against the shared tmpdir, that assertion answers for every process on the + * machine, not for this call (#364). + */ + tmpRoot?: string; /** For testing: override the detected platform. */ platformOverride?: string; /** For testing: throw mid-execution to verify cleanup. */ @@ -114,7 +122,7 @@ export const runDemo = async (opts: DemoOptions = {}): Promise => { try { // Create temporary directory with a recognizable prefix for testing - tmpDir = mkdtempSync(join(tmpdir(), 'commitlore-demo-')); + tmpDir = mkdtempSync(join(opts.tmpRoot ?? tmpdir(), 'commitlore-demo-')); // Verify we are NOT operating on the user's repository const userCwd = resolve(opts.cwd ?? process.cwd()); diff --git a/test/demo.test.ts b/test/demo.test.ts index eda8fa17..4bfed9f4 100644 --- a/test/demo.test.ts +++ b/test/demo.test.ts @@ -20,8 +20,19 @@ describe('commitlore demo', () => { /** A real git repo used as the cwd for the demo — must remain untouched. */ let userRepo: string; let userRepoHeadBefore: string; + /** + * A temp root this suite owns, so that "the demo left nothing behind" is a + * question about this call rather than about the machine. Asked of the + * process-wide tmpdir it was neither: a concurrent worker holding its own + * `commitlore-demo-*` directory during the assertion window answered it, and + * turned the two cleanup tests red for a reason unrelated to `runDemo` (#364). + * Keeping the demo under this root also stops the suite leaking that prefix + * into the shared tmpdir, where another checkout's run would read it. + */ + let demoRoot: string; beforeAll(() => { + demoRoot = mkdtempSync(join(tmpdir(), 'demo-tmproot-')); userRepo = mkdtempSync(join(tmpdir(), 'demo-user-repo-')); createTestRepo({ path: userRepo }); // Create an initial commit so HEAD exists @@ -34,16 +45,17 @@ describe('commitlore demo', () => { afterAll(() => { rmSync(userRepo, { recursive: true, force: true }); + rmSync(demoRoot, { recursive: true, force: true }); }); it('demo runs without error on a supported platform', async () => { - const result = await runDemo({ cwd: userRepo }); + const result = await runDemo({ cwd: userRepo, tmpRoot: demoRoot }); expect(result.exitCode).toBe(0); expect(result.output.length).toBeGreaterThan(0); }); it('output shows lifecycle filtering — active record present, superseded excluded', async () => { - const result = await runDemo({ cwd: userRepo }); + const result = await runDemo({ cwd: userRepo, tmpRoot: demoRoot }); // The active record (r-demo02, SQLite) should be visible expect(result.output).toContain('r-demo02'); // The superseded record (r-demo01, Redis predecessor) should be filtered out @@ -51,29 +63,27 @@ describe('commitlore demo', () => { }); it('temporary directory does not exist after successful completion', async () => { - const tmpRoot = tmpdir(); - const before = readdirSync(tmpRoot).filter((d) => d.startsWith('commitlore-demo')); - await runDemo({ cwd: userRepo }); - const after = readdirSync(tmpRoot).filter((d) => d.startsWith('commitlore-demo')); - const leftover = after.filter((d) => !before.includes(d)); - expect(leftover).toEqual([]); + // A root used by this case alone, so emptiness is the whole assertion — + // no prefix filter, and nothing anyone else wrote can satisfy or break it. + const caseRoot = mkdtempSync(join(demoRoot, 'success-')); + await runDemo({ cwd: userRepo, tmpRoot: caseRoot }); + expect(readdirSync(caseRoot)).toEqual([]); }); it('temporary directory is gone after a simulated crash (safety property)', async () => { + const caseRoot = mkdtempSync(join(demoRoot, 'crash-')); // Inject a crash trigger — runDemo with crashTest: true throws mid-execution try { - await runDemo({ cwd: userRepo, crashTest: true }); + await runDemo({ cwd: userRepo, crashTest: true, tmpRoot: caseRoot }); } catch { // Expected to throw } // But the temp directory must still be cleaned up - const tmpRoot = tmpdir(); - const leftover = readdirSync(tmpRoot).filter((d) => d.startsWith('commitlore-demo')); - expect(leftover).toEqual([]); + expect(readdirSync(caseRoot)).toEqual([]); }); it('user repository is never written to (safety property)', async () => { - await runDemo({ cwd: userRepo }); + await runDemo({ cwd: userRepo, tmpRoot: demoRoot }); // HEAD must be unchanged const headAfter = execFileSync('git', ['rev-parse', 'HEAD'], { cwd: userRepo, @@ -91,14 +101,14 @@ describe('commitlore demo', () => { }); it('on an unsupported platform prints a reason and exits non-zero', async () => { - const result = await runDemo({ cwd: userRepo, platformOverride: 'win32' }); + const result = await runDemo({ cwd: userRepo, tmpRoot: demoRoot, platformOverride: 'win32' }); expect(result.exitCode).toBe(1); expect(result.output.toLowerCase()).toContain('not supported'); }); it('completes in under 30 seconds', async () => { const start = Date.now(); - await runDemo({ cwd: userRepo }); + await runDemo({ cwd: userRepo, tmpRoot: demoRoot }); const elapsed = Date.now() - start; expect(elapsed).toBeLessThan(30_000); });