mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-05-07 04:30:03 +00:00
feat: Impl new option --continue-on-failure
(#1559)
* feat: Impl new option `--continue-on-failure` Resolve #1548 Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Add new e2e-tests continue-on-failure Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Rm dup line ion `e2e-tests/live.sh` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Fix shellcheck Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Fix `BinstallError::crate_errors` if `errors.len()` is 1 In that case, it should return `Some(Self::CrateContext(_))` instead of `Some(Self::Errors(_))` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Add more tests to `e2e-tests/continue-on-failure.sh` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Propagate crate errors on `confirm()` err Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Test having two errors in `e2e-tests/continue-on-failure.sh` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> --------- Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
f5da25cc56
commit
c08b8d232a
8 changed files with 365 additions and 60 deletions
|
@ -1,5 +1,4 @@
|
|||
use std::{
|
||||
future::Future,
|
||||
process::{ExitCode, Termination},
|
||||
time::Duration,
|
||||
};
|
||||
|
@ -48,20 +47,17 @@ impl MainExit {
|
|||
}
|
||||
|
||||
/// This function would start a tokio multithreading runtime,
|
||||
/// spawn a new task on it that runs `f()`, then `block_on` it.
|
||||
/// then `block_on` the task it returns.
|
||||
///
|
||||
/// It will cancel the future if user requested cancellation
|
||||
/// via signal.
|
||||
pub fn run_tokio_main<Func, Fut>(f: Func) -> Result<()>
|
||||
where
|
||||
Func: FnOnce() -> Result<Option<Fut>>,
|
||||
Fut: Future<Output = Result<()>> + Send + 'static,
|
||||
{
|
||||
pub fn run_tokio_main(
|
||||
f: impl FnOnce() -> Result<Option<AutoAbortJoinHandle<Result<()>>>>,
|
||||
) -> Result<()> {
|
||||
let rt = Runtime::new().map_err(BinstallError::from)?;
|
||||
let _guard = rt.enter();
|
||||
|
||||
if let Some(fut) = f()? {
|
||||
let handle = AutoAbortJoinHandle::new(rt.spawn(fut));
|
||||
if let Some(handle) = f()? {
|
||||
rt.block_on(cancel_on_user_sig_term(handle))?
|
||||
} else {
|
||||
Ok(())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue