Skip to content

fix(trust): run enter hooks after trusting config#9634

Merged
jdx merged 6 commits intojdx:mainfrom
risu729:fix-trust-enter-hook
May 7, 2026
Merged

fix(trust): run enter hooks after trusting config#9634
jdx merged 6 commits intojdx:mainfrom
risu729:fix-trust-enter-hook

Conversation

@risu729
Copy link
Copy Markdown
Contributor

@risu729 risu729 commented May 5, 2026

Summary

  • run enter hooks after mise trust newly trusts a config for the current directory
  • avoid running hooks for configs trusted from outside their project root or configs that were already trusted
  • add e2e coverage for trust-triggered enter hooks

Discussion: #4882

Tests

  • cargo check
  • mise run test:e2e e2e/config/test_hooks_trust_enter

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 5, 2026

Greptile Summary

This PR runs enter hooks after mise trust newly trusts a config for the current directory, by adding a new run_enter_hooks_for_newly_loaded_configs function called from hook_env's main loop. It also prevents spurious fast-exits by checking whether the trust-state directories have been modified.

  • run_enter_hooks_for_newly_loaded_configs identifies configs that appear in config_files but not in PREV_SESSION.loaded_configs, fires their Enter hooks only when CWD is inside their project root, and returns early when a directory change is already in progress (preventing double-fire with the normal run_all_hooks enter path).
  • have_trust_state_dirs_been_modified watches TRUSTED_CONFIGS and IGNORED_CONFIGS directory mtimes so a trust operation bypasses the fast-exit path and causes a full hook-env run.
  • The e2e test covers the basic trust, repeated trust (no re-fire), child config trust (parent does not re-fire), and --all flag scenarios.

Confidence Score: 5/5

Safe to merge; the new trust-triggered enter hook path is correctly gated behind dir-change absence and the newly-loaded-config filter, with no interference with existing hook flows.

The mutual exclusion between run_all_hooks (scheduled on dir-change) and run_enter_hooks_for_newly_loaded_configs (early-return when dir-change is present) is correctly implemented. The have_trust_state_dirs_been_modified fast-path bypass is sound. The println! placement outside the if let Some(shell) guard is pre-existing behavior, not a regression. The e2e test covers the main user-facing scenarios and the refactored run_matched_hook function is a pure extract with no semantic change.

No files require special attention.

Reviews (4): Last reviewed commit: "Merge branch 'main' into fix-trust-enter..." | Re-trigger Greptile

Comment thread src/hooks.rs Outdated
Comment thread e2e/config/test_hooks_trust_enter Outdated
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request enables enter hooks to run immediately after a configuration file is trusted using the mise trust command. The trust CLI logic was updated to track newly trusted paths and trigger the corresponding hooks if the current working directory is within the trusted root. Additionally, the hook execution logic was refactored for better reuse, and an end-to-end test was added to ensure the feature works as expected. I have no feedback to provide.

Comment thread src/cli/trust.rs Outdated
}
}
Ok(())
self.run_enter_hooks(trusted_roots).await
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't think I agree this is a smart idea, it makes the behavior more complicated

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I simplified this so mise trust is trust-only again: it only updates trust state and no longer reloads config or runs hooks directly.

The enter behavior now lives in the shell lifecycle. hook-env watches trust/ignore state mtimes to break the fast path, reloads config, compares newly loaded configs against the previous session, and runs scoped enter hooks for those newly loaded roots only. It skips that path when there is a directory change so the existing enter handling remains responsible for normal cd behavior.

This comment was generated by an AI coding assistant.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jdx Did you mean the implementation was complicated? Or this feature itself? Please feel free to close this PR; I agree it makes thing complicated.

@risu729

This comment was marked as outdated.

@risu729

This comment was marked as outdated.

@risu729 risu729 marked this pull request as ready for review May 7, 2026 09:20
@jdx jdx merged commit 49205c4 into jdx:main May 7, 2026
33 checks passed
@risu729 risu729 deleted the fix-trust-enter-hook branch May 7, 2026 12:13
mise-en-dev added a commit that referenced this pull request May 7, 2026
### 🚀 Features

- **(aqua)** support registry libc variants by @jdx in
[#9652](#9652)
- **(bin-paths)** add executable names output by @risu729 in
[#9617](#9617)

### 🐛 Bug Fixes

- **(aqua)** preserve configured file extensions by @risu729 in
[#9611](#9611)
- **(aqua)** support registry file links by @risu729 in
[#9610](#9610)
- **(backend)** reject bare package backend names by @risu729 in
[#9608](#9608)
- **(backend)** apply inline tool option overrides by @risu729 in
[#9306](#9306)
- **(backend)** skip versions host for local tool opts by @risu729 in
[#9568](#9568)
- **(github)** chmod explicit archive bin by @risu729 in
[#9609](#9609)
- **(install)** skip remote-versions refresh in prefer-offline mode by
@jdx in [#9627](#9627)
- **(lock)** scope targets to active project root by @risu729 in
[#9319](#9319)
- **(lockfile)** respect existing platforms during auto-lock by @jdx in
[#9621](#9621)
- **(pipx)** filter yanked pypi releases by @risu729 in
[#9607](#9607)
- **(pipx)** declare python as a backend dependency by @jdx in
[#9678](#9678)
- **(schema)** update refs to $defs in mise-registry-tool.json by
@risu729 in [#9671](#9671)
- **(task)** terminate parallel siblings on failure via process groups
by @jdx in [#9655](#9655)
- **(task)** stable MISE_PROJECT_ROOT for monorepo tasks, add
MISE_MONOREPO_ROOT by @jdx in
[#9657](#9657)
- **(trust)** run enter hooks after trusting config by @risu729 in
[#9634](#9634)
- **(ui)** stop clearing screen for prompts by @jdx in
[#9619](#9619)
- use /bin/cp on macos by @pdehlke in
[#9656](#9656)

### 🚜 Refactor

- **(aqua)** store aqua var defaults as strings by @risu729 in
[#9645](#9645)
- **(config)** support structured TOML values in registry backend
options by @risu729 in [#9584](#9584)
- **(deps)** remove serde_derive dependency by @risu729 in
[#9670](#9670)
- **(deps)** remove anyhow dependency by @risu729 in
[#9661](#9661)
- **(deps)** use std::sync::LazyLock instead of once_cell::Lazy by
@risu729 in [#9668](#9668)
- **(schema)** generate task schema from mise schema by @risu729 in
[#9581](#9581)
- **(schema)** reuse task props with unevaluatedProperties by @risu729
in [#9582](#9582)
- **(schema)** reuse registry common types by @risu729 in
[#9648](#9648)
- **(schema)** reuse plugin script config by @risu729 in
[#9647](#9647)
- **(schema)** use $defs in schema files by @risu729 in
[#9646](#9646)

### 📚 Documentation

- **(node)** add tips for enabling node idiomatic by @fu050409 in
[#9675](#9675)

### 🧪 Testing

- **(cli)** remove nondeterministic tool depends assertion by @risu729
in [#9633](#9633)
- **(e2e)** pin uv to 0.11.8 around astral-sh/uv#19278 by @jdx in
[#9618](#9618)
- **(e2e)** wait for docker env cleanup by @risu729 in
[#9631](#9631)
- **(zig)** use official zig instead of mach mirror by @jdx in
[#9659](#9659)

### 📦️ Dependency Updates

- fall through to hash check when providers have no outputs by @jdx in
[#9622](#9622)
- bump Cargo.lock by @jdx in
[#9625](#9625)

### 📦 Registry

- remove registry depends by @risu729 in
[#9571](#9571)
- add code-review-graph (pipx:code-review-graph) by @chautruonglong in
[#9673](#9673)

### Chore

- **(ci)** split large registry test-tool changes by @risu729 in
[#9628](#9628)
- **(ci)** make perf script robust to runner noise by @jdx in
[#9635](#9635)
- **(ci)** skip hyperfine comments without permission by @risu729 in
[#9629](#9629)

### New Contributors

- @chautruonglong made their first contribution in
[#9673](#9673)
- @pdehlke made their first contribution in
[#9656](#9656)

## 📦 Aqua Registry Updates

### New Packages (5)

-
[`anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli)
- [`crates.io/wasmi_cli`](https://github.com/wasmi-labs/wasmi)
- [`openclaw/gogcli`](https://github.com/openclaw/gogcli)
- `racket-lang.org/racket-minimal`
- [`runs-on/cli`](https://github.com/runs-on/cli)

### Updated Packages (13)

- [`UpCloudLtd/upcloud-cli`](https://github.com/UpCloudLtd/upcloud-cli)
- [`aristocratos/btop`](https://github.com/aristocratos/btop)
- [`dprint/dprint`](https://github.com/dprint/dprint)
- [`j178/prek`](https://github.com/j178/prek)
- [`jdx/hk`](https://github.com/jdx/hk)
- [`jdx/mise`](https://github.com/jdx/mise)
- [`jdx/usage`](https://github.com/jdx/usage)
- [`jreleaser/jreleaser`](https://github.com/jreleaser/jreleaser)
-
[`jreleaser/jreleaser/standalone`](https://github.com/jreleaser/jreleaser)
- [`pnpm/pnpm`](https://github.com/pnpm/pnpm)
- [`suzuki-shunsuke/cmdx`](https://github.com/suzuki-shunsuke/cmdx)
- [`suzuki-shunsuke/ghir`](https://github.com/suzuki-shunsuke/ghir)
- [`twpayne/chezmoi`](https://github.com/twpayne/chezmoi)
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.

2 participants