diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-05 15:12:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-05 15:12:57 +0900 |
| commit | 2ad57b7efb685040b24d93aab5b81ddfbd0ebefb (patch) | |
| tree | 9ee877ed2abc055cc91f2b7120a6122917fa6998 /crates/mozart/src/commands/run_script.rs | |
| parent | d4df60e70a4581aba6308f803ec7f9473d2671d8 (diff) | |
| download | php-mozart-2ad57b7efb685040b24d93aab5b81ddfbd0ebefb.tar.gz php-mozart-2ad57b7efb685040b24d93aab5b81ddfbd0ebefb.tar.zst php-mozart-2ad57b7efb685040b24d93aab5b81ddfbd0ebefb.zip | |
feat(core): add Composer struct mirroring requireComposer/tryComposer
Introduce mozart_core::composer::Composer with require()/try_load()
constructors and a config() accessor, modelled on PHP Composer's
BaseCommand::requireComposer / tryComposer. ComposerConfig and
composer_home move into mozart-core so Composer::load can resolve
placeholders consistently.
Migrate dump-autoload, archive, exec and run-script away from ad-hoc
composer.json reads. exec and run-script now fail when composer.json
is missing instead of silently falling back to "vendor/bin",
matching the upstream requireComposer contract.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands/run_script.rs')
| -rw-r--r-- | crates/mozart/src/commands/run_script.rs | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/crates/mozart/src/commands/run_script.rs b/crates/mozart/src/commands/run_script.rs index 2d88a81..e57d1c2 100644 --- a/crates/mozart/src/commands/run_script.rs +++ b/crates/mozart/src/commands/run_script.rs @@ -84,6 +84,9 @@ pub async fn execute( None => std::env::current_dir()?, }; + // RunScriptCommand uses requireComposer in Composer; composer.json must exist. + let composer = mozart_core::composer::Composer::require(&working_dir)?; + let (scripts, descriptions) = load_scripts(&working_dir)?; if args.list { @@ -114,21 +117,12 @@ pub async fn execute( let timeout = match args.timeout { Some(0) => None, Some(secs) => Some(Duration::from_secs(secs)), - None => { - let composer_json_path = working_dir.join("composer.json"); - if let Ok(content) = std::fs::read_to_string(&composer_json_path) - && let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&content) - && let Some(secs) = parsed["config"]["process-timeout"].as_u64() - { - if secs == 0 { - None - } else { - Some(Duration::from_secs(secs)) - } - } else { - Some(Duration::from_secs(300)) - } - } + None => composer + .config() + .get("process-timeout") + .and_then(|v| v.as_u64()) + .filter(|s| *s != 0) + .map(Duration::from_secs), }; let dev_mode = !args.no_dev; @@ -138,7 +132,7 @@ pub async fn execute( std::env::set_var("COMPOSER_DEV_MODE", if dev_mode { "1" } else { "0" }); } - let bin_dir = resolve_bin_dir(&working_dir); + let bin_dir = resolve_bin_dir(&working_dir, &composer); let mut event_stack: Vec<String> = Vec::new(); let exit_code = run_script( @@ -464,20 +458,14 @@ fn wait_with_timeout( // ─── Bin dir resolution ─────────────────────────────────────────────────────── -fn resolve_bin_dir(working_dir: &Path) -> PathBuf { - let composer_json_path = working_dir.join("composer.json"); - if let Ok(content) = std::fs::read_to_string(&composer_json_path) - && let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&content) - { - let vendor_dir = parsed["config"]["vendor-dir"].as_str().unwrap_or("vendor"); - let bin_dir = parsed["config"]["bin-dir"].as_str().unwrap_or_default(); - if !bin_dir.is_empty() { - let resolved = bin_dir.replace("{$vendor-dir}", vendor_dir); - return working_dir.join(resolved); - } - return working_dir.join(vendor_dir).join("bin"); - } - working_dir.join("vendor/bin") +fn resolve_bin_dir(working_dir: &Path, composer: &mozart_core::composer::Composer) -> PathBuf { + // bin-dir's `{$vendor-dir}` placeholder is already resolved by Composer::load. + let bin_dir = composer + .config() + .get("bin-dir") + .and_then(|v| v.as_str()) + .unwrap_or("vendor/bin"); + working_dir.join(bin_dir) } // ─── Classifier functions ───────────────────────────────────────────────────── |
