From eeb845f2f8629e3ccfb8ee1a1ec0602c0f186427 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 8 May 2026 23:03:11 +0900 Subject: fix(repository): align with Composer's RepositoryCommand pipeline Introduce JsonConfigSource in mozart-core mirroring Composer's JsonConfigSource fallback logic (add/insert/set-url/remove repository), and BaseConfigContext mirroring BaseConfigCommand's initialize(). Key behaviour fixes: - list: synthesise [packagist.org] only when no composer-type repo with a packagist.org host is present (was: always show enabled default) - disable: idempotent via add_repository(false) matching Composer's branch; now requires a name (no silent default to packagist.org) - enable: calls remove_repository only, no extra empty-array cleanup - set-url: preserves assoc-keyed format instead of converting to list - get-url: assoc fast-path + unquoted error message matching Composer - add: use regex pre-check (starts_with '{') instead of trial-parse - error messages reworded to match Composer verbatim (mozart brand kept) Co-Authored-By: Claude Sonnet 4.6 --- crates/mozart/src/commands/config_helpers.rs | 55 ---------------------------- 1 file changed, 55 deletions(-) (limited to 'crates/mozart/src/commands/config_helpers.rs') diff --git a/crates/mozart/src/commands/config_helpers.rs b/crates/mozart/src/commands/config_helpers.rs index c5cd187..f0aacbb 100644 --- a/crates/mozart/src/commands/config_helpers.rs +++ b/crates/mozart/src/commands/config_helpers.rs @@ -112,28 +112,6 @@ pub(crate) fn normalize_repositories(value: &serde_json::Value) -> Vec Option { - repos.iter().position(|entry| { - entry - .get("name") - .and_then(|n| n.as_str()) - .map(|n| n == name) - .unwrap_or(false) - }) -} - /// Add a repository entry to the `repositories` array in json. /// If `append` is true, push to end; otherwise insert at beginning. /// Removes any existing entry with the same name first. @@ -174,39 +152,6 @@ pub(crate) fn remove_repository(json: &mut serde_json::Value, name: &str) { } } -/// Insert a repository entry before or after a named repository. -/// Returns an error if the target repository is not found. -pub(crate) fn insert_repository( - json: &mut serde_json::Value, - name: &str, - config: serde_json::Value, - target: &str, - before: bool, -) -> anyhow::Result<()> { - if !json["repositories"].is_array() { - json["repositories"] = serde_json::json!([]); - } - - remove_repository(json, name); - - let repos = json["repositories"].as_array_mut().unwrap(); - - let pos = repos - .iter() - .position(|entry| { - entry.get("name").and_then(|n| n.as_str()) == Some(target) - || entry - .as_object() - .map(|obj| obj.contains_key(target)) - .unwrap_or(false) - }) - .ok_or_else(|| anyhow!("Repository \"{target}\" not found"))?; - - let insert_pos = if before { pos } else { pos + 1 }; - repos.insert(insert_pos, config); - Ok(()) -} - /// Render a `serde_json::Value` as a human-readable string suitable for /// single-line display (matching Composer's behaviour). pub(crate) fn render_value(v: &serde_json::Value) -> String { -- cgit v1.3.1