aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-18 02:21:19 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-18 02:21:19 +0800
commitb838e9617ba66542d684b8410e9f0d52ac7ff5e9 (patch)
tree76779ea13d1ef7698b67cfdca74e07a086087aef
parent6f2053e27a4dda5d6208b27bd652a9e861173e59 (diff)
fix(core)!: conditionally override exit code in ExitCodeSetup
-rw-r--r--CHANGELOG.md2
-rw-r--r--mingling/src/setups/exit_code.rs11
2 files changed, 11 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e85058c..49b1f35 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -211,6 +211,8 @@ None
All examples, docs, and test cases across the repository have been updated to use `.into()` where packed types are returned from chain functions.
+3. **[`core`]** **[`ExitCodeSetup`]** Updated `ExitCodeSetup` to only override the exit code when `ResExitCode` has been modified (i.e., `exit_code != 0`). Previously, it unconditionally overrode the exit code, which could interfere with exit codes set by other hooks or the program's default exit flow. The `on_finish` hook now returns `ProgramControlUnit::OverrideExitCode(...)` only when the exit code is non-zero, and `ProgramControls::Empty` otherwise. The import of `ProgramControls` has been added accordingly.
+
---
## Release 0.2.2 (2026-07-10)
diff --git a/mingling/src/setups/exit_code.rs b/mingling/src/setups/exit_code.rs
index 025ed8a..6b8a1ef 100644
--- a/mingling/src/setups/exit_code.rs
+++ b/mingling/src/setups/exit_code.rs
@@ -2,7 +2,7 @@ use std::marker::PhantomData;
use mingling_core::{
ProgramCollect,
- hook::{ProgramControlUnit, ProgramHook},
+ hook::{ProgramControlUnit, ProgramControls, ProgramHook},
setup::ProgramSetup,
this,
};
@@ -39,7 +39,14 @@ where
// Insert hook to override exit code before program ends
program.with_hook(ProgramHook::empty().on_finish(|_| {
let this = this::<C>().res_or_default::<ResExitCode>();
- ProgramControlUnit::OverrideExitCode(this.exit_code)
+ let ec = this.exit_code;
+
+ // Only override when ResExitCode has been modified
+ if ec != 0 {
+ ProgramControlUnit::OverrideExitCode(this.exit_code).into()
+ } else {
+ ProgramControls::Empty
+ }
}));
}
}