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
|
use git_testament::{GitModification, GitTestament};
#[derive(Debug, thiserror::Error)]
pub enum VersionError {
#[error("string formatting error: {0}")]
Format(#[from] std::fmt::Error),
}
pub struct Version<'a> {
testament: &'a GitTestament<'a>,
}
impl<'a> Version<'a> {
pub fn new(testament: &'a GitTestament<'a>) -> Self {
Self { testament }
}
pub fn version(&self) -> Result<String, VersionError> {
use std::fmt::Write as _;
let mut ret = String::new();
writeln!(ret, "{}", &self.testament)?;
writeln!(
ret,
"{} {}",
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION")
)?;
Ok(ret)
}
pub fn long_version(&self) -> Result<String, VersionError> {
use std::fmt::Write as _;
let mut ret = String::new();
writeln!(ret, "{}", &self.testament)?;
writeln!(ret, "Crate version: {}", env!("CARGO_PKG_VERSION"))?;
if let Some(branch) = self.testament.branch_name {
writeln!(ret, "Built from branch: {}", branch)?;
} else {
writeln!(ret, "Branch information is missing.")?;
}
writeln!(ret, "Commit info: {}", self.testament.commit)?;
if self.testament.modifications.is_empty() {
writeln!(ret, "Working tree is clean")?;
} else {
use GitModification::*;
for fmod in self.testament.modifications {
match fmod {
Added(f) => writeln!(ret, "Added: {}", String::from_utf8_lossy(f))?,
Removed(f) => writeln!(ret, "Removed: {}", String::from_utf8_lossy(f))?,
Modified(f) => writeln!(ret, "Modified: {}", String::from_utf8_lossy(f))?,
Untracked(f) => writeln!(ret, "Untracked: {}", String::from_utf8_lossy(f))?,
}
}
}
Ok(ret)
}
}
|