mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-06 19:45:29 +00:00
fix: warnings not shown before stdin interaction
This commit is contained in:
parent
639ef19fbc
commit
5b78b96fa1
@ -1,8 +1,12 @@
|
|||||||
use std::io::{self, stderr, stdout, StderrLock, StdoutLock, Write};
|
use std::io::{self, stderr, stdout, StderrLock, StdoutLock, Write};
|
||||||
|
|
||||||
|
use crate::utils::logger;
|
||||||
|
|
||||||
type StdioOutputLocks = (StdoutLock<'static>, StderrLock<'static>);
|
type StdioOutputLocks = (StdoutLock<'static>, StderrLock<'static>);
|
||||||
|
|
||||||
pub fn lock_and_flush_output_stdio() -> io::Result<StdioOutputLocks> {
|
pub fn lock_and_flush_output_stdio() -> io::Result<StdioOutputLocks> {
|
||||||
|
logger::flush_messages();
|
||||||
|
|
||||||
let mut stdout = stdout().lock();
|
let mut stdout = stdout().lock();
|
||||||
stdout.flush()?;
|
stdout.flush()?;
|
||||||
let mut stderr = stderr().lock();
|
let mut stderr = stderr().lock();
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
use std::sync::{mpsc, OnceLock};
|
use std::sync::{mpsc, Arc, Barrier, OnceLock};
|
||||||
|
|
||||||
pub use logger_thread::spawn_logger_thread;
|
pub use logger_thread::spawn_logger_thread;
|
||||||
|
|
||||||
use super::colors::{ORANGE, RESET, YELLOW};
|
use super::colors::{ORANGE, RESET, YELLOW};
|
||||||
use crate::accessible::is_running_in_accessible_mode;
|
use crate::accessible::is_running_in_accessible_mode;
|
||||||
|
|
||||||
|
/// Asks logger to flush all messages, useful before starting STDIN interaction.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn flush_messages() {
|
||||||
|
logger_thread::send_flush_message_and_wait();
|
||||||
|
}
|
||||||
|
|
||||||
/// An `[INFO]` log to be displayed if we're not running accessibility mode.
|
/// An `[INFO]` log to be displayed if we're not running accessibility mode.
|
||||||
///
|
///
|
||||||
/// Same as `.info_accessible()`, but only displayed if accessibility mode
|
/// Same as `.info_accessible()`, but only displayed if accessibility mode
|
||||||
@ -49,6 +55,7 @@ pub fn warning(contents: String) {
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Message {
|
enum Message {
|
||||||
|
Flush { finished_barrier: Arc<Barrier> },
|
||||||
FlushAndShutdown,
|
FlushAndShutdown,
|
||||||
PrintMessage(PrintMessage),
|
PrintMessage(PrintMessage),
|
||||||
}
|
}
|
||||||
@ -134,6 +141,19 @@ mod logger_thread {
|
|||||||
.expect("Failed to send shutdown message");
|
.expect("Failed to send shutdown message");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub(super) fn send_flush_message_and_wait() {
|
||||||
|
let barrier = Arc::new(Barrier::new(2));
|
||||||
|
|
||||||
|
get_sender()
|
||||||
|
.send(Message::Flush {
|
||||||
|
finished_barrier: barrier.clone(),
|
||||||
|
})
|
||||||
|
.expect("Failed to send shutdown message");
|
||||||
|
|
||||||
|
barrier.wait();
|
||||||
|
}
|
||||||
|
|
||||||
pub struct LoggerThreadHandle {
|
pub struct LoggerThreadHandle {
|
||||||
shutdown_barrier: Arc<Barrier>,
|
shutdown_barrier: Arc<Barrier>,
|
||||||
}
|
}
|
||||||
@ -173,7 +193,7 @@ mod logger_thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn run_logger(log_receiver: LogReceiver, shutdown_barrier: Arc<Barrier>) {
|
fn run_logger(log_receiver: LogReceiver, shutdown_barrier: Arc<Barrier>) {
|
||||||
const FLUSH_TIMEOUT: Duration = Duration::from_millis(250);
|
const FLUSH_TIMEOUT: Duration = Duration::from_millis(200);
|
||||||
|
|
||||||
let mut buffer = Vec::<String>::with_capacity(16);
|
let mut buffer = Vec::<String>::with_capacity(16);
|
||||||
|
|
||||||
@ -202,6 +222,11 @@ mod logger_thread {
|
|||||||
flush_logs_to_stderr(&mut buffer);
|
flush_logs_to_stderr(&mut buffer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Message::Flush { finished_barrier } => {
|
||||||
|
flush_logs_to_stderr(&mut buffer);
|
||||||
|
finished_barrier.wait();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user