diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:06:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:06:57 +0900 |
| commit | 28c8c8dfb0dff4dc87d585e06faaf96a4c2eefde (patch) | |
| tree | 80e2352aa659709c91b62697b07a0be65aff1774 /crates/mozart/src | |
| parent | 48dffd282efd8fa847b3636753d7c0d856672f36 (diff) | |
| download | php-mozart-28c8c8dfb0dff4dc87d585e06faaf96a4c2eefde.tar.gz php-mozart-28c8c8dfb0dff4dc87d585e06faaf96a4c2eefde.tar.zst php-mozart-28c8c8dfb0dff4dc87d585e06faaf96a4c2eefde.zip | |
fix(config): add missing keys, implement --absolute, fix output format
Add 18 missing config keys to config_value_type() including cache-read-only
(was in defaults but unmanageable), audit.* dotted keys, and bool-or-enum
keys like store-auths and bump-after-update. Implement --absolute flag to
resolve *-dir values to absolute paths. Fix render_value() to JSON-encode
arrays and use lowercase "null", matching Composer output.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src')
| -rw-r--r-- | crates/mozart/src/commands/config.rs | 47 | ||||
| -rw-r--r-- | crates/mozart/src/commands/config_helpers.rs | 6 |
2 files changed, 48 insertions, 5 deletions
diff --git a/crates/mozart/src/commands/config.rs b/crates/mozart/src/commands/config.rs index c46b7a4..5105fd6 100644 --- a/crates/mozart/src/commands/config.rs +++ b/crates/mozart/src/commands/config.rs @@ -221,6 +221,8 @@ fn config_value_type(key: &str) -> Option<ConfigValueType> { "cache-vcs-dir" => Some(ConfigValueType::Str), "cache-files-ttl" => Some(ConfigValueType::Integer), "cache-files-maxsize" => Some(ConfigValueType::Str), + "cache-read-only" => Some(ConfigValueType::Bool), + "cache-ttl" => Some(ConfigValueType::Integer), "bin-compat" => Some(ConfigValueType::Enum(&["auto", "full", "proxy", "symlink"])), "discard-changes" => Some(ConfigValueType::BoolOrEnum(&["stash"])), "autoloader-suffix" => Some(ConfigValueType::Str), @@ -237,6 +239,27 @@ fn config_value_type(key: &str) -> Option<ConfigValueType> { "github-protocols" => Some(ConfigValueType::EnumArray(&["git", "https", "ssh"])), "github-domains" => Some(ConfigValueType::StringArray), "gitlab-domains" => Some(ConfigValueType::StringArray), + "use-github-api" => Some(ConfigValueType::Bool), + "update-with-minimal-changes" => Some(ConfigValueType::Bool), + "disable-tls" => Some(ConfigValueType::Bool), + "github-expose-hostname" => Some(ConfigValueType::Bool), + "data-dir" => Some(ConfigValueType::Str), + "cafile" => Some(ConfigValueType::Str), + "capath" => Some(ConfigValueType::Str), + "gitlab-protocol" => Some(ConfigValueType::Enum(&["git", "http", "https"])), + // store-auths accepts true/false/prompt + "store-auths" => Some(ConfigValueType::BoolOrEnum(&["prompt"])), + // bump-after-update accepts true/false/dev/no-dev + "bump-after-update" => Some(ConfigValueType::BoolOrEnum(&["dev", "no-dev"])), + // use-parent-dir accepts true/false/prompt + "use-parent-dir" => Some(ConfigValueType::BoolOrEnum(&["prompt"])), + "audit.abandoned" => Some(ConfigValueType::Enum(&["ignore", "report", "fail"])), + "audit.ignore-unreachable" => Some(ConfigValueType::Bool), + "audit.block-insecure" => Some(ConfigValueType::Bool), + "audit.block-abandoned" => Some(ConfigValueType::Bool), + "audit.ignore-severity" => Some(ConfigValueType::EnumArray(&[ + "low", "medium", "high", "critical", + ])), _ => None, } } @@ -889,6 +912,26 @@ fn execute_read( config.resolve_references(); + // If --absolute is requested, resolve *-dir values to absolute paths. + if args.absolute { + let wd = working_dir(cli)?; + let keys: Vec<String> = config.values.keys().cloned().collect(); + for key in keys { + if key.ends_with("-dir") + && let Some(serde_json::Value::String(s)) = config.values.get(&key).cloned() + { + let p = std::path::Path::new(&s); + if p.is_relative() { + let abs = wd.join(p); + config.values.insert( + key, + serde_json::Value::String(abs.to_string_lossy().into_owned()), + ); + } + } + } + } + if args.list { for (key, value) in &config.values { println!("[{}] {}", key, render_value(value)); @@ -1153,13 +1196,13 @@ mod tests { #[test] fn test_render_value_null() { - assert_eq!(render_value(&serde_json::Value::Null), "NULL"); + assert_eq!(render_value(&serde_json::Value::Null), "null"); } #[test] fn test_render_value_array() { let v = serde_json::json!(["https", "ssh", "git"]); - assert_eq!(render_value(&v), "https, ssh, git"); + assert_eq!(render_value(&v), r#"["https","ssh","git"]"#); } #[test] diff --git a/crates/mozart/src/commands/config_helpers.rs b/crates/mozart/src/commands/config_helpers.rs index 953f18b..31792f4 100644 --- a/crates/mozart/src/commands/config_helpers.rs +++ b/crates/mozart/src/commands/config_helpers.rs @@ -140,12 +140,12 @@ pub(crate) fn insert_repository( /// single-line display (matching Composer's behaviour). pub(crate) fn render_value(v: &serde_json::Value) -> String { match v { - serde_json::Value::Null => "NULL".to_string(), + serde_json::Value::Null => "null".to_string(), serde_json::Value::Bool(b) => if *b { "true" } else { "false" }.to_string(), serde_json::Value::Number(n) => n.to_string(), serde_json::Value::String(s) => s.clone(), - serde_json::Value::Array(arr) => { - arr.iter().map(render_value).collect::<Vec<_>>().join(", ") + serde_json::Value::Array(_) => { + serde_json::to_string(v).unwrap_or_else(|_| "[]".to_string()) } serde_json::Value::Object(obj) => { if obj.is_empty() { |
