2026-02-16 20:42:03 -05:00
|
|
|
use sqlx::Row;
|
2026-02-16 20:06:46 -05:00
|
|
|
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;
|
2026-02-16 20:06:46 -05:00
|
|
|
|
|
|
|
|
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);
|
2026-02-16 20:06:46 -05:00
|
|
|
|
|
|
|
|
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)?;
|
2026-02-16 20:06:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
2026-02-16 20:06:46 -05:00
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-16 21:17:25 -05:00
|
|
|
fn handle_message(&mut self, message: NixMessage) -> Result<()> {
|
|
|
|
|
// println!("OUT: {:?}", message);
|
2026-02-16 20:06:46 -05:00
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
}
|