aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/base_config.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-08 23:03:11 +0900
committernsfisis <nsfisis@gmail.com>2026-05-08 23:03:11 +0900
commiteeb845f2f8629e3ccfb8ee1a1ec0602c0f186427 (patch)
tree5076422cf70ac92e1bc1e0424f0373100be5fd4c /crates/mozart/src/commands/base_config.rs
parent392cf71170bf2550aa657158e9efd2b890381a94 (diff)
downloadphp-mozart-eeb845f2f8629e3ccfb8ee1a1ec0602c0f186427.tar.gz
php-mozart-eeb845f2f8629e3ccfb8ee1a1ec0602c0f186427.tar.zst
php-mozart-eeb845f2f8629e3ccfb8ee1a1ec0602c0f186427.zip
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] <disabled> 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 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands/base_config.rs')
-rw-r--r--crates/mozart/src/commands/base_config.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/crates/mozart/src/commands/base_config.rs b/crates/mozart/src/commands/base_config.rs
new file mode 100644
index 0000000..be663d5
--- /dev/null
+++ b/crates/mozart/src/commands/base_config.rs
@@ -0,0 +1,35 @@
+use std::path::PathBuf;
+
+use mozart_core::config_source::JsonConfigSource;
+
+use super::config_helpers::composer_home;
+
+/// Mirrors Composer's `BaseConfigCommand`: resolves the target config file path
+/// and enforces the `--file` ↔ `--global` mutual exclusivity.
+pub(crate) struct BaseConfigContext {
+ pub config_source: JsonConfigSource,
+}
+
+impl BaseConfigContext {
+ pub fn initialize(
+ global: bool,
+ file: Option<&str>,
+ cli: &super::Cli,
+ ) -> anyhow::Result<Self> {
+ if global && file.is_some() {
+ anyhow::bail!("--file and --global can not be combined");
+ }
+
+ let path: PathBuf = if global {
+ composer_home().join("config.json")
+ } else if let Some(f) = file {
+ PathBuf::from(f)
+ } else {
+ cli.working_dir()?.join("composer.json")
+ };
+
+ Ok(Self {
+ config_source: JsonConfigSource::new(path, false),
+ })
+ }
+}