From 2f924a7d066784dd192b71ff4812a7bfad8c9553 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 Aug 2025 06:10:01 -0500 Subject: [PATCH 1/5] feat(timeout): show duration, URL, and config hint on timeouts; increase fetch timeout default to 10s - HTTP errors now display the timeout (e.g. 10s), the requested URL, and how to change it (`http_timeout`/MISE_HTTP_TIMEOUT or `fetch_remote_versions_timeout`/MISE_FETCH_REMOTE_VERSIONS_TIMEOUT) - Fetch tasks include duration and config hint in timeout errors - Default `fetch_remote_versions_timeout` increased from 5s to 10s --- settings.toml | 2 +- src/http.rs | 155 +++++++++++++++++++++++++++++++++++----- src/plugins/core/mod.rs | 7 +- src/timeout.rs | 9 ++- 4 files changed, 150 insertions(+), 23 deletions(-) diff --git a/settings.toml b/settings.toml index ca39b17e5b..279afd8746 100644 --- a/settings.toml +++ b/settings.toml @@ -391,7 +391,7 @@ cached. For "slow" commands like `mise ls-remote` or `mise install`: [fetch_remote_versions_timeout] env = "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT" type = "Duration" -default = "5s" +default = "10s" description = "Timeout in seconds for HTTP requests to fetch new tool versions in mise." aliases = ["fetch_remote_version_timeout"] diff --git a/src/http.rs b/src/http.rs index 2e14b178f7..bf589e53ed 100644 --- a/src/http.rs +++ b/src/http.rs @@ -12,29 +12,47 @@ use crate::cli::version; use crate::config::Settings; use crate::file::display_path; use crate::ui::progress_report::SingleReport; +use crate::ui::time::format_duration; use crate::{env, file}; #[cfg(not(test))] pub static HTTP_VERSION_CHECK: Lazy = - Lazy::new(|| Client::new(Duration::from_secs(3)).unwrap()); + Lazy::new(|| Client::new(Duration::from_secs(3), ClientKind::VersionCheck).unwrap()); -pub static HTTP: Lazy = Lazy::new(|| Client::new(Settings::get().http_timeout()).unwrap()); +pub static HTTP: Lazy = + Lazy::new(|| Client::new(Settings::get().http_timeout(), ClientKind::Http).unwrap()); -pub static HTTP_FETCH: Lazy = - Lazy::new(|| Client::new(Settings::get().fetch_remote_versions_timeout()).unwrap()); +pub static HTTP_FETCH: Lazy = Lazy::new(|| { + Client::new( + Settings::get().fetch_remote_versions_timeout(), + ClientKind::Fetch, + ) + .unwrap() +}); #[derive(Debug)] pub struct Client { reqwest: reqwest::Client, + timeout: Duration, + kind: ClientKind, +} + +#[derive(Debug, Clone, Copy)] +enum ClientKind { + Http, + Fetch, + VersionCheck, } impl Client { - fn new(timeout: Duration) -> Result { + fn new(timeout: Duration, kind: ClientKind) -> Result { Ok(Self { reqwest: Self::_new() .read_timeout(timeout) .connect_timeout(timeout) .build()?, + timeout, + kind, }) } @@ -65,11 +83,47 @@ impl Client { headers: &HeaderMap, ) -> Result { ensure!(!*env::OFFLINE, "offline mode is enabled"); - let get = |url: Url| async move { + let mut url = url.into_url().unwrap(); + let do_get = |url: Url, + client: reqwest::Client, + headers: HeaderMap, + timeout: Duration, + kind: ClientKind| async move { debug!("GET {}", &url); - let mut req = self.reqwest.get(url.clone()); + let mut req = client.get(url.clone()); req = req.headers(headers.clone()); - let resp = req.send().await?; + let resp = match req.send().await { + Ok(resp) => resp, + Err(err) => { + if err.is_timeout() { + let (setting, env_var) = match kind { + ClientKind::Http => ("http_timeout", "MISE_HTTP_TIMEOUT"), + ClientKind::Fetch => ( + "fetch_remote_versions_timeout", + "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT", + ), + ClientKind::VersionCheck => ("version_check_timeout", ""), + }; + let hint = if env_var.is_empty() { + format!( + "HTTP timed out after {} for {}.", + format_duration(timeout), + url + ) + } else { + format!( + "HTTP timed out after {} for {} (change with `{}` or env `{}`).", + format_duration(timeout), + url, + setting, + env_var + ) + }; + bail!(hint); + } + return Err(err.into()); + } + }; if *env::MISE_LOG_HTTP { eprintln!("GET {url} {}", resp.status()); } @@ -78,13 +132,27 @@ impl Client { resp.error_for_status_ref()?; Ok(resp) }; - let mut url = url.into_url().unwrap(); - let resp = match get(url.clone()).await { + + let resp = match do_get( + url.clone(), + self.reqwest.clone(), + headers.clone(), + self.timeout, + self.kind, + ) + .await + { Ok(resp) => resp, Err(_) if url.scheme() == "http" => { - // try with https since http may be blocked url.set_scheme("https").unwrap(); - get(url).await? + do_get( + url, + self.reqwest.clone(), + headers.clone(), + self.timeout, + self.kind, + ) + .await? } Err(err) => return Err(err), }; @@ -105,11 +173,47 @@ impl Client { headers: &HeaderMap, ) -> Result { ensure!(!*env::OFFLINE, "offline mode is enabled"); - let head = |url: Url| async move { + let mut url = url.into_url().unwrap(); + let do_head = |url: Url, + client: reqwest::Client, + headers: HeaderMap, + timeout: Duration, + kind: ClientKind| async move { debug!("HEAD {}", &url); - let mut req = self.reqwest.head(url.clone()); + let mut req = client.head(url.clone()); req = req.headers(headers.clone()); - let resp = req.send().await?; + let resp = match req.send().await { + Ok(resp) => resp, + Err(err) => { + if err.is_timeout() { + let (setting, env_var) = match kind { + ClientKind::Http => ("http_timeout", "MISE_HTTP_TIMEOUT"), + ClientKind::Fetch => ( + "fetch_remote_versions_timeout", + "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT", + ), + ClientKind::VersionCheck => ("version_check_timeout", ""), + }; + let hint = if env_var.is_empty() { + format!( + "HTTP timed out after {} for {}.", + format_duration(timeout), + url + ) + } else { + format!( + "HTTP timed out after {} for {} (change with `{}` or env `{}`).", + format_duration(timeout), + url, + setting, + env_var + ) + }; + bail!(hint); + } + return Err(err.into()); + } + }; if *env::MISE_LOG_HTTP { eprintln!("HEAD {url} {}", resp.status()); } @@ -118,13 +222,26 @@ impl Client { resp.error_for_status_ref()?; Ok(resp) }; - let mut url = url.into_url().unwrap(); - let resp = match head(url.clone()).await { + let resp = match do_head( + url.clone(), + self.reqwest.clone(), + headers.clone(), + self.timeout, + self.kind, + ) + .await + { Ok(resp) => resp, Err(_) if url.scheme() == "http" => { - // try with https since http may be blocked url.set_scheme("https").unwrap(); - head(url).await? + do_head( + url, + self.reqwest.clone(), + headers.clone(), + self.timeout, + self.kind, + ) + .await? } Err(err) => return Err(err), }; diff --git a/src/plugins/core/mod.rs b/src/plugins/core/mod.rs index a834eb3f75..779198fd43 100644 --- a/src/plugins/core/mod.rs +++ b/src/plugins/core/mod.rs @@ -1,3 +1,4 @@ +use color_eyre::eyre::Context; use eyre::Result; use std::ffi::OsString; use std::sync::Arc; @@ -57,7 +58,11 @@ where F: FnOnce() -> Result + Send, T: Send, { - run_with_timeout(f, Settings::get().fetch_remote_versions_timeout()) + let timeout = Settings::get().fetch_remote_versions_timeout(); + run_with_timeout(f, timeout).context(format!( + "timed out after {} (change with `fetch_remote_versions_timeout` or env `MISE_FETCH_REMOTE_VERSIONS_TIMEOUT`)", + crate::ui::time::format_duration(timeout) + )) } pub fn new_backend_arg(tool_name: &str) -> BackendArg { diff --git a/src/timeout.rs b/src/timeout.rs index c1e7606f73..3e2103c667 100644 --- a/src/timeout.rs +++ b/src/timeout.rs @@ -2,6 +2,7 @@ use std::sync::mpsc; use std::thread; use std::time::Duration; +use crate::ui::time::format_duration; use color_eyre::eyre::{Context, Result}; pub fn run_with_timeout(f: F, timeout: Duration) -> Result @@ -16,7 +17,8 @@ where // If sending fails, the timeout has already been reached. let _ = tx.send(result); }); - rx.recv_timeout(timeout).context("timed out") + rx.recv_timeout(timeout) + .context(format!("timed out after {}", format_duration(timeout))) })? } @@ -29,6 +31,9 @@ where match tokio::time::timeout(timeout, f()).await { Ok(Ok(output)) => Ok(output), Ok(Err(e)) => Err(e), - Err(_) => Err(eyre::eyre!("timed out")), + Err(_) => Err(eyre::eyre!(format!( + "timed out after {}", + format_duration(timeout) + ))), } } From 054d570265dc34a81d91536950d4ba446a1b7a10 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:16:35 +0000 Subject: [PATCH 2/5] [autofix.ci] apply automated fixes --- schema/mise.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schema/mise.json b/schema/mise.json index e51e021dd8..8a8c0323e5 100644 --- a/schema/mise.json +++ b/schema/mise.json @@ -449,7 +449,7 @@ "type": "string" }, "fetch_remote_versions_timeout": { - "default": "5s", + "default": "10s", "description": "Timeout in seconds for HTTP requests to fetch new tool versions in mise.", "type": "string" }, From d710c5d19763e02fa3b8ac221b20adc452c75288 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 Aug 2025 06:30:35 -0500 Subject: [PATCH 3/5] chore: cargo up (#5992) --- Cargo.lock | 393 ++++++++++++++++++++++++++---------------------- man/man1/mise.1 | 8 +- 2 files changed, 216 insertions(+), 185 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ed2352072..1f339bb83c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,9 +159,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -189,29 +189,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arbitrary" @@ -521,9 +521,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.30" +version = "1.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" dependencies = [ "jobserver", "libc", @@ -625,9 +625,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "1c1f056bae57e3e54c3375c41ff79619ddd13460a17d7438712bd0d83fda4ff8" dependencies = [ "clap_builder", "clap_derive", @@ -635,9 +635,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -665,9 +665,9 @@ checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "clap_mangen" -version = "0.2.28" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2fb6d3f935bbb9819391528b0e7cf655e78a0bc7a7c3d227211a1d24fc11db1" +checksum = "27b4c3c54b30f0d9adcb47f25f61fcce35c4dd8916638c6b82fbd5f4fb4179e2" dependencies = [ "clap", "roff", @@ -755,9 +755,9 @@ dependencies = [ [[package]] name = "confique" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011f79ecb68498e94453e133c67cc5c35ab847684c59fa58b9ce0698e272e7b" +checksum = "33cbbbdc4e7bec8bd8a61bc21159fc79fa22004754feb0a83f78119b3918e0b3" dependencies = [ "confique-macro", "serde", @@ -765,9 +765,9 @@ dependencies = [ [[package]] name = "confique-macro" -version = "0.0.11" +version = "0.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df20583fae327154743356c4896906bda1aa9b7df30c5aed73a54cf27fede9de" +checksum = "85d58122c074ab6431418377f20b74cac2d37be215a94784f1aa319e89200aab" dependencies = [ "heck", "proc-macro2", @@ -967,9 +967,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4735f265ba6a1188052ca32d461028a7d1125868be18e287e756019da7607b5" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" dependencies = [ "ctor-proc-macro", "dtor", @@ -977,9 +977,9 @@ dependencies = [ [[package]] name = "ctor-proc-macro" -version = "0.0.5" +version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f211af61d8efdd104f96e57adf5e426ba1bc3ed7a4ead616e15e5881fd79c4d" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" [[package]] name = "ctr" @@ -1029,12 +1029,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a79c4acb1fd5fa3d9304be4c76e031c54d2e92d172a393e24b19a14fe8532fe9" +checksum = "d6b136475da5ef7b6ac596c0e956e37bad51b85b987ff3d5e230e964936736b2" dependencies = [ - "darling_core 0.21.0", - "darling_macro 0.21.0", + "darling_core 0.21.1", + "darling_macro 0.21.1", ] [[package]] @@ -1053,9 +1053,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74875de90daf30eb59609910b84d4d368103aaec4c924824c6799b28f77d6a1d" +checksum = "b44ad32f92b75fb438b04b68547e521a548be8acc339a6dacc4a7121488f53e6" dependencies = [ "fnv", "ident_case", @@ -1078,11 +1078,11 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79f8e61677d5df9167cd85265f8e5f64b215cdea3fb55eebc3e622e44c7a146" +checksum = "2b5be8a7a562d315a5b92a630c30cec6bcf663e6673f00fbb69cca66a6f521b9" dependencies = [ - "darling_core 0.21.0", + "darling_core 0.21.1", "quote", "syn 2.0.104", ] @@ -1284,9 +1284,9 @@ dependencies = [ [[package]] name = "duct" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ce170a0e8454fa0f9b0e5ca38a6ba17ed76a50916839d217eb5357e05cdfde" +checksum = "d7478638a31d1f1f3d6c9f5e57c76b906a04ac4879d6fd0fb6245bc88f73fd0b" dependencies = [ "libc", "os_pipe", @@ -1302,9 +1302,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ed25519" @@ -1464,7 +1464,7 @@ dependencies = [ "pest_derive", "regex", "strum", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -1869,20 +1869,20 @@ dependencies = [ "regex", "signal-hook", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "gix-actor" -version = "0.35.2" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ebbb8f41071c7cf318a0b1db667c34e1df49db7bf387d282a4e61a3b97882c" +checksum = "d1b1ec302f8dc059df125ed46dfdc7e9d33fe7724df19843aea53b5ffd32d5bb" dependencies = [ "bstr", "gix-date", "gix-utils", "itoa", - "thiserror 2.0.12", + "thiserror 2.0.14", "winnow 0.7.12", ] @@ -1897,7 +1897,7 @@ dependencies = [ "gix-object", "gix-worktree-stream", "jiff", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -1913,7 +1913,7 @@ dependencies = [ "gix-trace", "kstring", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "unicode-bom", ] @@ -1923,7 +1923,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -1932,7 +1932,7 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -1958,7 +1958,7 @@ dependencies = [ "gix-chunk", "gix-hash", "memmap2", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -1977,7 +1977,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "unicode-bom", "winnow 0.7.12", ] @@ -1992,7 +1992,7 @@ dependencies = [ "bstr", "gix-path", "libc", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2010,20 +2010,20 @@ dependencies = [ "gix-sec", "gix-trace", "gix-url", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "gix-date" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7235bdf4d9d54a6901928e3a37f91c16f419e6957f520ed929c3d292b84226e" +checksum = "996b6b90bafb287330af92b274c3e64309dc78359221d8612d11cd10c8b9fe1c" dependencies = [ "bstr", "itoa", "jiff", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2047,7 +2047,7 @@ dependencies = [ "gix-traverse", "gix-worktree", "imara-diff", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2067,7 +2067,7 @@ dependencies = [ "gix-trace", "gix-utils", "gix-worktree", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2083,14 +2083,14 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "gix-features" -version = "0.43.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a92748623c201568785ee69a561f4eec06f745b4fac67dab1d44ca9891a57ee" +checksum = "cd1543cd9b8abcbcebaa1a666a5c168ee2cda4dea50d3961ee0e6d1c42f81e5b" dependencies = [ "bytes", "bytesize", @@ -2104,7 +2104,7 @@ dependencies = [ "once_cell", "parking_lot", "prodash", - "thiserror 2.0.12", + "thiserror 2.0.14", "walkdir", ] @@ -2126,7 +2126,7 @@ dependencies = [ "gix-trace", "gix-utils", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2140,7 +2140,7 @@ dependencies = [ "gix-features", "gix-path", "gix-utils", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2164,7 +2164,7 @@ dependencies = [ "faster-hex", "gix-features", "sha1-checked", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2174,7 +2174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c35300b54896153e55d53f4180460931ccd69b7e8d2f6b9d6401122cdedc4f07" dependencies = [ "gix-hash", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "parking_lot", ] @@ -2210,13 +2210,13 @@ dependencies = [ "gix-traverse", "gix-utils", "gix-validate", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "itoa", "libc", "memmap2", "rustix 1.0.8", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2227,7 +2227,7 @@ checksum = "b9fa71da90365668a621e184eb5b979904471af1b3b09b943a84bc50e8ad42ed" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2239,7 +2239,7 @@ dependencies = [ "bstr", "gix-actor", "gix-date", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2255,14 +2255,14 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "gix-object" -version = "0.50.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49664e3e212bc34f7060f5738ce7022247e4afd959b68a4f666b1fd29c00b23c" +checksum = "aff2047f96d57bcc721426e11ec0f9efeb432d5e6ef5f1aa84cfc55198971dca" dependencies = [ "bstr", "gix-actor", @@ -2275,7 +2275,7 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "winnow 0.7.12", ] @@ -2297,7 +2297,7 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2317,7 +2317,7 @@ dependencies = [ "memmap2", "parking_lot", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", "uluru", ] @@ -2330,7 +2330,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2342,21 +2342,21 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "gix-path" -version = "0.10.19" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6279d323d925ad4790602105ae27df4b915e7a7d81e4cdba2603121c03ad111" +checksum = "06d37034a4c67bbdda76f7bcd037b2f7bc0fba0c09a6662b19697a5716e7b2fd" dependencies = [ "bstr", "gix-trace", "gix-validate", "home", "once_cell", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2371,7 +2371,7 @@ dependencies = [ "gix-config-value", "gix-glob", "gix-path", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2384,7 +2384,7 @@ dependencies = [ "gix-config-value", "parking_lot", "rustix 1.0.8", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2409,7 +2409,7 @@ dependencies = [ "gix-transport", "gix-utils", "maybe-async", - "thiserror 2.0.12", + "thiserror 2.0.14", "winnow 0.7.12", ] @@ -2421,7 +2421,7 @@ checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" dependencies = [ "bstr", "gix-utils", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2441,7 +2441,7 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror 2.0.12", + "thiserror 2.0.14", "winnow 0.7.12", ] @@ -2456,7 +2456,7 @@ dependencies = [ "gix-revision", "gix-validate", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2474,7 +2474,7 @@ dependencies = [ "gix-object", "gix-revwalk", "gix-trace", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2489,7 +2489,7 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2513,7 +2513,7 @@ dependencies = [ "bstr", "gix-hash", "gix-lock", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2536,7 +2536,7 @@ dependencies = [ "gix-pathspec", "gix-worktree", "portable-atomic", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2551,7 +2551,7 @@ dependencies = [ "gix-pathspec", "gix-refspec", "gix-url", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2592,7 +2592,7 @@ dependencies = [ "gix-sec", "gix-url", "reqwest", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2609,7 +2609,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2622,7 +2622,7 @@ dependencies = [ "gix-features", "gix-path", "percent-encoding", - "thiserror 2.0.12", + "thiserror 2.0.14", "url", ] @@ -2644,7 +2644,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" dependencies = [ "bstr", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2683,7 +2683,7 @@ dependencies = [ "gix-path", "gix-worktree", "io-close", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -2701,14 +2701,14 @@ dependencies = [ "gix-path", "gix-traverse", "parking_lot", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" @@ -2736,9 +2736,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -2776,9 +2776,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -3219,7 +3219,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17d34b7d42178945f775e84bc4c36dde7c1c6cdfea656d3354d009056f2bb3d2" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -3248,9 +3248,9 @@ dependencies = [ [[package]] name = "indenter" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" @@ -3270,7 +3270,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "serde", ] @@ -3553,15 +3553,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libbz2-rs-sys" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libm" @@ -3571,9 +3571,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags", "libc", @@ -3609,9 +3609,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" [[package]] name = "lock_api" @@ -3709,6 +3709,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "lzma-rust2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26175dd096dfaab9f4fbf577a668842ebc48374d4d06b154bffb49918e242261" + [[package]] name = "lzma-sys" version = "0.1.20" @@ -3765,6 +3771,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "miette" version = "7.6.0" @@ -3917,7 +3932,7 @@ dependencies = [ "tera", "terminal_size", "test-log", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "toml 0.8.23", "toml_edit", @@ -3938,9 +3953,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de25fc513588ac1273aa8c6dc0fffee6d32c12f38dc75f5cdc74547121a107ef" +checksum = "ab2fea92b2adabd51808311b101551d6e3f8602b65e9fae51f7ad5b3d500f4cd" dependencies = [ "bstr", "either", @@ -3958,9 +3973,9 @@ dependencies = [ [[package]] name = "mlua-sys" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcdf7c9e260ca82aaa32ac11148941952b856bb8c69aa5a9e65962f21fcb8637" +checksum = "3d4dc9cfc5a7698899802e97480617d9726f7da78c910db989d4d0fd4991d900" dependencies = [ "cc", "cfg-if", @@ -4380,7 +4395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 2.0.12", + "thiserror 2.0.14", "ucd-trie", ] @@ -4424,7 +4439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" dependencies = [ "fixedbitset", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "indexmap 2.10.0", "serde", ] @@ -4617,9 +4632,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -4658,7 +4673,7 @@ dependencies = [ "rustc-hash 2.1.1", "rustls", "socket2 0.5.10", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tracing", "web-time", @@ -4679,7 +4694,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.14", "tinyvec", "tracing", "web-time", @@ -4775,22 +4790,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.15" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -4935,7 +4950,7 @@ dependencies = [ "schemars 1.0.4", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "tokio-util", "tracing", @@ -4947,7 +4962,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aebc912b8fa7d54999adc4e45601d1d95fe458f97eb0a1277eddcd6382cf4b1" dependencies = [ - "darling 0.21.0", + "darling 0.21.1", "proc-macro2", "quote", "serde_json", @@ -5008,19 +5023,20 @@ dependencies = [ "serde_yaml", "sha2", "strum", - "thiserror 2.0.12", + "thiserror 2.0.14", "walkdir", "zeroize", ] [[package]] name = "rowan" -version = "0.15.16" +version = "0.15.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a542b0253fa46e632d27a1dc5cf7b930de4df8659dc6e720b647fc72147ae3d" +checksum = "d4f1e4a001f863f41ea8d0e6a0c34b356d5b733db50dadab3efef640bafb779b" dependencies = [ "countme", "hashbrown 0.14.5", + "memoffset", "rustc-hash 1.1.0", "text-size", ] @@ -5061,9 +5077,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -5114,9 +5130,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", "ring", @@ -5135,7 +5151,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.2.0", + "security-framework 3.3.0", ] [[package]] @@ -5161,9 +5177,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -5298,9 +5314,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" dependencies = [ "bitflags", "core-foundation 0.10.1", @@ -5427,9 +5443,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "indexmap 2.10.0", "itoa", @@ -5554,6 +5570,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "sevenz-rust2" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98644326f9145490e4c194dd775a9a2ed7e84f8254415eb709a7924f52fcd7a1" +dependencies = [ + "byteorder", + "crc32fast", + "js-sys", + "lzma-rust2", + "wasm-bindgen", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5608,9 +5637,9 @@ dependencies = [ [[package]] name = "shared_thread" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a6f98357c6bb0ebace19b22220e5543801d9de90ffe77f8abb27c056bac064" +checksum = "52b86057fcb5423f5018e331ac04623e32d6b5ce85e33300f92c79a1973928b0" [[package]] name = "shell-escape" @@ -5653,9 +5682,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -5690,9 +5719,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slug" @@ -5962,12 +5991,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ "rustix 1.0.8", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6019,11 +6048,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.14", ] [[package]] @@ -6039,9 +6068,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", @@ -6115,9 +6144,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -6128,9 +6157,9 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2 0.5.10", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6166,9 +6195,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -6372,9 +6401,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ubi" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38280fcdc420d9a0e910c9f8e83566b5d3ef3d53a1020013847ce5e5e1b37bf4" +checksum = "0ba01598cd03e5cf73c25ffd69cb72469d9a4e74b9339c17fa3e95964511c999" dependencies = [ "anyhow", "async-trait", @@ -6391,9 +6420,10 @@ dependencies = [ "serde", "serde_json", "serial_test", + "sevenz-rust2", "strum", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.14", "url", "walkdir", "which 8.0.0", @@ -6595,7 +6625,7 @@ dependencies = [ "shell-words", "strum", "tera", - "thiserror 2.0.12", + "thiserror 2.0.14", "versions 7.0.0", "xx", ] @@ -6668,7 +6698,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "url", "xx", @@ -7024,7 +7054,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -7060,10 +7090,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -7289,7 +7320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0b0d18c02f29d5a0a5e543a90c0190a17370d4f9820b15ee347992d212c22db" dependencies = [ "bzip2 0.5.2", - "duct 1.0.0", + "duct 1.1.0", "filetime", "flate2", "globwalk", @@ -7300,7 +7331,7 @@ dependencies = [ "reqwest", "sha2", "tar", - "thiserror 2.0.12", + "thiserror 2.0.14", "tokio", "xz2", "zip 3.0.0", @@ -7419,9 +7450,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -7452,7 +7483,7 @@ dependencies = [ "flate2", "indexmap 2.10.0", "memchr", - "thiserror 2.0.12", + "thiserror 2.0.14", "time", "zopfli", ] @@ -7492,7 +7523,7 @@ checksum = "dba6063ff82cdbd9a765add16d369abe81e520f836054e997c2db217ceca40c0" dependencies = [ "base64 0.22.1", "ed25519-dalek", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] diff --git a/man/man1/mise.1 b/man/man1/mise.1 index a93e2904b3..7ff3abb84c 100644 --- a/man/man1/mise.1 +++ b/man/man1/mise.1 @@ -9,19 +9,19 @@ mise \- The front\-end to your dev env mise manages dev tools, env vars, and runs tasks. https://github.com/jdx/mise .SH OPTIONS .TP -\fB\-C\fR, \fB\-\-cd\fR=\fIDIR\fR +\fB\-C\fR, \fB\-\-cd\fR \fI\fR Change directory before running command .TP -\fB\-E\fR, \fB\-\-env\fR=\fIENV\fR +\fB\-E\fR, \fB\-\-env\fR \fI\fR Set the environment for loading `mise..toml` .TP -\fB\-j\fR, \fB\-\-jobs\fR=\fIJOBS\fR +\fB\-j\fR, \fB\-\-jobs\fR \fI\fR How many jobs to run in parallel [default: 8] .RS May also be specified with the \fBMISE_JOBS\fR environment variable. .RE .TP -\fB\-\-output\fR=\fIOUTPUT\fR +\fB\-\-output\fR \fI\fR .TP \fB\-\-raw\fR From cf1b005da53d70eeecaade756920f5b46333ff06 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 Aug 2025 06:34:48 -0500 Subject: [PATCH 4/5] docs(tools): document per-tool postinstall option in [tools] (#5993) --- docs/configuration.md | 13 ++++++++++++- docs/dev-tools/index.md | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 05cc5ee4f9..cca19e959c 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -137,7 +137,18 @@ You can also have environment specific config files like `.mise.production.toml` ### `[tools]` - Dev tools -See [Tools](/dev-tools/). +See [Tools](/dev-tools/). In addition to specifying versions, each tool entry can include options such as: + +- `os`: Restrict installation to certain operating systems +- `install_env`: Environment vars used during install +- `postinstall`: Command to run after installation completes for that specific tool + +Examples: + +```toml +[tools] +node = { version = "22", postinstall = "corepack enable" } +``` ### `[env]` - Arbitrary Environment Variables diff --git a/docs/dev-tools/index.md b/docs/dev-tools/index.md index 2d9cb04b37..7769d56e8f 100644 --- a/docs/dev-tools/index.md +++ b/docs/dev-tools/index.md @@ -142,6 +142,21 @@ port = 6379 Internally, nested options are flattened to dot notation (e.g., `platforms.macos-x64.url`, `database.host`, `cache.redis.port`) for backend access. +### Tool postinstall commands + +Run a command immediately after a tool finishes installing by adding a `postinstall` field to that tool's configuration. This is separate from `[hooks].postinstall` and applies only to when a specific tool is installed. + +```toml +[tools] +node = { version = "22", postinstall = "corepack enable" } +``` + +Behavior: +- The command runs once the install completes successfully for that tool/version. +- The tool's bin path is on PATH during the command, so you can invoke the installed tool directly. +- Environment variables include `MISE_TOOL_INSTALL_PATH` pointing to the tool's install directory. +- If the install fails, the `postinstall` command is not run. + ## OS-Specific Tools You can restrict tools to specific operating systems using the `os` field: From 3ed3964c9bea0099e6572d73b1bee46a600dbe89 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 Aug 2025 07:04:11 -0500 Subject: [PATCH 5/5] fix(timeout): only add fetch timeout hint on actual timeouts; refactor http GET/HEAD to remove duplication --- src/http.rs | 228 ++++++++++++++-------------------------- src/plugins/core/mod.rs | 19 +++- src/timeout.rs | 29 +++-- 3 files changed, 115 insertions(+), 161 deletions(-) diff --git a/src/http.rs b/src/http.rs index bf589e53ed..ed65a95407 100644 --- a/src/http.rs +++ b/src/http.rs @@ -4,7 +4,7 @@ use std::time::Duration; use eyre::{Report, Result, bail, ensure}; use reqwest::header::{HeaderMap, HeaderValue}; -use reqwest::{ClientBuilder, IntoUrl, Response}; +use reqwest::{ClientBuilder, IntoUrl, Method, Response}; use std::sync::LazyLock as Lazy; use url::Url; @@ -83,80 +83,10 @@ impl Client { headers: &HeaderMap, ) -> Result { ensure!(!*env::OFFLINE, "offline mode is enabled"); - let mut url = url.into_url().unwrap(); - let do_get = |url: Url, - client: reqwest::Client, - headers: HeaderMap, - timeout: Duration, - kind: ClientKind| async move { - debug!("GET {}", &url); - let mut req = client.get(url.clone()); - req = req.headers(headers.clone()); - let resp = match req.send().await { - Ok(resp) => resp, - Err(err) => { - if err.is_timeout() { - let (setting, env_var) = match kind { - ClientKind::Http => ("http_timeout", "MISE_HTTP_TIMEOUT"), - ClientKind::Fetch => ( - "fetch_remote_versions_timeout", - "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT", - ), - ClientKind::VersionCheck => ("version_check_timeout", ""), - }; - let hint = if env_var.is_empty() { - format!( - "HTTP timed out after {} for {}.", - format_duration(timeout), - url - ) - } else { - format!( - "HTTP timed out after {} for {} (change with `{}` or env `{}`).", - format_duration(timeout), - url, - setting, - env_var - ) - }; - bail!(hint); - } - return Err(err.into()); - } - }; - if *env::MISE_LOG_HTTP { - eprintln!("GET {url} {}", resp.status()); - } - debug!("GET {url} {}", resp.status()); - display_github_rate_limit(&resp); - resp.error_for_status_ref()?; - Ok(resp) - }; - - let resp = match do_get( - url.clone(), - self.reqwest.clone(), - headers.clone(), - self.timeout, - self.kind, - ) - .await - { - Ok(resp) => resp, - Err(_) if url.scheme() == "http" => { - url.set_scheme("https").unwrap(); - do_get( - url, - self.reqwest.clone(), - headers.clone(), - self.timeout, - self.kind, - ) - .await? - } - Err(err) => return Err(err), - }; - + let url = url.into_url().unwrap(); + let resp = self + .send_with_https_fallback(Method::GET, url, headers, "GET") + .await?; resp.error_for_status_ref()?; Ok(resp) } @@ -173,79 +103,10 @@ impl Client { headers: &HeaderMap, ) -> Result { ensure!(!*env::OFFLINE, "offline mode is enabled"); - let mut url = url.into_url().unwrap(); - let do_head = |url: Url, - client: reqwest::Client, - headers: HeaderMap, - timeout: Duration, - kind: ClientKind| async move { - debug!("HEAD {}", &url); - let mut req = client.head(url.clone()); - req = req.headers(headers.clone()); - let resp = match req.send().await { - Ok(resp) => resp, - Err(err) => { - if err.is_timeout() { - let (setting, env_var) = match kind { - ClientKind::Http => ("http_timeout", "MISE_HTTP_TIMEOUT"), - ClientKind::Fetch => ( - "fetch_remote_versions_timeout", - "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT", - ), - ClientKind::VersionCheck => ("version_check_timeout", ""), - }; - let hint = if env_var.is_empty() { - format!( - "HTTP timed out after {} for {}.", - format_duration(timeout), - url - ) - } else { - format!( - "HTTP timed out after {} for {} (change with `{}` or env `{}`).", - format_duration(timeout), - url, - setting, - env_var - ) - }; - bail!(hint); - } - return Err(err.into()); - } - }; - if *env::MISE_LOG_HTTP { - eprintln!("HEAD {url} {}", resp.status()); - } - debug!("HEAD {url} {}", resp.status()); - display_github_rate_limit(&resp); - resp.error_for_status_ref()?; - Ok(resp) - }; - let resp = match do_head( - url.clone(), - self.reqwest.clone(), - headers.clone(), - self.timeout, - self.kind, - ) - .await - { - Ok(resp) => resp, - Err(_) if url.scheme() == "http" => { - url.set_scheme("https").unwrap(); - do_head( - url, - self.reqwest.clone(), - headers.clone(), - self.timeout, - self.kind, - ) - .await? - } - Err(err) => return Err(err), - }; - + let url = url.into_url().unwrap(); + let resp = self + .send_with_https_fallback(Method::HEAD, url, headers, "HEAD") + .await?; resp.error_for_status_ref()?; Ok(resp) } @@ -358,6 +219,77 @@ impl Client { file.persist(path)?; Ok(()) } + + async fn send_with_https_fallback( + &self, + method: Method, + mut url: Url, + headers: &HeaderMap, + verb_label: &str, + ) -> Result { + match self + .send_once(method.clone(), url.clone(), headers, verb_label) + .await + { + Ok(resp) => Ok(resp), + Err(_) if url.scheme() == "http" => { + url.set_scheme("https").unwrap(); + self.send_once(method, url, headers, verb_label).await + } + Err(err) => Err(err), + } + } + + async fn send_once( + &self, + method: Method, + url: Url, + headers: &HeaderMap, + verb_label: &str, + ) -> Result { + debug!("{} {}", verb_label, &url); + let mut req = self.reqwest.request(method, url.clone()); + req = req.headers(headers.clone()); + let resp = match req.send().await { + Ok(resp) => resp, + Err(err) => { + if err.is_timeout() { + let (setting, env_var) = match self.kind { + ClientKind::Http => ("http_timeout", "MISE_HTTP_TIMEOUT"), + ClientKind::Fetch => ( + "fetch_remote_versions_timeout", + "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT", + ), + ClientKind::VersionCheck => ("version_check_timeout", ""), + }; + let hint = if env_var.is_empty() { + format!( + "HTTP timed out after {} for {}.", + format_duration(self.timeout), + url + ) + } else { + format!( + "HTTP timed out after {} for {} (change with `{}` or env `{}`).", + format_duration(self.timeout), + url, + setting, + env_var + ) + }; + bail!(hint); + } + return Err(err.into()); + } + }; + if *env::MISE_LOG_HTTP { + eprintln!("{} {url} {}", verb_label, resp.status()); + } + debug!("{} {url} {}", verb_label, resp.status()); + display_github_rate_limit(&resp); + resp.error_for_status_ref()?; + Ok(resp) + } } pub fn error_code(e: &Report) -> Option { diff --git a/src/plugins/core/mod.rs b/src/plugins/core/mod.rs index 779198fd43..1711b8e670 100644 --- a/src/plugins/core/mod.rs +++ b/src/plugins/core/mod.rs @@ -9,7 +9,7 @@ use crate::cli::args::BackendArg; use crate::config::Settings; use crate::env; use crate::env::PATH_KEY; -use crate::timeout::run_with_timeout; +use crate::timeout::{TimeoutError, run_with_timeout}; use crate::toolset::ToolVersion; mod bun; @@ -59,10 +59,19 @@ where T: Send, { let timeout = Settings::get().fetch_remote_versions_timeout(); - run_with_timeout(f, timeout).context(format!( - "timed out after {} (change with `fetch_remote_versions_timeout` or env `MISE_FETCH_REMOTE_VERSIONS_TIMEOUT`)", - crate::ui::time::format_duration(timeout) - )) + match run_with_timeout(f, timeout) { + Ok(v) => Ok(v), + Err(err) => { + // Only add a hint when the error was actually caused by a timeout + if err.downcast_ref::().is_some() { + Err(err).context( + "change with `fetch_remote_versions_timeout` or env `MISE_FETCH_REMOTE_VERSIONS_TIMEOUT`", + ) + } else { + Err(err) + } + } + } } pub fn new_backend_arg(tool_name: &str) -> BackendArg { diff --git a/src/timeout.rs b/src/timeout.rs index 3e2103c667..6678f77a2e 100644 --- a/src/timeout.rs +++ b/src/timeout.rs @@ -3,7 +3,21 @@ use std::thread; use std::time::Duration; use crate::ui::time::format_duration; -use color_eyre::eyre::{Context, Result}; +use color_eyre::eyre::{Report, Result}; +use std::fmt::{Display, Formatter}; + +#[derive(Debug, Clone, Copy)] +pub struct TimeoutError { + pub duration: Duration, +} + +impl Display for TimeoutError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "timed out after {}", format_duration(self.duration)) + } +} + +impl std::error::Error for TimeoutError {} pub fn run_with_timeout(f: F, timeout: Duration) -> Result where @@ -17,9 +31,11 @@ where // If sending fails, the timeout has already been reached. let _ = tx.send(result); }); - rx.recv_timeout(timeout) - .context(format!("timed out after {}", format_duration(timeout))) - })? + let recv: Result = rx + .recv_timeout(timeout) + .map_err(|_| Report::from(TimeoutError { duration: timeout }))?; + recv + }) } pub async fn run_with_timeout_async(f: F, timeout: Duration) -> Result @@ -31,9 +47,6 @@ where match tokio::time::timeout(timeout, f()).await { Ok(Ok(output)) => Ok(output), Ok(Err(e)) => Err(e), - Err(_) => Err(eyre::eyre!(format!( - "timed out after {}", - format_duration(timeout) - ))), + Err(_) => Err(TimeoutError { duration: timeout }.into()), } }