This repository has been archived on 2026-10-08. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
maestro/crates/maestro-daemon/src/release.rs
T
Miguel PalhasandClaude Opus 5 eaf60d9dac feat(maestro): stamp the daemon with its build commit
`GET /api/info` now carries `build` (commit hash, commit date, dirty flag)
and `instance`, a fresh uuid per daemon process. Together they let a client
name the release it is talking to and, after losing its socket, tell an
upgrade from a plain restart from a network blip.

The stamp comes from `maestro-daemon/build.rs`, which reads the git checkout
it compiles in. The Nix build has no `.git` in the crane-filtered source, so
`flake.nix` passes the flake's own revision and last-modified date through
`MAESTRO_BUILD_*` instead. Neither available leaves the fields empty.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 15:40:41 +01:00

32 lines
1.3 KiB
Rust

//! What release this daemon is, and which run of it.
//!
//! Two facts ride `GET /api/info` so clients can render a status indicator and
//! survive an upgrade:
//!
//! * [`build_info`] — the commit the binary was compiled from, stamped by
//! `build.rs`. Shown in the indicator's tooltip; a change across a reconnect
//! means the operator upgraded, so a browser reloads its assets.
//! * [`instance_id`] — a fresh id per daemon process. A change with the same
//! commit means a plain restart, which clients ride out silently.
use std::sync::OnceLock;
use maestro_protocol::BuildInfo;
/// The commit this binary was built from. Every field is empty when the build
/// happened outside a git checkout and no `MAESTRO_BUILD_*` override was given.
pub fn build_info() -> BuildInfo {
BuildInfo {
commit: env!("MAESTRO_BUILD_COMMIT").to_string(),
commit_date: env!("MAESTRO_BUILD_DATE").to_string(),
dirty: env!("MAESTRO_BUILD_DIRTY") == "true",
}
}
/// Identity of this daemon process, stable for its lifetime and different on
/// every start. Clients diff it across a reconnect to detect a restart.
pub fn instance_id() -> &'static str {
static ID: OnceLock<String> = OnceLock::new();
ID.get_or_init(|| uuid::Uuid::new_v4().to_string())
}