From 11a28ec247a8cdf07d22333b98975317fd3e85e8 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Mon, 15 Jun 2026 20:16:30 -0500 Subject: [PATCH 1/3] Add crate version and commit hash to ldk-server We will now log the version number and commit hash when starting up. Also will give the full commit hash when doing ldk-server --version to better help debugging things. Co-authored-by: Leo Nash --- ldk-server/build.rs | 58 +++++++++++++++++++++++++++++++++++ ldk-server/src/main.rs | 3 +- ldk-server/src/util/config.rs | 2 +- 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 ldk-server/build.rs diff --git a/ldk-server/build.rs b/ldk-server/build.rs new file mode 100644 index 00000000..935f95ba --- /dev/null +++ b/ldk-server/build.rs @@ -0,0 +1,58 @@ +// This file is Copyright its original authors, visible in version control +// history. +// +// This file is licensed under the Apache License, Version 2.0 or the MIT license +// , at your option. +// You may not use this file except in accordance with one or both of these +// licenses. + +use std::env; +use std::path::Path; +use std::process::Command; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-env-changed=GIT_HASH"); + + // Re-run the build script whenever the checked-out commit changes so the + // embedded hash never goes stale. HEAD lives in the (possibly worktree-local) + // git dir, while branch refs and packed-refs live in the common git dir. + if let Some(git_dir) = git_output(&["rev-parse", "--git-dir"]) { + watch_path(&Path::new(&git_dir).join("HEAD")); + } + if let Some(common_dir) = git_output(&["rev-parse", "--git-common-dir"]) { + let common_dir = Path::new(&common_dir); + watch_path(&common_dir.join("packed-refs")); + // If HEAD points at a ref, watch that ref file too (it changes on commit). + // Watch it even when it does not exist yet: packed refs become loose + // files on the next commit, and Cargo can detect that creation. + if let Some(ref_path) = git_output(&["symbolic-ref", "-q", "HEAD"]) { + watch_path(&common_dir.join(ref_path)); + } + } + + let git_hash = git_output(&["rev-parse", "HEAD"]) + .or_else(|| env::var("GIT_HASH").ok()) + .unwrap_or_else(|| "unknown".to_string()); + println!("cargo:rustc-env=GIT_HASH={git_hash}"); +} + +/// Runs `git` with the given args, returning the trimmed stdout on success or +/// `None` if git is unavailable, exits non-zero, or produces no output. +fn git_output(args: &[&str]) -> Option { + let output = Command::new("git").args(args).output().ok()?; + if !output.status.success() { + return None; + } + let stdout = String::from_utf8_lossy(&output.stdout).trim().to_string(); + if stdout.is_empty() { + None + } else { + Some(stdout) + } +} + +fn watch_path(path: &Path) { + println!("cargo:rerun-if-changed={}", path.display()); +} diff --git a/ldk-server/src/main.rs b/ldk-server/src/main.rs index 3824d68c..8fc0319d 100644 --- a/ldk-server/src/main.rs +++ b/ldk-server/src/main.rs @@ -57,6 +57,7 @@ use crate::util::tls::get_or_generate_tls_config; use crate::util::{systemd, write_new}; const API_KEY_FILE: &str = "api_key"; +const FULL_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), " (", env!("GIT_HASH"), ")"); pub fn get_default_data_dir() -> Option { #[cfg(target_os = "macos")] @@ -240,7 +241,7 @@ fn main() { let (event_sender, _) = broadcast::channel::(1024); let (shutdown_tx, shutdown_rx) = tokio::sync::watch::channel(false); - info!("Starting up..."); + info!("Starting ldk-server version {FULL_VERSION}"); match node.start() { Ok(()) => {}, Err(e) => { diff --git a/ldk-server/src/util/config.rs b/ldk-server/src/util/config.rs index 74b28c3e..492938c6 100644 --- a/ldk-server/src/util/config.rs +++ b/ldk-server/src/util/config.rs @@ -742,7 +742,7 @@ impl TryFrom<&LSPSClientTomlConfig> for LSPSClientConfig { #[derive(Parser, Debug)] #[command( - version, + version = crate::FULL_VERSION, about = "LDK Server Configuration", long_about = None, override_usage = "ldk-server [config_path]" From f92e95909ff31fc85f4d4f477028d88d18da2df4 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Mon, 15 Jun 2026 20:16:30 -0500 Subject: [PATCH 2/3] Add commit hash to ldk-server-cli --version Co-authored-by: Leo Nash --- ldk-server-cli/build.rs | 58 ++++++++++++++++++++++++++++++++++++++ ldk-server-cli/src/main.rs | 4 ++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 ldk-server-cli/build.rs diff --git a/ldk-server-cli/build.rs b/ldk-server-cli/build.rs new file mode 100644 index 00000000..935f95ba --- /dev/null +++ b/ldk-server-cli/build.rs @@ -0,0 +1,58 @@ +// This file is Copyright its original authors, visible in version control +// history. +// +// This file is licensed under the Apache License, Version 2.0 or the MIT license +// , at your option. +// You may not use this file except in accordance with one or both of these +// licenses. + +use std::env; +use std::path::Path; +use std::process::Command; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-env-changed=GIT_HASH"); + + // Re-run the build script whenever the checked-out commit changes so the + // embedded hash never goes stale. HEAD lives in the (possibly worktree-local) + // git dir, while branch refs and packed-refs live in the common git dir. + if let Some(git_dir) = git_output(&["rev-parse", "--git-dir"]) { + watch_path(&Path::new(&git_dir).join("HEAD")); + } + if let Some(common_dir) = git_output(&["rev-parse", "--git-common-dir"]) { + let common_dir = Path::new(&common_dir); + watch_path(&common_dir.join("packed-refs")); + // If HEAD points at a ref, watch that ref file too (it changes on commit). + // Watch it even when it does not exist yet: packed refs become loose + // files on the next commit, and Cargo can detect that creation. + if let Some(ref_path) = git_output(&["symbolic-ref", "-q", "HEAD"]) { + watch_path(&common_dir.join(ref_path)); + } + } + + let git_hash = git_output(&["rev-parse", "HEAD"]) + .or_else(|| env::var("GIT_HASH").ok()) + .unwrap_or_else(|| "unknown".to_string()); + println!("cargo:rustc-env=GIT_HASH={git_hash}"); +} + +/// Runs `git` with the given args, returning the trimmed stdout on success or +/// `None` if git is unavailable, exits non-zero, or produces no output. +fn git_output(args: &[&str]) -> Option { + let output = Command::new("git").args(args).output().ok()?; + if !output.status.success() { + return None; + } + let stdout = String::from_utf8_lossy(&output.stdout).trim().to_string(); + if stdout.is_empty() { + None + } else { + Some(stdout) + } +} + +fn watch_path(path: &Path) { + println!("cargo:rerun-if-changed={}", path.display()); +} diff --git a/ldk-server-cli/src/main.rs b/ldk-server-cli/src/main.rs index 3aa6f1c8..918f57a3 100644 --- a/ldk-server-cli/src/main.rs +++ b/ldk-server-cli/src/main.rs @@ -60,6 +60,8 @@ use types::{ mod types; +const FULL_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), " (", env!("GIT_HASH"), ")"); + const DEFAULT_DIR: &str = if cfg!(target_os = "macos") { "~/Library/Application Support/ldk-server" } else if cfg!(target_os = "windows") { @@ -71,7 +73,7 @@ const DEFAULT_DIR: &str = if cfg!(target_os = "macos") { #[derive(Parser, Debug)] #[command( name = "ldk-server-cli", - version, + version = FULL_VERSION, about = "CLI for interacting with an LDK Server node", override_usage = "ldk-server-cli [OPTIONS] " )] From ca553c84029b25d349edd0bfc21b6f70e037f66b Mon Sep 17 00:00:00 2001 From: benthecarman Date: Wed, 24 Jun 2026 14:05:51 -0500 Subject: [PATCH 3/3] Plumb GIT_HASH build arg into Docker image The Docker build excludes .git via .dockerignore, so the build scripts cannot derive the commit hash from git and fall back to "unknown". Declare GIT_HASH as a build arg and export it as an env var so the build scripts can embed it when callers pass the hash via --build-arg. Co-Authored-By: Claude Opus 4.8 (1M context) --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index 5fa4d0cd..652ccf00 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,8 @@ FROM rust:1.85 AS builder WORKDIR /app ARG ENABLE_LSPS2=false +ARG GIT_HASH +ENV GIT_HASH=$GIT_HASH # Copy manifests and lock file first for dependency caching COPY Cargo.toml Cargo.lock ./