lifecycle: HYPERHIVE_GIT env override (bypass PATH); module sets it

This commit is contained in:
müde 2026-05-15 00:24:51 +02:00
parent 42e7761ea1
commit 7c1ed07cf2
4 changed files with 34 additions and 5 deletions

View file

@ -20,7 +20,6 @@ use axum::{
routing::{get, post}, routing::{get, post},
}; };
use hive_sh4re::Approval; use hive_sh4re::Approval;
use tokio::process::Command;
use tokio_stream::wrappers::BroadcastStream; use tokio_stream::wrappers::BroadcastStream;
use tokio_stream::{Stream, StreamExt}; use tokio_stream::{Stream, StreamExt};
@ -169,7 +168,7 @@ async fn approval_diff(agent: &str, commit_ref: &str) -> String {
} }
async fn git_show(proposed_dir: &Path, commit_ref: &str) -> Result<String> { async fn git_show(proposed_dir: &Path, commit_ref: &str) -> Result<String> {
let out = Command::new("git") let out = lifecycle::git_command()
.current_dir(proposed_dir) .current_dir(proposed_dir)
.args(["show", &format!("{commit_ref}:agent.nix")]) .args(["show", &format!("{commit_ref}:agent.nix")])
.output() .output()

View file

@ -198,7 +198,7 @@ pub async fn setup_applied(applied_dir: &Path, name: &str, hyperhive_flake: &str
/// proposed repo, write it into the applied repo, commit. Hive-c0re alone /// proposed repo, write it into the applied repo, commit. Hive-c0re alone
/// advances `applied`'s `main`; the manager only sees `proposed/`. /// advances `applied`'s `main`; the manager only sees `proposed/`.
pub async fn apply_commit(applied_dir: &Path, proposed_dir: &Path, commit_ref: &str) -> Result<()> { pub async fn apply_commit(applied_dir: &Path, proposed_dir: &Path, commit_ref: &str) -> Result<()> {
let out = Command::new("git") let out = git_command()
.current_dir(proposed_dir) .current_dir(proposed_dir)
.args(["show", &format!("{commit_ref}:agent.nix")]) .args(["show", &format!("{commit_ref}:agent.nix")])
.output() .output()
@ -243,8 +243,16 @@ async fn git_commit(dir: &Path, message: &str) -> Result<()> {
.await .await
} }
/// Spawn `git` honoring the `HYPERHIVE_GIT` env var (absolute path baked in
/// by the NixOS module), falling back to bare `git` (PATH lookup) otherwise.
#[must_use]
pub fn git_command() -> Command {
let exe = std::env::var("HYPERHIVE_GIT").unwrap_or_else(|_| "git".into());
Command::new(exe)
}
async fn git(dir: &Path, args: &[&str]) -> Result<()> { async fn git(dir: &Path, args: &[&str]) -> Result<()> {
let out = Command::new("git") let out = git_command()
.current_dir(dir) .current_dir(dir)
.args(args) .args(args)
.output() .output()
@ -263,7 +271,7 @@ async fn git(dir: &Path, args: &[&str]) -> Result<()> {
/// Returns true if the command exits 0. /// Returns true if the command exits 0.
async fn git_status(dir: &Path, args: &[&str]) -> Result<bool> { async fn git_status(dir: &Path, args: &[&str]) -> Result<bool> {
let st = Command::new("git") let st = git_command()
.current_dir(dir) .current_dir(dir)
.args(args) .args(args)
.status() .status()

View file

@ -145,6 +145,27 @@ pub enum AgentResponse {
/// Logical name the broker uses for the manager. /// Logical name the broker uses for the manager.
pub const MANAGER_AGENT: &str = "manager"; pub const MANAGER_AGENT: &str = "manager";
/// Sender hive-c0re uses for events it pushes into the manager's inbox.
/// Manager harness recognises this and parses the body as a `HelperEvent`.
pub const SYSTEM_SENDER: &str = "system";
/// Out-of-band events the host-side daemon pushes to the manager's inbox.
/// Serialised as JSON in `Message::body` (sender = `SYSTEM_SENDER`).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "event", rename_all = "snake_case")]
pub enum HelperEvent {
/// An approval was approved or denied; if approved, the rebuild has
/// already run (status = Approved on success, Failed on error).
ApprovalResolved {
id: i64,
agent: String,
commit_ref: String,
status: ApprovalStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
note: Option<String>,
},
}
/// Requests on the manager socket. Manager has the agent surface (send/recv) /// Requests on the manager socket. Manager has the agent surface (send/recv)
/// plus privileged lifecycle verbs. /// plus privileged lifecycle verbs.
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]

View file

@ -61,6 +61,7 @@ in
pkgs.git pkgs.git
"/run/current-system/sw" "/run/current-system/sw"
]; ];
environment.HYPERHIVE_GIT = "${pkgs.git}/bin/git";
serviceConfig = { serviceConfig = {
ExecStart = "${cfg.package}/bin/hive-c0re --socket /run/hyperhive/host.sock serve --hyperhive-flake ${cfg.hyperhiveFlake} --dashboard-port ${toString cfg.dashboardPort}"; ExecStart = "${cfg.package}/bin/hive-c0re --socket /run/hyperhive/host.sock serve --hyperhive-flake ${cfg.hyperhiveFlake} --dashboard-port ${toString cfg.dashboardPort}";
Restart = "on-failure"; Restart = "on-failure";