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
122
use std::io::{stdout, Write};
use bodhi::Update;
pub fn progress_bar(prefix: &str, p: u32, ps: u32) {
let columns: u32 = match term_size::dimensions() {
Some((w, _)) => w as u32,
None => return,
};
let width: u32 = columns - (prefix.len() as u32) - 13;
let progress = ((p as f64) / (ps as f64) * (width as f64)) as u32;
let remaining = width - progress;
let line = format!(
" {}: [ {}{} ] {:>3}% ",
prefix,
"=".repeat(progress as usize),
" ".repeat(remaining as usize),
((p as f64) / (ps as f64) * 100f64) as u32,
);
print!("\r{}", &line);
stdout().flush().unwrap();
}
pub fn print_update(update: &Update, builds: &[String]) {
let date = match &update.date_submitted {
Some(date) => date.to_string(),
None => "(None)".to_string(),
};
let karma = match update.karma {
Some(karma) => karma.to_string(),
None => "?".to_string(),
};
let stable_karma = match update.stable_karma {
Some(karma) => karma.to_string(),
None => "?".to_string(),
};
let unstable_karma = match update.unstable_karma {
Some(karma) => karma.to_string(),
None => "?".to_string(),
};
println!();
println!("{}", "#".repeat(&update.alias.len() + 6));
println!("## {} ##", update.alias);
println!("{}", "#".repeat(&update.alias.len() + 6));
println!();
match term_size::dimensions() {
Some((w, _)) => println!("{}", textwrap::fill(&update.notes, w)),
None => println!("{}", &update.notes),
};
println!();
println!(
"URL: https://bodhi.fedoraproject.org/updates/{}",
&update.alias
);
println!("Update type: {}", update.update_type);
println!("Submitted: {}", date);
println!("Submitter: {}", update.user.name);
println!("Karma: {}", karma);
println!("Stable karma: {}", stable_karma);
println!("Unstable karma: {}", unstable_karma);
println!();
if !update.bugs.is_empty() {
let bugs: Vec<(String, Option<&String>)> = update
.bugs
.iter()
.map(|b| (b.url().to_string(), b.title.as_ref()))
.collect();
println!("Bugs:");
for (url, title) in bugs {
println!("- {}", url);
if let Some(title) = title {
println!(" {}", title);
};
}
println!();
};
match &update.test_cases {
Some(ts) if !ts.is_empty() => {
let test_cases: Vec<String> = ts.iter().map(|t| t.url().to_string()).collect();
println!("Test cases:");
for url in test_cases {
println!("- {}", url);
}
println!();
},
_ => {},
};
println!("Builds:");
for build in builds {
println!("- {}", build);
}
println!();
}