diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-23 00:48:46 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:57:21 +0900 |
| commit | c6f3e51860c2a69fc4c539fb081cde05bcf952f4 (patch) | |
| tree | 58c01634e9a6ef7365b6c4c28a13f959462c42c8 /crates/mozart/src/commands | |
| parent | 46e7edbdad721b64e5eae66a0788a55264078e43 (diff) | |
| download | php-mozart-c6f3e51860c2a69fc4c539fb081cde05bcf952f4.tar.gz php-mozart-c6f3e51860c2a69fc4c539fb081cde05bcf952f4.tar.zst php-mozart-c6f3e51860c2a69fc4c539fb081cde05bcf952f4.zip | |
fix(bump): use exit code 2 for stale lock file to match Composer
Composer's BumpCommand uses ERROR_LOCK_OUTDATED=2 for stale lock files,
but Mozart was using LOCK_FILE_INVALID=4. Define a local constant to
avoid conflicting with the global exit code registry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands')
| -rw-r--r-- | crates/mozart/src/commands/bump.rs | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/crates/mozart/src/commands/bump.rs b/crates/mozart/src/commands/bump.rs index fd25fe5..7e74f80 100644 --- a/crates/mozart/src/commands/bump.rs +++ b/crates/mozart/src/commands/bump.rs @@ -3,6 +3,9 @@ use mozart_core::console_format; use std::collections::HashMap; use std::path::PathBuf; +/// Exit code for stale lock file (matches Composer's BumpCommand::ERROR_LOCK_OUTDATED) +const ERROR_LOCK_OUTDATED: i32 = 2; + #[derive(Args)] pub struct BumpArgs { /// Package(s) to bump @@ -71,7 +74,7 @@ pub async fn execute( // Check lock file freshness if !lock.is_fresh(&composer_json_content) { return Err(mozart_core::exit_code::bail( - mozart_core::exit_code::LOCK_FILE_INVALID, + ERROR_LOCK_OUTDATED, "composer.lock is not up to date with composer.json. \ Run `mozart install` or `mozart update` to refresh it.", )); @@ -606,8 +609,8 @@ mod tests { // ── Stale lock file ──────────────────────────────────────────────────── - #[test] - fn test_stale_lock_file_produces_exit_code_2() { + #[tokio::test] + async fn test_stale_lock_file_produces_exit_code_2() { let dir = tempdir().unwrap(); let composer_json = r#"{ "name": "test/project", @@ -623,18 +626,26 @@ mod tests { lock.write_to_file(&dir.path().join("composer.lock")) .unwrap(); - let _args = BumpArgs { + let args = BumpArgs { packages: vec![], dev_only: false, no_dev_only: false, dry_run: false, }; - let _cli = make_cli(dir.path()); + let cli = make_cli(dir.path()); + let console = mozart_core::console::Console { + interactive: false, + verbosity: mozart_core::console::Verbosity::Normal, + decorated: false, + }; + let result = execute(&args, &cli, &console).await; - // The execute function returns Err(MozartError) with LOCK_FILE_INVALID for stale lock. - // We verify the lock IS stale here as a prerequisite check. - let lock_loaded = LockFile::read_from_file(&dir.path().join("composer.lock")).unwrap(); - assert!(!lock_loaded.is_fresh(composer_json)); + // stale lock file should return exit code 2 (ERROR_LOCK_OUTDATED) + let err = result.unwrap_err(); + let mozart_err = err + .downcast_ref::<mozart_core::exit_code::MozartError>() + .expect("should be MozartError"); + assert_eq!(mozart_err.exit_code, ERROR_LOCK_OUTDATED); } // ── Platform packages skipped ────────────────────────────────────────── |
