Skip to content

[pull] main from jdx:main - #140

Merged
pull[bot] merged 6 commits into
AmadeusITGroup:mainfrom
jdx:main
Feb 22, 2026
Merged

pull[bot] merged 6 commits into
AmadeusITGroup:mainfrom
jdx:main

Conversation

@pull

@pull pull Bot commented Feb 22, 2026 •

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

jdx and others added 6 commits February 22, 2026 09:50
## Summary

- When an install fails (e.g. GitHub rate limit 403, or a non-existent
version 404), `cleanup_install_dirs_on_error` only removed the
version-specific subdirectory (e.g. `installs/tilt/latest`) but left the
parent directory (`installs/tilt/`) as an empty directory
- Fix by also removing the parent `installs_path` when it is empty after
cleanup, guarded so it won't remove it if other versions exist
- Also cleans up the incomplete marker from cache (was also left behind
on error)
- Adds e2e regression test: installs a non-existent tilt version to
trigger a 404 failure, asserts the parent dir is gone, then verifies a
real install still works

## Test plan

- [x] `mise run test:e2e test_aqua_failed_install_cleanup` passes
- [x] Test fails without the patch (confirmed via `git stash`)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches install cleanup and config file selection logic; mistakes
could delete unintended directories or write tool versions to the wrong
config file, though changes are guarded and covered by new e2e tests.
> 
> **Overview**
> Fixes failed-install cleanup so `cleanup_install_dirs_on_error` also
removes the cache “incomplete” marker and deletes the tool’s parent
installs directory when it becomes empty, preventing leftover empty
`installs/<tool>/` folders.
> 
> Refines config write targeting by updating
`first_config_file`/`global_config_path` to skip `conf.d` entries (and
`.tool-versions`) so `mise use` and `mise use -g` prefer writing to
`config.toml` over `config.local.toml`. Adds e2e coverage for both the
failed-install directory cleanup regression and the global/local config
write preference.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
901bf70. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
## Summary

PR #8279 placed every task child process in its own process group via
`setpgid(0, 0)`. This broke interactive tools like Tilt that read from
stdin.

**Root cause:** The terminal driver only delivers keyboard input to the
*foreground process group*. When a child is moved to a new process
group, it's no longer the terminal's foreground group, so any attempt to
`read()` from stdin causes the kernel to send `SIGTTIN`, which silently
stops the process. Result: the process hangs, Ctrl-C has no effect, and
the UI never loads.

**Fix:** In `pre_exec`, check `std::io::stdin().is_terminal()`. If stdin
is a TTY (inherited from the terminal), skip `setpgid` — the process
stays in the terminal's foreground group and gets full keyboard I/O. If
stdin is not a TTY (null/piped, i.e. non-interactive tasks), `setpgid`
fires as before, preserving grandchild cleanup on Ctrl-C.

This keeps the grandchild-kill benefit of #8279 for all normal
(non-interactive) tasks while restoring correct behavior for interactive
ones.

Closes #8300

## Test plan
- [x] `cargo build` compiles cleanly
- [x] Verified `mise run tilt:up` (or equivalent interactive task) no
longer hangs
- [x] Non-interactive tasks still get their own process group for clean
teardown

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Small, Unix-only change gated on an `is_terminal` check; primary risk
is behavior change in process-group/signal handling for commands with
TTY stdin.
> 
> **Overview**
> Fixes Unix task execution for interactive commands by **only calling
`setpgid(0,0)` when stdin is not a TTY**.
> 
> In `CmdLineRunner::execute`’s `pre_exec` hook, stdin is checked via
`BorrowedFd::borrow_raw(0)` + `IsTerminal`; interactive children stay in
the terminal’s foreground process group to avoid `SIGTTIN` hangs, while
non-interactive tasks keep the separate process group behavior for
signal/cleanup handling.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4bf5aef. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
### 🐛 Bug Fixes

- **(docs)** correct ripgrep command by @nguyenvulong in
[#8299](#8299)
- **(task)** skip setpgid for TTY stdin to fix interactive tasks by @jdx
in [#8301](#8301)
- clean up empty parent install dir on failed install by @jdx in
[#8302](#8302)

### Chore

- **(release)** run communique via mise x for PATH resolution by @jdx in
[#8294](#8294)

## 📦 Aqua Registry Updates

#### New Packages (2)

- [`kubie-org/kubie`](https://github.com/kubie-org/kubie)
- [`steipete/gogcli`](https://github.com/steipete/gogcli)
…itle (#8303)

## Summary

- `communique generate` outputs the first line as a markdown heading
(e.g. `# v2026.2.19: Fixes for...`)
- `head -1` captured the `#` literally, making the GitHub release title
`v2026.2.19: # v2026.2.19: Fixes for...`
- Fix: pipe through `sed 's/^#* *//'` to strip the heading prefix before
setting `RELEASE_TITLE`

This caused the malformed title visible on
https://github.com/jdx/mise/releases/tag/v2026.2.19.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Single-line change to CI release-title formatting; minimal blast
radius and no production code impact.
> 
> **Overview**
> Fixes GitHub release title generation in the `release` workflow by
stripping leading Markdown heading characters from the first line of
`communique generate` output before exporting `RELEASE_TITLE`.
> 
> This prevents duplicated/malformed titles when `communique` emits a `#
...` heading on the first line.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
bd7ca9e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
## Summary

- When `mise install --locked` is run, the `mise.lock` file should not
be modified
- Adds early returns in `update_lockfiles` and `auto_lock_new_versions`
when `Settings::get().locked` is true
- Consistent with how `cargo install --locked` and `uv pip install
--locked` behave: the lock file is treated as authoritative and must not
be updated

## Changes Made

- `update_lockfiles()`: guard changed from `if
!Settings::get().lockfile` to `if !Settings::get().lockfile ||
Settings::get().locked`
- `auto_lock_new_versions()`: guard changed from `if
!Settings::get().lockfile || new_versions.is_empty()` to `if
!Settings::get().lockfile || Settings::get().locked ||
new_versions.is_empty()`

## Testing

- Existing lockfile tests continue to pass
- The `--locked` flag now prevents any writes to `mise.lock` during
install

## Related

- Spec: `/home/jdx/src/mise/src/lockfile.rs`

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Small conditional-guard change that only disables lockfile writes in
locked mode; minimal behavioral surface area and no
security/data-handling impact.
> 
> **Overview**
> When `Settings::get().locked` (e.g. `mise install --locked`) is
enabled, lockfile update paths now short-circuit to avoid modifying
`mise.lock`.
> 
> Specifically, `update_lockfiles` and `auto_lock_new_versions` add an
early return when locked mode is active, preventing post-install
lockfile refresh/auto-lock behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
fdccfd2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Mapped `.vsix` extension to `TarFormat::Zip`.

`vsix` archives are zip archives, without this mapping `.vsix`archives
are treated as `raw` and therefore not extracted.

tests : 
- `cargo test`
- `Manual testing with actual `.vsix` file:
```toml
[tools]
'http:java-debug'.version = "latest"
'http:java-debug'.url = "https://open-vsx.org/api/vscjava/vscode-java-pack/0.30.5/file/vscjava.vscode-java-pack-0.30.5.vsix"
```
@pull pull Bot locked and limited conversation to collaborators Feb 22, 2026
@pull pull Bot added the ⤵️ pull label Feb 22, 2026
@pull
pull Bot merged commit 6cba5c6 into AmadeusITGroup:main Feb 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants