From 29b6a4895236f45bb91617ba690ac35c334167ac Mon Sep 17 00:00:00 2001 From: mise-en-dev Date: Mon, 2 Feb 2026 17:20:29 -0300 Subject: [PATCH] fix: improve ToolOptions parsing to support comma separated values --- src/toolset/tool_version_options.rs | 64 +++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/src/toolset/tool_version_options.rs b/src/toolset/tool_version_options.rs index 616c1e12c0..cdc49d3161 100644 --- a/src/toolset/tool_version_options.rs +++ b/src/toolset/tool_version_options.rs @@ -162,12 +162,22 @@ impl ToolVersionOptions { pub fn parse_tool_options(s: &str) -> ToolVersionOptions { let mut tvo = ToolVersionOptions::default(); + let mut current_key: Option = None; for opt in s.split(',') { - let (k, v) = opt.split_once('=').unwrap_or((opt, "")); - if k.is_empty() { - continue; + if let Some((k, v)) = opt.split_once('=') { + if !k.trim().is_empty() { + tvo.opts.insert(k.trim().to_string(), v.to_string()); + current_key = Some(k.trim().to_string()); + } + } else if !opt.is_empty() { + // No '=' found, append to the previous value or create a new key + if let Some(key) = ¤t_key + && let Some(existing_value) = tvo.opts.get_mut(key) + { + existing_value.push(','); + existing_value.push_str(opt); + } } - tvo.opts.insert(k.to_string(), v.to_string()); } tvo } @@ -209,6 +219,52 @@ mod tests { ..Default::default() }, ); + t( + "profile=minimal,components=rust-src,llvm-tools,targets=wasm32-unknown-unknown,thumbv2-none-eabi", + ToolVersionOptions { + opts: [ + ("profile".to_string(), "minimal".to_string()), + ("components".to_string(), "rust-src,llvm-tools".to_string()), + ( + "targets".to_string(), + "wasm32-unknown-unknown,thumbv2-none-eabi".to_string(), + ), + ] + .iter() + .cloned() + .collect(), + ..Default::default() + }, + ); + // test trimming of key whitespace + t( + " exe = rg , match = musl ", + ToolVersionOptions { + opts: [ + ("exe".to_string(), " rg ".to_string()), + ("match".to_string(), " musl ".to_string()), + ] + .iter() + .cloned() + .collect(), + ..Default::default() + }, + ); + // test value-less keys + t( + "foo=,bar=baz,baz=", + ToolVersionOptions { + opts: [ + ("foo".to_string(), "".to_string()), + ("bar".to_string(), "baz".to_string()), + ("baz".to_string(), "".to_string()), + ] + .iter() + .cloned() + .collect(), + ..Default::default() + }, + ); } #[test]