Files
nix_builder/src/nix_util/running_build.rs

76 lines
2.1 KiB
Rust
Raw Normal View History

2026-02-16 20:42:03 -05:00
use sqlx::Row;
use tokio::process::Child;
use crate::Result;
use crate::database::db_handle::DbHandle;
2026-02-16 21:17:25 -05:00
use crate::nix_util::nix_output_stream::NixOutputStream;
use crate::nix_util::output_stream::OutputStream;
use super::nix_output_stream::NixMessage;
pub(crate) struct RunningBuild<'db> {
db_handle: &'db DbHandle,
}
impl<'db> RunningBuild<'db> {
pub(crate) fn new(db_handle: &'db DbHandle) -> Result<Self> {
Ok(RunningBuild { db_handle })
}
2026-02-16 20:42:03 -05:00
pub(crate) async fn run_to_completion<TN>(
&mut self,
mut child: Child,
target_name: TN,
) -> Result<()>
where
TN: AsRef<str>,
{
let build_id: i64 = sqlx::query(
r#"INSERT INTO build (start_time, target) SELECT unixepoch('now'), ? RETURNING id"#,
)
.bind(target_name.as_ref())
.fetch_one(&self.db_handle.conn)
.await?
.try_get("id")?;
2026-02-16 21:17:25 -05:00
let output_stream = OutputStream::from_child(&mut child)?;
let mut nix_output_stream = NixOutputStream::new(output_stream);
let exit_status_handle = tokio::spawn(async move {
let status = child
.wait()
.await
.expect("nixos-rebuild encountered an error");
status
});
2026-02-16 21:17:25 -05:00
while let Some(message) = nix_output_stream.next().await? {
// foo
self.handle_message(message)?;
}
let exit_status = exit_status_handle.await?;
println!("nixos-rebuild status was: {}", exit_status);
2026-02-16 20:42:03 -05:00
let update: u64 =
sqlx::query(r#"UPDATE build SET end_time=unixepoch('now'), status=? WHERE id=?"#)
.bind(
exit_status
.code()
.expect("Process should have an exit code."),
)
.bind(build_id)
.execute(&self.db_handle.conn)
.await?
.rows_affected();
assert!(update == 1);
Ok(())
}
2026-02-16 21:17:25 -05:00
fn handle_message(&mut self, message: NixMessage) -> Result<()> {
// println!("OUT: {:?}", message);
Ok(())
}
}