aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/bump.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-23 00:48:46 +0900
committernsfisis <nsfisis@gmail.com>2026-02-23 01:57:21 +0900
commitc6f3e51860c2a69fc4c539fb081cde05bcf952f4 (patch)
tree58c01634e9a6ef7365b6c4c28a13f959462c42c8 /crates/mozart/src/commands/bump.rs
parent46e7edbdad721b64e5eae66a0788a55264078e43 (diff)
downloadphp-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/bump.rs')
-rw-r--r--crates/mozart/src/commands/bump.rs29
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 ──────────────────────────────────────────