1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#[cfg(test)]
#[path = "./version_test.rs"]
mod version_test;
use command;
use semver::Version;
use std::process::Command;
static VERSION: &str = env!("CARGO_PKG_VERSION");
fn get_version_from_output(line: &str) -> Option<String> {
let parts: Vec<&str> = line.split(' ').collect();
if parts.len() >= 3 {
let version_part = parts[2];
let version = str::replace(version_part, "\"", "");
Some(version)
} else {
None
}
}
fn get_latest_version() -> Option<String> {
let result = Command::new("cargo")
.arg("search")
.arg("cargo-make")
.output();
match result {
Ok(output) => {
let exit_code = command::get_exit_code(Ok(output.status), false);
if exit_code == 0 {
let stdout = String::from_utf8_lossy(&output.stdout);
let lines: Vec<&str> = stdout.split('\n').collect();
let mut output = None;
for mut line in lines {
line = line.trim();
debug!("Checking: {}", &line);
if line.starts_with("cargo-make = ") {
output = get_version_from_output(line);
break;
}
}
output
} else {
None
}
}
_ => None,
}
}
fn is_newer_found(latest_string: &str) -> bool {
debug!("Checking Version: {}", &latest_string);
let current = Version::parse(VERSION);
match current {
Ok(current_values) => {
let latest = Version::parse(latest_string);
match latest {
Ok(latest_values) => {
if latest_values.major > current_values.major {
true
} else if latest_values.major == current_values.major {
if latest_values.minor > current_values.minor {
true
} else {
latest_values.minor == current_values.minor
&& latest_values.patch > current_values.patch
}
} else {
false
}
}
_ => false,
}
}
_ => false,
}
}
fn print_notification(latest_string: &str) {
warn!("#####################################################################");
warn!("# #");
warn!("# #");
warn!("# NEW CARGO-MAKE VERSION FOUND!!! #");
warn!(
"# Current: {}, Latest: {}\t\t\t#",
VERSION, latest_string
);
warn!("# Run 'cargo install --force cargo-make' to get latest version #");
warn!("# #");
warn!("# #");
warn!("#####################################################################");
}
pub(crate) fn check() {
let latest = get_latest_version();
match latest {
Some(value) => {
if is_newer_found(&value) {
print_notification(&value);
}
}
None => (),
}
}