feat(set): add -E/--env flag to mise set command#6291
Conversation
Adds environment-specific config file support to `mise set`, allowing users to create files like `mise.staging.toml` instead of modifying the main `mise.toml`. Fixes: #5046 Changes: - Add -E/--env flag to Set struct with proper clap attributes - Update filename() method to handle environment-specific paths - Add e2e test to verify functionality - Update help documentation with examples 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Pull Request Overview
This PR adds support for environment-specific configuration files to the mise set command by implementing the -E/--env flag. This allows users to create or modify environment-specific config files like mise.staging.toml instead of always modifying the main mise.toml file.
- Added
-E/--envflag to themise setcommand for environment-specific configurations - Updated the filename resolution logic to handle environment-specific config file paths
- Added comprehensive end-to-end test to verify the new functionality
Reviewed Changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/cli/set.rs | Added -E/--env flag support and updated filename resolution logic for environment-specific config files |
| e2e/cli/test_set_env | New end-to-end test to verify the -E flag creates environment-specific config files |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
src/cli/set.rs
Outdated
| } else if self.global { | ||
| config::global_config_path() | ||
| } else if let Some(env) = &self.env { | ||
| let cwd = env::current_dir().unwrap_or_default(); |
There was a problem hiding this comment.
Using unwrap_or_default() on current_dir() will silently fail and return an empty PathBuf if the current directory cannot be determined. This could lead to unexpected behavior when trying to create config files. Consider propagating the error or using a more explicit fallback strategy.
src/cli/set.rs
Outdated
| let p = cwd.join(format!(".mise.{env}.toml")); | ||
| if p.exists() { | ||
| p | ||
| } else { | ||
| cwd.join(format!("mise.{env}.toml")) |
There was a problem hiding this comment.
[nitpick] The string formatting is duplicated in both branches. Consider extracting the filename generation into a helper function or storing the formatted strings in variables to reduce duplication and improve maintainability.
| let p = cwd.join(format!(".mise.{env}.toml")); | |
| if p.exists() { | |
| p | |
| } else { | |
| cwd.join(format!("mise.{env}.toml")) | |
| let make_env_filename = |env: &str, dotted: bool| { | |
| if dotted { | |
| format!(".mise.{env}.toml") | |
| } else { | |
| format!("mise.{env}.toml") | |
| } | |
| }; | |
| let p = cwd.join(make_env_filename(env, true)); | |
| if p.exists() { | |
| p | |
| } else { | |
| cwd.join(make_env_filename(env, false)) |
Hyperfine Performance
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2025.9.10 x -- echo |
19.1 ± 0.2 | 18.7 | 21.5 | 1.00 |
mise x -- echo |
19.2 ± 0.2 | 18.7 | 20.4 | 1.00 ± 0.02 |
mise env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2025.9.10 env |
18.5 ± 0.3 | 17.9 | 21.5 | 1.00 |
mise env |
18.7 ± 0.5 | 18.1 | 24.2 | 1.01 ± 0.03 |
mise hook-env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2025.9.10 hook-env |
18.2 ± 0.6 | 17.7 | 24.9 | 1.00 |
mise hook-env |
18.3 ± 0.4 | 17.8 | 25.4 | 1.00 ± 0.04 |
mise ls
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2025.9.10 ls |
16.0 ± 0.2 | 15.6 | 17.4 | 1.00 |
mise ls |
16.1 ± 0.2 | 15.6 | 17.2 | 1.00 ± 0.02 |
xtasks/test/perf
| Command | mise-2025.9.10 | mise | Variance |
|---|---|---|---|
| install (cached) | 165ms | ✅ 101ms | +63% |
| ls (cached) | 62ms | 62ms | +0% |
| bin-paths (cached) | 68ms | 68ms | +0% |
| task-ls (cached) | 477ms | 477ms | +0% |
✅ Performance improvement: install cached is 63%
Fixed inconsistent error handling between filename() and get_mise_toml() methods. Both now properly propagate env::current_dir() errors instead of silently falling back to an empty path, preventing files from being created in unexpected locations. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
The cur_env() method now correctly reads from environment-specific files when the -E flag is used for listing or getting environment variables. Previously, it would incorrectly read from all config sources instead of the specified environment file. Also added comprehensive e2e tests to verify the -E flag behavior for both read and write operations. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
## [2025.9.12](https://github.com/jdx/mise/compare/v2025.9.11..v2025.9.12) - 2025-09-16 ### 🐛 Bug Fixes - **(ci)** properly exclude aqua-registry files from hk linting by @jdx in [42d7758](jdx/mise@42d7758) ### Chore - **(release)** embed aqua-registry under crate and publish like vfox by @jdx in [#6306](jdx/mise#6306) - ignore aqua-registry assets from prettier by @jdx in [047d77b](jdx/mise@047d77b) - disable "useless cat" shellcheck by @jdx in [a6def59](jdx/mise@a6def59) ## [2025.9.11](https://github.com/jdx/mise/compare/v2025.9.10..v2025.9.11) - 2025-09-16 ### 📦 Registry - indicate aws-cli is v2 by @jayvdb in [#6300](jdx/mise#6300) ### 🚀 Features - **(ci)** run all registry tools when workflow_dispatch is triggered by @jdx in [#6295](jdx/mise#6295) - **(cli)** handle non-existent working directories gracefully by @jdx in [#6304](jdx/mise#6304) - **(set)** add -E/--env flag to mise set command by @jdx in [#6291](jdx/mise#6291) - **(tasks)** make auto outputs default by @risu729 in [#6137](jdx/mise#6137) ### 🐛 Bug Fixes - align crate versions to fix release-plz script by @jdx in [5a464e9](jdx/mise@5a464e9) ### 🚜 Refactor - **(aqua)** extract aqua registry into internal subcrate by @jdx in [#6293](jdx/mise#6293) ### 📚 Documentation - fix mkdir paths by @risu729 in [#6298](jdx/mise#6298) - fix rust profile default by @risu729 in [#6305](jdx/mise#6305) ### Chore - **(aqua-registry)** remove unused aqua-registry files by @jdx in [#6294](jdx/mise#6294) - **(release)** make release-plz idempotent for existing crate versions by @jdx in [dbdfd6a](jdx/mise@dbdfd6a) - **(release)** skip publishing mise when aqua-registry is a path dep by @jdx in [47efffd](jdx/mise@47efffd) - keep aqua-registry LICENSE file by @risu729 in [#6297](jdx/mise#6297) ### New Contributors - @jayvdb made their first contribution in [#6300](jdx/mise#6300) ## [2025.9.10](https://github.com/jdx/mise/compare/v2025.9.9..v2025.9.10) - 2025-09-13 ### 📦 Registry - use asdf to install semver-tool by @jylenhof in [#6233](jdx/mise#6233) ### 🐛 Bug Fixes - **(tool-stub)** detect binary names from single-file downloads by @jdx in [#6281](jdx/mise#6281) ### 🚜 Refactor - allow any collection types in deserialize_arr by @risu729 in [#6282](jdx/mise#6282) - use deserialize_arr for task runs by @risu729 in [#6253](jdx/mise#6253) ### 📚 Documentation - **(getting-started)** add backends step with diagram, github example, env vars and simple tasks by @jdx in [#6288](jdx/mise#6288) - simplify OS detection in tool plugin development by @jdx in [#6287](jdx/mise#6287) - update backend plugin template references by @jdx in [942f5eb](jdx/mise@942f5eb) ### 📦️ Dependency Updates - update rust crate chrono to v0.4.42 by @renovate[bot] in [#6274](jdx/mise#6274) - update taiki-e/install-action digest to 0154864 by @renovate[bot] in [#6273](jdx/mise#6273) ### Chore - **(schema)** fix schema for subtasks by @risu729 in [#6289](jdx/mise#6289) - update render:schema task by @risu729 in [#6275](jdx/mise#6275) ## [2025.9.9](https://github.com/jdx/mise/compare/v2025.9.8..v2025.9.9) - 2025-09-11 ### 🐛 Bug Fixes - **(backend)** make HTTP installs atomic and serialize with cache lock by @jdx in [#6259](jdx/mise#6259) - **(env)** allow nested env._.path directives by @risu729 in [#6160](jdx/mise#6160) - **(env)** disallow nested env objects by @risu729 in [#6268](jdx/mise#6268) - **(schema)** allow nested arrays in task.depends by @risu729 in [#6265](jdx/mise#6265) - **(task)** resolve jobs=1 hang and keep-order panic; improve Ctrl-C handling by @jdx in [#6264](jdx/mise#6264) - **(tasks)** stop CLI group after first failure without --continue-on-error by @jdx in [#6270](jdx/mise#6270) ### 📚 Documentation - fixed toml issues in URL replacements settings documentation by @ThomasSteinbach in [#6269](jdx/mise#6269) ### Chore - **(schema)** strict oneOf branches and DRY env_directive in schemas by @jdx in [#6271](jdx/mise#6271) - add schema linter by @risu729 in [#6267](jdx/mise#6267) ## [2025.9.8](https://github.com/jdx/mise/compare/v2025.9.7..v2025.9.8) - 2025-09-10 ### 🐛 Bug Fixes - **(tasks)** prevent hang when task fails in sequence by @jdx in [#6260](jdx/mise#6260) - **(version)** fetch mise version if cached version is older than the current by @risu729 in [#6252](jdx/mise#6252) ### 📦️ Dependency Updates - update rhysd/action-setup-vim action to v1.4.3 by @renovate[bot] in [#6249](jdx/mise#6249) ## [2025.9.7](https://github.com/jdx/mise/compare/v2025.9.6..v2025.9.7) - 2025-09-09 ### 🐛 Bug Fixes - **(env)** allow mixed map for env._.file by @risu729 in [#6148](jdx/mise#6148) - **(tasks)** restore parallel starts with poetry via list_paths cache and stable exec-env cache by @jdx in [#6237](jdx/mise#6237) - add 'unknown' to the list of OS patterns by @efussi in [#6235](jdx/mise#6235) - propagate errors from backend installs by @jdx in [#6236](jdx/mise#6236) ### 📦️ Dependency Updates - update taiki-e/install-action digest to 0c5db7f by @renovate[bot] in [#6244](jdx/mise#6244) - update golang docker tag to v1.25.1 by @renovate[bot] in [#6247](jdx/mise#6247) - update dependency vitepress to v1.6.4 by @renovate[bot] in [#6246](jdx/mise#6246) ### New Contributors - @efussi made their first contribution in [#6235](jdx/mise#6235)
Summary
-E/--envflag to themise setcommand for creating environment-specific config filesmise.staging.tomlinstead of modifying the mainmise.tomlmise use --envProblem
When using
mise set -Eto set an environment, if a.mise.tomlfile already exists, the command did not create the expected environment file (e.g.,.mise.pp.toml). Instead, it would modify the existing.mise.tomlfile.Fixes: #5046
Changes
-E/--envflag toSetstruct with proper clap attributes and conflict resolutionfilename()method to handle environment-specific config file pathstest_set_env) to verify functionalityTest plan
mise setfunctionality still worksmise use --envfunctionality still works-Eflag🤖 Generated with Claude Code