From 36128fe15464f1bddce0d2d14727dc054e43cea4 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 May 2026 13:25:40 -0500 Subject: [PATCH 1/3] fix(settings): distinguish unset known settings from unknown ones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `mise settings get ` walked the serialized current settings to find a value, but Option fields that are None are skipped by TOML serialization. That made unset-but-known settings indistinguishable from typos — both returned `Unknown setting`. Check SETTINGS_META when the walk fails: if the key is known but unset, emit `Setting [] is not set`; otherwise keep `Unknown setting`. Fixes #9817 Co-Authored-By: Claude Opus 4.7 (1M context) --- e2e/cli/test_settings_set | 2 ++ src/cli/settings/get.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/e2e/cli/test_settings_set b/e2e/cli/test_settings_set index d7f8b64099..dafafbb705 100644 --- a/e2e/cli/test_settings_set +++ b/e2e/cli/test_settings_set @@ -13,6 +13,8 @@ assert_contains "mise settings -T" "all_compile = true" mise settings unset all_compile assert "mise settings get all_compile" "false" assert_fail "mise settings get abcdefg" "mise ERROR Unknown setting: abcdefg" +assert_fail "mise settings get python.compile" "mise ERROR Setting [python.compile] is not set" +assert_fail "mise settings get cargo.registry_name" "mise ERROR Setting [cargo.registry_name] is not set" assert "mise settings all_compile" "false" assert "mise settings all_compile=1" assert "mise settings all_compile" "true" diff --git a/src/cli/settings/get.rs b/src/cli/settings/get.rs index b8603e85fb..f000ee2c6f 100644 --- a/src/cli/settings/get.rs +++ b/src/cli/settings/get.rs @@ -1,5 +1,6 @@ use crate::config; use crate::config::Settings; +use crate::config::settings::SETTINGS_META; use eyre::bail; /// Show a current setting @@ -37,6 +38,8 @@ impl SettingsGet { if let Some(v) = value.as_table().and_then(|t| t.get(k.0)) { key = k.1; value = v.clone() + } else if SETTINGS_META.contains_key(self.setting.as_str()) { + bail!("Setting [{}] is not set", self.setting); } else { bail!("Unknown setting: {}", self.setting); } From c393894eced0a6866f8cf368c454fa314c0b9855 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 May 2026 13:33:38 -0500 Subject: [PATCH 2/3] fix(settings): also treat namespace prefixes as known settings Addresses review feedback: `mise settings get cargo` should not say "Unknown setting" if the cargo namespace happens to have no set values. Match `SETTINGS_META` keys by exact match or namespace prefix. Also add a test for a typo-with-valid-prefix (`python.compyle`) to verify it still falls through to "Unknown setting". Co-Authored-By: Claude Opus 4.7 (1M context) --- e2e/cli/test_settings_set | 1 + src/cli/settings/get.rs | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/e2e/cli/test_settings_set b/e2e/cli/test_settings_set index dafafbb705..6b69bb8960 100644 --- a/e2e/cli/test_settings_set +++ b/e2e/cli/test_settings_set @@ -13,6 +13,7 @@ assert_contains "mise settings -T" "all_compile = true" mise settings unset all_compile assert "mise settings get all_compile" "false" assert_fail "mise settings get abcdefg" "mise ERROR Unknown setting: abcdefg" +assert_fail "mise settings get python.compyle" "mise ERROR Unknown setting: python.compyle" assert_fail "mise settings get python.compile" "mise ERROR Setting [python.compile] is not set" assert_fail "mise settings get cargo.registry_name" "mise ERROR Setting [cargo.registry_name] is not set" assert "mise settings all_compile" "false" diff --git a/src/cli/settings/get.rs b/src/cli/settings/get.rs index f000ee2c6f..7761a61807 100644 --- a/src/cli/settings/get.rs +++ b/src/cli/settings/get.rs @@ -38,7 +38,7 @@ impl SettingsGet { if let Some(v) = value.as_table().and_then(|t| t.get(k.0)) { key = k.1; value = v.clone() - } else if SETTINGS_META.contains_key(self.setting.as_str()) { + } else if is_known_setting(&self.setting) { bail!("Setting [{}] is not set", self.setting); } else { bail!("Unknown setting: {}", self.setting); @@ -53,6 +53,14 @@ impl SettingsGet { } } +fn is_known_setting(key: &str) -> bool { + if SETTINGS_META.contains_key(key) { + return true; + } + let prefix = format!("{key}."); + SETTINGS_META.keys().any(|k| k.starts_with(&prefix)) +} + static AFTER_LONG_HELP: &str = color_print::cstr!( r#"Examples: From 51862338b248372bc89ea73be007e25b75ddc7d1 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Tue, 12 May 2026 13:47:47 -0500 Subject: [PATCH 3/3] test(settings): update test_settings_unset for new error message The test asserted the old behavior where unset-but-known settings returned "Unknown setting". Update it to match the new "Setting [] is not set" message. Co-Authored-By: Claude Opus 4.7 (1M context) --- e2e/cli/test_settings_unset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/cli/test_settings_unset b/e2e/cli/test_settings_unset index 3a53c153a5..6dff414f1e 100644 --- a/e2e/cli/test_settings_unset +++ b/e2e/cli/test_settings_unset @@ -3,4 +3,4 @@ mise settings set python.compile true assert "mise settings get python.compile" "true" mise settings unset python.compile -assert_fail "mise settings get python.compile" "mise ERROR Unknown setting: python.compile" +assert_fail "mise settings get python.compile" "mise ERROR Setting [python.compile] is not set"