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
use chrono::Duration;
use std::path::PathBuf;
use std::time::SystemTime;
use config::Config;
use errors::Result;
use report::Report;
fn get_age(filename: PathBuf) -> Option<String> {
filename
.metadata()
.ok()
.and_then(|metadata| metadata.modified().ok())
.and_then(|mtime| SystemTime::now().duration_since(mtime).ok())
.and_then(|dur| Duration::from_std(dur).ok())
.and_then(|dur| {
let days = dur.num_days();
let hours = dur.num_hours() - (days * 24);
let mins = dur.num_minutes() - (days * 24 * 60) - (hours * 60);
let secs = dur.num_seconds()
- (days * 24 * 60 * 60)
- (hours * 60 * 60)
- (mins * 60);
Some(format!("{}d, {}h, {}m, {}s", days, hours, mins, secs))
})
}
pub fn execute(mut config: Config) -> Result<Report> {
let repos = config.get_repos();
let mut report = Report::new(&repos);
let version = format!("{}", crate_version!());
let mut underline = format!("===========");
for _ in 0..version.len() {
underline.push('=');
}
report.add_message(format!("git-global {}", version));
report.add_message(underline);
report.add_message(format!("Number of repos: {}", repos.len()));
report.add_message(format!("Base directory: {}", config.basedir));
report.add_message(format!(
"Cache file: {}",
config.cache_file.to_str().unwrap()
));
if let Some(age) = get_age(config.cache_file) {
report.add_message(format!("Cache file age: {}", age));
}
report.add_message(format!("Ignored patterns:"));
for pat in config.ignored_patterns.iter() {
report.add_message(format!(" {}", pat));
}
Ok(report)
}