Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
b922840
feat(prepare): add `mise prepare` command for dependency preparation
jdx Dec 13, 2025
93a4ba3
fix(prepare): run prepare after tool installation and add tests
jdx Dec 14, 2025
b523a5e
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 14, 2025
6bd9a83
[autofix.ci] apply automated fixes (attempt 2/3)
autofix-ci[bot] Dec 14, 2025
2a9909e
refactor(prepare): make providers opt-in with per-provider auto setting
jdx Dec 15, 2025
dcf587f
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 15, 2025
7b246d7
feat(prepare): show staleness warning in mise activate shells
jdx Dec 15, 2025
8e41edb
refactor(prepare): split npm provider into npm/yarn/pnpm/bun
jdx Dec 15, 2025
3eb9fb4
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 15, 2025
ce14743
feat(prepare): add cargo, go, pip, poetry, uv, bundler, composer prov…
jdx Dec 15, 2025
1d04a19
perf(prepare): run providers in parallel
jdx Dec 15, 2025
5595530
docs(prepare): add documentation and experimental badge
jdx Dec 15, 2025
affbf15
fix(prepare): fix multiple bugs in prepare system
jdx Dec 15, 2025
6564ba9
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 15, 2025
62f30c3
fix(prepare): use shell_words for proper command parsing
jdx Dec 15, 2025
d31d4b1
fix(prepare): fix toolset env and duplicate dry-run output
jdx Dec 15, 2025
a761d0a
fix(prepare): use &Path instead of &PathBuf in provider constructors
jdx Dec 15, 2025
7c9ceb2
fix(e2e-win): make prepare and task tests self-contained
jdx Dec 15, 2025
f0e689f
fix(prepare): fix remaining clippy warning and Windows e2e tests
jdx Dec 15, 2025
9646869
fix(run): check task --help before toolset/prepare; fix Windows e2e t…
jdx Dec 15, 2025
1af1bdf
fix(e2e): use physical path instead of PSDrive path in Windows tests
jdx Dec 15, 2025
612bb52
Merge remote-tracking branch 'origin/main' into feat/prepare
jdx Dec 15, 2025
cab891a
fix(prepare): remove cargo provider with broken freshness check
jdx Dec 15, 2025
27a874d
docs(prepare): remove cargo provider references
jdx Dec 15, 2025
9e07b69
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 15, 2025
d6771e9
fix(prepare): update CLI doc comment to remove cargo reference
jdx Dec 15, 2025
13d8186
test(prepare): remove cargo provider e2e test
jdx Dec 15, 2025
4dab79f
fix(e2e): use explicit $TestDrive paths in prepare tests
jdx Dec 15, 2025
2a1c8a5
fix(prepare): use go mod vendor when vendor/ exists
jdx Dec 15, 2025
30c20fc
fix(prepare): consistent freshness for globs matching no files
jdx Dec 15, 2025
f6fa6e3
fix(prepare): Windows test PSDrive path and Go provider applicability
jdx Dec 15, 2025
072fef2
fix(prepare): Windows tests and directory freshness check
jdx Dec 15, 2025
d988a0d
fix(prepare): Windows e2e tests use isolated subdirectories
jdx Dec 15, 2025
8ee5668
fix(prepare): don't remove MISE_EXPERIMENTAL in Windows tests
jdx Dec 15, 2025
6337151
fix(test): set MISE_EXPERIMENTAL in vfox test
jdx Dec 15, 2025
e379ef8
fix(prepare): Windows tests set MISE_CONFIG_FILE to prevent parent co…
jdx Dec 15, 2025
b3e0ed3
fix(prepare): skip complex Windows tests, keep basic test
jdx Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
perf(prepare): run providers in parallel
Use parallel::parallel to execute multiple prepare providers concurrently,
respecting the jobs setting for concurrency limits.

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

Co-Authored-By: Claude <noreply@anthropic.com>
  • Loading branch information
jdx and claude committed Dec 15, 2025
commit 1d04a197946a9dce3f7a69811331df3c436ec254
68 changes: 52 additions & 16 deletions src/prepare/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ use eyre::Result;

use crate::cmd::CmdLineRunner;
use crate::config::{Config, Settings};
use crate::miseprintln;
use crate::ui::multi_progress_report::MultiProgressReport;
use crate::{miseprintln, parallel};

use super::PrepareProvider;
use super::providers::{
Expand Down Expand Up @@ -188,10 +188,12 @@ impl PrepareEngine {
.collect()
}

/// Run all stale prepare steps
/// Run all stale prepare steps in parallel
pub async fn run(&self, opts: PrepareOptions) -> Result<PrepareResult> {
let mut results = vec![];
let mpr = MultiProgressReport::get();

// Collect providers that need to run with their commands
let mut to_run: Vec<(String, super::PrepareCommand)> = vec![];

for provider in &self.providers {
let id = provider.id().to_string();
Expand Down Expand Up @@ -230,22 +232,57 @@ impl PrepareEngine {
miseprintln!("[dry-run] would run: {} ({})", cmd.description, id);
results.push(PrepareStepResult::WouldRun(id));
Comment thread
cursor[bot] marked this conversation as resolved.
} else {
to_run.push((id, cmd));
}
} else {
trace!("prepare step {} is fresh, skipping", id);
results.push(PrepareStepResult::Fresh(id));
}
}

// Run stale providers in parallel
if !to_run.is_empty() {
let mpr = MultiProgressReport::get();
let project_root = self
.config
.project_root
.clone()
.unwrap_or_else(|| std::env::current_dir().unwrap_or_default());
let toolset_env = opts.env.clone();

// Include all data in the tuple so closure doesn't capture anything
let to_run_with_context: Vec<_> = to_run
.into_iter()
.map(|(id, cmd)| {
(
id,
cmd,
mpr.clone(),
project_root.clone(),
toolset_env.clone(),
)
})
.collect();

let run_results = parallel::parallel(
to_run_with_context,
|(id, cmd, mpr, project_root, toolset_env)| async move {
let pr = mpr.add(&cmd.description);
match self.execute_prepare(&cmd, &opts.env) {
match Self::execute_prepare_static(&cmd, &toolset_env, &project_root) {
Ok(()) => {
pr.finish_with_message(format!("{} done", cmd.description));
results.push(PrepareStepResult::Ran(id));
Ok(PrepareStepResult::Ran(id))
}
Err(e) => {
pr.finish_with_message(format!("{} failed: {}", cmd.description, e));
return Err(e);
Err(e)
}
}
}
} else {
trace!("prepare step {} is fresh, skipping", id);
results.push(PrepareStepResult::Fresh(id));
}
},
)
.await?;

results.extend(run_results);
}

Ok(PrepareResult { steps: results })
Expand Down Expand Up @@ -282,17 +319,16 @@ impl PrepareEngine {
Ok(mtimes.into_iter().max())
}

/// Execute a prepare command
fn execute_prepare(
&self,
/// Execute a prepare command (static version for parallel execution)
fn execute_prepare_static(
cmd: &super::PrepareCommand,
toolset_env: &BTreeMap<String, String>,
default_project_root: &PathBuf,
) -> Result<()> {
let cwd = cmd
.cwd
.clone()
.or_else(|| self.config.project_root.clone())
.unwrap_or_else(|| std::env::current_dir().unwrap_or_default());
.unwrap_or_else(|| default_project_root.clone());

let mut runner = CmdLineRunner::new(&cmd.program)
.args(&cmd.args)
Expand Down