Skip to content

Commit 79519b9

Browse files
authored
Show git semver in banner (#197)
Fixes #165
1 parent 3dc764d commit 79519b9

File tree

1 file changed

+76
-32
lines changed

1 file changed

+76
-32
lines changed

server/src/banner.rs

Lines changed: 76 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -48,52 +48,96 @@ pub mod version {
4848
use chrono::Duration;
4949
use chrono_humanize::{Accuracy, Tense};
5050
use crossterm::style::Stylize;
51-
use semver::Version;
51+
use std::fmt;
5252

5353
use crate::utils::update;
5454

55+
pub enum ParseableVersion {
56+
Version(semver::Version),
57+
Prerelease(semver::Prerelease),
58+
}
59+
60+
impl fmt::Display for ParseableVersion {
61+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62+
match self {
63+
ParseableVersion::Version(v) => write!(f, "{}", v),
64+
ParseableVersion::Prerelease(p) => write!(f, "{}", p),
65+
}
66+
}
67+
}
68+
5569
pub fn print() {
5670
// print current version
5771
let current = current();
58-
// not eprintln because if it is old release then time passed with be displayed beside it
59-
eprint!(
60-
"
72+
73+
match current {
74+
ParseableVersion::Version(current_version) => {
75+
// not eprintln because if it is old release then time passed with be displayed beside it
76+
eprint!(
77+
"
6178
{} {} ",
62-
"Current Version:".to_string().blue().bold(),
63-
current
64-
);
65-
66-
// check for latest release, if it cannot be fetched then print error as warn and return
67-
let latest_release = match update::get_latest() {
68-
Ok(latest_release) => latest_release,
69-
Err(e) => {
70-
log::warn!("{}", e);
71-
return;
72-
}
73-
};
79+
"Current Version:".to_string().blue().bold(),
80+
current_version
81+
);
7482

75-
if latest_release.version > current {
76-
let time_since_latest_release = chrono::Utc::now() - latest_release.date;
77-
let time_since_latest_release = humanize_time(time_since_latest_release);
83+
// check for latest release, if it cannot be fetched then print error as warn and return
84+
let latest_release = match update::get_latest() {
85+
Ok(latest_release) => latest_release,
86+
Err(e) => {
87+
log::warn!("{}", e);
88+
return;
89+
}
90+
};
7891

79-
let fmt_latest_version = format!(
80-
"( v{} released {} ago )",
81-
latest_release.version, time_since_latest_release
82-
);
92+
if latest_release.version > current_version {
93+
let time_since_latest_release = chrono::Utc::now() - latest_release.date;
94+
let time_since_latest_release = humanize_time(time_since_latest_release);
8395

84-
eprint!("{}", fmt_latest_version.yellow().bold());
85-
eprintln!(
86-
"
96+
let fmt_latest_version = format!(
97+
"( v{} released {} ago )",
98+
latest_release.version, time_since_latest_release
99+
);
100+
101+
eprint!("{}", fmt_latest_version.yellow().bold());
102+
eprintln!(
103+
"
87104
Download latest version from https://github.com/parseablehq/parseable/releases/latest"
88-
);
89-
} else {
90-
eprintln!();
105+
);
106+
} else {
107+
eprintln!();
108+
}
109+
}
110+
ParseableVersion::Prerelease(current_prerelease) => {
111+
eprint!(
112+
"
113+
{} {} ",
114+
"Current Version:".to_string().blue().bold(),
115+
current_prerelease
116+
);
117+
}
91118
}
92119
}
93120

94-
pub fn current() -> Version {
95-
let current = env!("VERGEN_BUILD_SEMVER");
96-
semver::Version::parse(current).expect("VERGEN_BUILD_SEMVER is always valid semver")
121+
pub fn current() -> ParseableVersion {
122+
let build_semver = env!("VERGEN_BUILD_SEMVER");
123+
124+
let mut git_semver = env!("VERGEN_GIT_SEMVER");
125+
126+
if &git_semver[..1] == "v" {
127+
git_semver = &git_semver[1..];
128+
}
129+
130+
if build_semver == git_semver {
131+
ParseableVersion::Version(
132+
semver::Version::parse(build_semver)
133+
.expect("VERGEN_BUILD_SEMVER is always valid semver"),
134+
)
135+
} else {
136+
ParseableVersion::Prerelease(
137+
semver::Prerelease::new(git_semver)
138+
.expect("VERGEN_GIT_SEMVER is always valid semver"),
139+
)
140+
}
97141
}
98142

99143
fn humanize_time(time_passed: Duration) -> String {

0 commit comments

Comments
 (0)