ya_compile_time_utils/
lib.rs1pub use git_version::git_version;
2use metrics::gauge;
3use semver::Version;
4
5pub fn git_rev() -> &'static str {
7 env!("VERGEN_SHA_SHORT")
8}
9
10pub fn build_date() -> &'static str {
12 env!("VERGEN_BUILD_DATE")
13}
14
15pub fn build_number_str() -> Option<&'static str> {
17 option_env!("GITHUB_RUN_NUMBER")
18}
19
20pub fn build_number() -> Option<i64> {
22 build_number_str().and_then(|s| s.parse().ok())
23}
24
25pub fn tag2semver(tag: &str) -> &str {
27 let mut version = tag;
28 for prefix in ["pre-rel-", "v"].iter() {
29 if version.starts_with(prefix) {
30 version = &version[prefix.len()..];
31 }
32 }
33 version
34}
35
36pub fn report_version_to_metrics() {
37 if let Ok(version) = Version::parse(semver_str!()) {
38 gauge!("yagna.version.major", version.major as i64);
39 gauge!("yagna.version.minor", version.minor as i64);
40 gauge!("yagna.version.patch", version.patch as i64);
41 gauge!(
42 "yagna.version.is_prerelease",
43 (!version.pre.is_empty()) as i64
44 );
45 if let Some(build_number) = build_number() {
46 gauge!("yagna.version.build_number", build_number);
47 }
48 }
49}
50
51#[macro_export]
53macro_rules! git_tag {
54 () => {
55 $crate::git_version!(
56 args = [
57 "--tag",
58 "--abbrev=0",
59 "--match=v[0-9]*",
60 "--match=pre-rel-v[0-9]*"
61 ],
62 cargo_prefix = ""
63 )
64 };
65}
66
67#[macro_export]
69macro_rules! semver_str {
70 () => {
71 $crate::tag2semver($crate::git_tag!())
72 };
73}
74
75#[macro_export]
76macro_rules! version_describe {
77 () => {
78 Box::leak(
79 [
80 $crate::semver_str!(),
81 " (",
82 $crate::git_rev(),
83 " ",
84 &$crate::build_date(),
85 &$crate::build_number_str()
86 .map(|n| format!(" build #{}", n))
87 .unwrap_or("".to_string()),
88 ")",
89 ]
90 .join("")
91 .into_boxed_str(),
92 ) as &str
93 };
94}
95
96#[cfg(test)]
97mod test {
98 use super::*;
99
100 #[test]
101 fn test_git_tag() {
102 println!("git tag: {:?}", git_tag!());
103 }
104
105 #[test]
106 fn test_git_rev() {
107 println!("git rev: {:?}", git_rev());
108 }
109
110 #[test]
111 fn test_semver() {
112 println!("semver: {:?}", Version::parse(semver_str!()));
113 }
114
115 #[test]
116 fn test_build_number() {
117 println!("build: {:?}", build_number());
118 }
119}