From 426f4091b52a8d3b04c3e3bb90aa8509af39d860 Mon Sep 17 00:00:00 2001 From: Joerg Roedel Date: Tue, 21 Jan 2025 10:29:03 +0100 Subject: [PATCH] release: Use version string from git if available If the SVSM is built from the git repository, get the version string via 'git describe' to have a more acurate version identifier. The git version allows to identify from which commit the code was built. Signed-off-by: Joerg Roedel --- .gitignore | 1 + release/build.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ release/src/lib.rs | 26 +++++++++++++++++--------- 3 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 release/build.rs diff --git a/.gitignore b/.gitignore index 2d57f98eb..d5ebf7125 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ verus*.log gen_meta stage1/stage1 stage1/stage1-test +release/src/git_version.rs print-meta cbit .idea/ diff --git a/release/build.rs b/release/build.rs new file mode 100644 index 000000000..a6821c703 --- /dev/null +++ b/release/build.rs @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2025 SUSE LLC +// +// Author: Joerg Roedel + +use std::fs::OpenOptions; +use std::io::prelude::*; +use std::process::Command; +use std::string::String; + +fn git_version() -> Result { + let output = Command::new("git") + .args(["describe", "--always", "--dirty=+"]) + .output() + .map_err(|_| ())?; + if !output.status.success() { + return Err(()); + } + + let stdout = String::from_utf8(output.stdout).unwrap(); + let mut lines = stdout.lines(); + let first_line = lines.next().unwrap().trim(); + + Ok(String::from(first_line)) +} + +fn write_version(version: String) { + let mut file = OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open("src/git_version.rs") + .unwrap(); + writeln!(&mut file, "// SPDX-License-Identifier: MIT\n//").unwrap(); + writeln!( + &mut file, + "// This file is automatically generated - Any changes will be overwritten\n//\n" + ) + .unwrap(); + writeln!(&mut file, "pub const GIT_VERSION: &str = \"{}\";", version).unwrap(); +} + +fn main() { + write_version(git_version().unwrap_or_default()); +} diff --git a/release/src/lib.rs b/release/src/lib.rs index e722a6b79..07dd87d02 100644 --- a/release/src/lib.rs +++ b/release/src/lib.rs @@ -6,7 +6,10 @@ #![no_std] +mod git_version; + use core::fmt; +use git_version::GIT_VERSION; #[allow(dead_code)] #[derive(Debug)] @@ -28,15 +31,20 @@ pub struct SvsmVersion { impl fmt::Display for SvsmVersion { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self.release_type { - ReleaseType::Development => { - write!(f, "{}.{:#02}-devel", self.year, self.month) - } - ReleaseType::Candidate(counter) => { - write!(f, "{}.{:#02}-rc{}", self.year, self.month, counter) - } - ReleaseType::Stable(counter) => { - write!(f, "{}.{:#02}.{}", self.year, self.month, counter) + #[allow(clippy::const_is_empty)] + if !GIT_VERSION.is_empty() { + write!(f, "{}", GIT_VERSION) + } else { + match self.release_type { + ReleaseType::Development => { + write!(f, "{}.{:#02}-devel", self.year, self.month) + } + ReleaseType::Candidate(counter) => { + write!(f, "{}.{:#02}-rc{}", self.year, self.month, counter) + } + ReleaseType::Stable(counter) => { + write!(f, "{}.{:#02}.{}", self.year, self.month, counter) + } } } }