From 245105ba6a296df4c2b9bfe7376fd546e9bdff45 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Sun, 10 Sep 2023 11:22:30 +0200 Subject: [PATCH] fix: handle child process exiting with error correctly --- src/ui/build_window.rs | 3 +++ src/ui/job_worker/internal_worker.rs | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ui/build_window.rs b/src/ui/build_window.rs index c3005a9..a0383ba 100644 --- a/src/ui/build_window.rs +++ b/src/ui/build_window.rs @@ -182,6 +182,9 @@ impl SimpleComponent for BuildWindow { BuildStatus::Error(_) => label.add_css_class("error"), _ => {} } + if status != BuildStatus::Building { + sender.input(Self::Input::UpdateCanClose(true)); + } self.set_build_status(status); } Self::Input::UpdateCanClose(val) => { diff --git a/src/ui/job_worker/internal_worker.rs b/src/ui/job_worker/internal_worker.rs index a5ed8fe..8cde927 100644 --- a/src/ui/job_worker/internal_worker.rs +++ b/src/ui/job_worker/internal_worker.rs @@ -10,6 +10,7 @@ use std::{ collections::VecDeque, io::{BufRead, BufReader}, mem, + os::unix::process::ExitStatusExt, process::{Command, Stdio}, sync::{Arc, Mutex}, thread, @@ -105,7 +106,15 @@ impl Worker for InternalJobWorker { let stderr_sender = sender.clone(); let stdout_logger = logger_thread!(stdout, stdout_sender); let stderr_logger = logger_thread!(stderr, stderr_sender); - cmd.wait().expect("Failed to wait for process"); + let status = cmd.wait().expect("Failed to wait for process"); + if !status.success() { + self.state.lock().unwrap().exit_status = Some( + status + .code() + .unwrap_or_else(|| status.signal().unwrap_or(-1337)), + ); + break; + } stdout_logger.join().expect("Failed to join reader thread"); stderr_logger.join().expect("Failed to join reader thread"); } else {