Skip to content

Comments

fix: remove test cleanup to prevent race conditions#468

Merged
jdx merged 1 commit intomainfrom
fix-test-cleanup-race-condition
Nov 25, 2025
Merged

fix: remove test cleanup to prevent race conditions#468
jdx merged 1 commit intomainfrom
fix-test-cleanup-race-condition

Conversation

@jdx
Copy link
Owner

@jdx jdx commented Nov 25, 2025

Summary

The automatic cleanup of test fixtures caused race conditions when tests ran in parallel and shared parent directories. One test's cleanup could delete files/directories still in use by another test.

Problem

When two tests write to paths sharing a parent directory:

  • web/js/.hk-test-files/a.ts
  • web/js/.hk-test-files/b.ts

The first test to complete would delete the shared parent directory (web/js/.hk-test-files/), causing the other test to fail with "No such file or directory".

Solution

Remove the automatic cleanup logic entirely. Tests that need cleanup can:

  1. Use the sandbox ({{tmp}}) which creates an isolated temp directory per test
  2. Handle cleanup themselves via the after hook

A TODO comment suggests potentially adding a user-defined "cleanup" script option in hk.pkl in the future.

Testing

This fixes a CI failure in the figma monorepo where the prettier tests were failing intermittently due to this race condition.


Note

Removes automatic file/dir cleanup in the test runner to prevent races in parallel tests that share parent directories.

  • Test Runner (src/test_runner.rs):
    • Remove pre-scan/tracking of created files/dirs and the post-pass cleanup logic.
    • Keep fixture copying and file writes; no cleanup is performed automatically.
    • Add TODO about supporting a user-defined cleanup script to avoid parallel race issues.

Written by Cursor Bugbot for commit bead5e6. This will update automatically on new commits. Configure here.

The automatic cleanup of test fixtures caused race conditions when
tests ran in parallel and shared parent directories. One test's
cleanup could delete files/directories still in use by another test.

For example, if two tests write to:
- web/js/.hk-test-files/a.ts
- web/js/.hk-test-files/b.ts

The first test to complete would delete the shared parent directory,
causing the other test to fail with 'No such file or directory'.

This removes the cleanup logic entirely. Tests that need cleanup
can use the sandbox ({{tmp}}) or handle cleanup themselves.
@jdx jdx enabled auto-merge (squash) November 25, 2025 17:07
@jdx jdx merged commit c2f2b55 into main Nov 25, 2025
16 checks passed
@jdx jdx deleted the fix-test-cleanup-race-condition branch November 25, 2025 17:10
@jdx jdx mentioned this pull request Nov 25, 2025
jdx added a commit that referenced this pull request Nov 25, 2025
## [1.25.0](https://github.com/jdx/hk/compare/v1.24.1..v1.25.0) -
2025-11-25

### 🚀 Features

- add fix_smart_quotes builtin by [@joonas](https://github.com/joonas)
in [#463](#463)

### 🐛 Bug Fixes

- Use `stage = "<JOB_FILES>"` for the builtins by
[@thejcannon](https://github.com/thejcannon) in
[#465](#465)
- Actually makes `files` for step tests default to write keys by
[@thejcannon](https://github.com/thejcannon) in
[#464](#464)
- remove test cleanup to prevent race conditions by
[@jdx](https://github.com/jdx) in
[#468](#468)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Bumps hk to 1.25.0, updates docs/templates and CLI metadata to new
version, and refreshes dependency lockfile with minor crate updates.
> 
> - **Release/Versioning**:
> - Bump `hk` to `1.25.0` in `Cargo.toml`, `Cargo.lock`,
`docs/cli/commands.json`, `hk.usage.kdl`, examples (`hk-example.pkl`,
`hk.pkl`), and package URLs in docs.
>   - Add `CHANGELOG.md` entry for `1.25.0`.
> - **CLI/Docs**:
>   - Regenerate CLI docs and index with version `1.25.0`.
> - Update init template (`src/cli/init.rs`) and config error hint
(`src/config.rs`) to reference `v1.25.0` package paths.
> - **Dependencies**:
> - Refresh `Cargo.lock` with minor updates (e.g., `http 1.4.0`,
`tower-http 0.6.7`, `async-compression 0.4.34`, `compression-*`,
`signal-hook-registry`, `syn`, `zerocopy`, etc.).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
60c03da. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: mise-en-dev <[email protected]>
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Nov 27, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [hk](https://github.com/jdx/hk) | minor | `1.22.0` -> `1.25.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>jdx/hk (hk)</summary>

### [`v1.25.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1250---2025-11-25)

[Compare Source](jdx/hk@v1.24.1...v1.25.0)

##### 🚀 Features

- add fix\_smart\_quotes builtin by [@&#8203;joonas](https://github.com/joonas) in [#&#8203;463](jdx/hk#463)

##### 🐛 Bug Fixes

- Use `stage = "<JOB_FILES>"` for the builtins by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;465](jdx/hk#465)
- Actually makes `files` for step tests default to write keys by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;464](jdx/hk#464)
- remove test cleanup to prevent race conditions by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;468](jdx/hk#468)

### [`v1.24.1`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1241---2025-11-22)

[Compare Source](jdx/hk@v1.24.0...v1.24.1)

##### ⚡ Performance

- show progress bars before expensive git status call by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;459](jdx/hk#459)

### [`v1.24.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1240---2025-11-21)

[Compare Source](jdx/hk@v1.23.0...v1.24.0)

##### 🚀 Features

- hook stage by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;448](jdx/hk#448)

##### 🐛 Bug Fixes

- Pass/render `stdin` for `hk test` tests by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;455](jdx/hk#455)

##### 📚 Documentation

- Fix `from_ref` docstring by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;454](jdx/hk#454)

##### ⚡ Performance

- skip stash operations when no unstaged changes by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;457](jdx/hk#457)
- skip staging when jobs are skipped by conditions by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;458](jdx/hk#458)

### [`v1.23.0`](https://github.com/jdx/hk/blob/HEAD/CHANGELOG.md#1230---2025-11-21)

[Compare Source](jdx/hk@v1.22.0...v1.23.0)

##### 🚀 Features

- **(vacuum)** new builtin by [@&#8203;scop](https://github.com/scop) in [#&#8203;414](jdx/hk#414)
- add --stats flag to show file counts per step by [@&#8203;jdx](https://github.com/jdx) in [#&#8203;446](jdx/hk#446)
- Plumb `stage` through CLI and PKL by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;442](jdx/hk#442)

##### 🐛 Bug Fixes

- **(cli)** check help description by [@&#8203;scop](https://github.com/scop) in [#&#8203;439](jdx/hk#439)

##### 📚 Documentation

- **(stash)** rephrase uncommitted -> unstaged by [@&#8203;scop](https://github.com/scop) in [#&#8203;451](jdx/hk#451)
- re-Remove "auto" stash value by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;444](jdx/hk#444)
- Delete `schema.md` by [@&#8203;thejcannon](https://github.com/thejcannon) in [#&#8203;445](jdx/hk#445)
- fix --fix description by [@&#8203;scop](https://github.com/scop) in [#&#8203;450](jdx/hk#450)

##### 📦️ Dependency Updates

- update actions/checkout digest to [`93cb6ef`](jdx/hk@93cb6ef) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;452](jdx/hk#452)
- update anthropics/claude-code-action digest to [`6902c22`](jdx/hk@6902c22) by [@&#8203;renovate\[bot\]](https://github.com/renovate\[bot]) in [#&#8203;453](jdx/hk#453)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xOS4wIiwidXBkYXRlZEluVmVyIjoiNDIuMTkuNyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant