aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-23 01:06:57 +0900
committernsfisis <nsfisis@gmail.com>2026-02-23 01:06:57 +0900
commit28c8c8dfb0dff4dc87d585e06faaf96a4c2eefde (patch)
tree80e2352aa659709c91b62697b07a0be65aff1774 /crates/mozart/src
parent48dffd282efd8fa847b3636753d7c0d856672f36 (diff)
downloadphp-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.rs47
-rw-r--r--crates/mozart/src/commands/config_helpers.rs6
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() {