Skip to content

Commit 896eb29

Browse files
committed
fix: isolate dev stack runtime state
1 parent f0d0b95 commit 896eb29

3 files changed

Lines changed: 58 additions & 1 deletion

File tree

scripts/test/dev-stack-runtime.mjs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import fs from 'node:fs/promises';
2+
import path from 'node:path';
3+
4+
export function buildDevStackRuntimeEnv(root, env = process.env) {
5+
const stateDir = env.CODER_STUDIO_HOME
6+
? path.resolve(env.CODER_STUDIO_HOME)
7+
: path.join(root, '.tmp', 'dev-stack-runtime');
8+
9+
return {
10+
stateDir,
11+
env: {
12+
...env,
13+
CODER_STUDIO_HOME: stateDir,
14+
},
15+
};
16+
}
17+
18+
export async function resetDevStackRuntimeState(stateDir) {
19+
await fs.rm(stateDir, { recursive: true, force: true });
20+
await fs.mkdir(stateDir, { recursive: true });
21+
}

scripts/test/start-dev-stack.mjs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import fs from 'node:fs/promises';
12
import { spawn, spawnSync } from 'node:child_process';
23
import { fileURLToPath } from 'node:url';
34
import path from 'node:path';
5+
import { buildDevStackRuntimeEnv, resetDevStackRuntimeState } from './dev-stack-runtime.mjs';
46

57
const ROOT = fileURLToPath(new URL('../..', import.meta.url));
68
const PNPM_CMD = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';
79
let frontend = null;
10+
const runtime = buildDevStackRuntimeEnv(ROOT, process.env);
811

912
let shuttingDown = false;
1013

@@ -34,10 +37,14 @@ function spawnPnpm(args) {
3437
return spawn(resolved.command, resolved.args, {
3538
cwd: ROOT,
3639
stdio: 'inherit',
37-
windowsHide: true
40+
windowsHide: true,
41+
env: runtime.env,
3842
});
3943
}
4044

45+
await fs.mkdir(path.join(ROOT, '.tmp'), { recursive: true });
46+
await resetDevStackRuntimeState(runtime.stateDir);
47+
4148
const server = spawnPnpm(['dev:server']);
4249

4350
const killChild = (child) => {

tests/release/release.test.mjs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import {
1111
import { assertReleaseAssets } from '../../scripts/release/check-assets.mjs';
1212
import { assertVersionConsistency, collectReleaseVersionState } from '../../scripts/release/check-version.mjs';
1313
import { createReleaseManifest } from '../../scripts/release/write-release-manifest.mjs';
14+
import {
15+
buildDevStackRuntimeEnv,
16+
resetDevStackRuntimeState,
17+
} from '../../scripts/test/dev-stack-runtime.mjs';
1418

1519
test('release assets required for packaging are present', async () => {
1620
await assertReleaseAssets();
@@ -76,3 +80,28 @@ test('release manifest writer emits checksums for tarballs', async () => {
7680
await fs.rm(tempRoot, { recursive: true, force: true });
7781
}
7882
});
83+
84+
test('dev stack runtime defaults to an isolated repo-local state dir', () => {
85+
const root = '/tmp/coder-studio-root';
86+
const result = buildDevStackRuntimeEnv(root, {});
87+
88+
assert.equal(result.stateDir, path.join(root, '.tmp', 'dev-stack-runtime'));
89+
assert.equal(result.env.CODER_STUDIO_HOME, path.join(root, '.tmp', 'dev-stack-runtime'));
90+
});
91+
92+
test('dev stack runtime reset clears prior state contents', async () => {
93+
const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'coder-studio-dev-stack-'));
94+
const stateDir = path.join(tempRoot, 'state');
95+
96+
try {
97+
await fs.mkdir(path.join(stateDir, 'nested'), { recursive: true });
98+
await fs.writeFile(path.join(stateDir, 'nested', 'stale.txt'), 'stale', 'utf8');
99+
100+
await resetDevStackRuntimeState(stateDir);
101+
102+
const entries = await fs.readdir(stateDir);
103+
assert.deepEqual(entries, []);
104+
} finally {
105+
await fs.rm(tempRoot, { recursive: true, force: true });
106+
}
107+
});

0 commit comments

Comments
 (0)