From d46d36ecee7cbfcbd100d6970266269af87f6f0e Mon Sep 17 00:00:00 2001 From: Lorenz Leutgeb Date: Mon, 14 Jul 2025 16:38:58 +0200 Subject: [PATCH] term/spinner: Only handle signals on Unix The `radicle-signals` crate only supports Unix, so using it prevents `radicle-term` to build on Windows. Of course, this means that non-Unix platforms will not support any signal handling at all, but at least we can build. --- crates/radicle-term/Cargo.toml | 4 +++- crates/radicle-term/src/spinner.rs | 23 ++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/crates/radicle-term/Cargo.toml b/crates/radicle-term/Cargo.toml index 7588c935..2de7e2a9 100644 --- a/crates/radicle-term/Cargo.toml +++ b/crates/radicle-term/Cargo.toml @@ -15,7 +15,6 @@ default = ["git2"] [dependencies] anyhow = { workspace = true } anstyle-query = "1.0.0" -crossbeam-channel = { workspace = true } crossterm = "0.29.0" inquire = { version = "0.7.4", default-features = false, features = ["crossterm", "editor"] } libc = { workspace = true } @@ -25,6 +24,9 @@ unicode-display-width = "0.3.0" unicode-segmentation = "1.7.1" zeroize = { workspace = true } git2 = { workspace = true, features = ["vendored-libgit2"], optional = true } + +[target.'cfg(unix)'.dependencies] +crossbeam-channel = { workspace = true } radicle-signals = { workspace = true } [dev-dependencies] diff --git a/crates/radicle-term/src/spinner.rs b/crates/radicle-term/src/spinner.rs index c3c16e2b..a92d0e8d 100644 --- a/crates/radicle-term/src/spinner.rs +++ b/crates/radicle-term/src/spinner.rs @@ -3,11 +3,6 @@ use std::mem::ManuallyDrop; use std::sync::{Arc, Mutex}; use std::{fmt, io, thread, time}; -use crossbeam_channel as chan; - -use radicle_signals as signals; -use signals::Signal; - use crate::io::{ERROR_PREFIX, WARNING_PREFIX}; use crate::Paint; @@ -136,8 +131,13 @@ pub fn spinner_to( ) -> Spinner { let message = message.to_string(); let progress = Arc::new(Mutex::new(Progress::new(Paint::new(message)))); - let (sig_tx, sig_rx) = chan::unbounded(); - let sig_result = signals::install(sig_tx); + + #[cfg(unix)] + let (sig_tx, sig_rx) = crossbeam_channel::unbounded(); + + #[cfg(unix)] + let sig_result = radicle_signals::install(sig_tx); + let handle = thread::Builder::new() .name(String::from("spinner")) .spawn({ @@ -151,9 +151,13 @@ pub fn spinner_to( break; }; // If were unable to install handles, skip signal processing entirely. + #[cfg(unix)] if sig_result.is_ok() { match sig_rx.try_recv() { - Ok(sig) if sig == Signal::Interrupt || sig == Signal::Terminate => { + Ok(sig) + if sig == radicle_signals::Signal::Interrupt + || sig == radicle_signals::Signal::Terminate => + { write!(animation, "\r{CLEAR_UNTIL_NEWLINE}").ok(); writeln!( completion, @@ -225,8 +229,9 @@ pub fn spinner_to( write!(animation, "{}", crossterm::cursor::Show).ok(); + #[cfg(unix)] if sig_result.is_ok() { - let _ = signals::uninstall(); + let _ = radicle_signals::uninstall(); } } })