diff --git a/rust/chg/src/main.rs b/rust/chg/src/main.rs --- a/rust/chg/src/main.rs +++ b/rust/chg/src/main.rs @@ -83,5 +83,6 @@ .run_command_chg(&mut handler, env::args_os().skip(1)) .await?; procutil::restore_signal_handler_once()?; + handler.wait_pager().await?; Ok(code) } diff --git a/rust/chg/src/uihandler.rs b/rust/chg/src/uihandler.rs --- a/rust/chg/src/uihandler.rs +++ b/rust/chg/src/uihandler.rs @@ -9,7 +9,7 @@ use std::os::unix::process::ExitStatusExt; use std::process::Stdio; use tokio; -use tokio::process::{ChildStdin, Command}; +use tokio::process::{Child, ChildStdin, Command}; use crate::message::CommandSpec; use crate::procutil; @@ -31,11 +31,21 @@ } /// Default cHg implementation to process requests received from server. -pub struct ChgUiHandler {} +pub struct ChgUiHandler { + pager: Option, +} impl ChgUiHandler { pub fn new() -> ChgUiHandler { - ChgUiHandler {} + ChgUiHandler { pager: None } + } + + /// Waits until the pager process exits. + pub async fn wait_pager(&mut self) -> io::Result<()> { + if let Some(p) = self.pager.take() { + p.await?; + } + Ok(()) } } @@ -51,7 +61,7 @@ // otherwise the server won't get SIGPIPE if it does not write // anything. (issue5278) // kill(peerpid, SIGPIPE); - tokio::spawn(async { pager.await }); // just ignore errors + self.pager = Some(pager); Ok(pin) }