Skip to content

Commit

Permalink
Allow to print the fixed version in the custom format output
Browse files Browse the repository at this point in the history
  • Loading branch information
ilpianista committed Feb 28, 2020
1 parent c2e3c4f commit ab59445
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 36 deletions.
20 changes: 10 additions & 10 deletions doc/arch-audit.1
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,23 @@ arch-audit [FLAGS] [OPTIONS]
.SH "DESCRIPTION"
An utility like pkg-audit based on Arch CVE Monitoring Team data.
.SH "FLAGS"
.PP
\fI-h, --help\fR
.PP
\fI-h, --help\fR
.RS 4
Prints help information.
.RE
.PP
\fI-q, --quiet\fR
.PP
\fI-q, --quiet\fR
.RS 4
Show only vulnerable package names and their versions.
.RE
.PP
\fI-u, --upgradable\fR
.PP
\fI-u, --upgradable\fR
.RS 4
Show only packages that have already been fixed.
.RE
.PP
\fI-V, --version\fR
.PP
\fI-V, --version\fR
.RS 4
Prints version information
.RE
Expand All @@ -36,7 +36,7 @@ Set an alternate database location
.PP
\fI-f, --format\fR <format>
.RS 4
Specify a format to control the output. Placeholders are %n (pkgname)
and %c (CVEs)
Specify a format to control the output. Placeholders are %n (pkgname),
%c (CVEs) and %v (fixed version)
.SH "AUTHOR"
Developer Andrea Scarpino <andrea@archlinux.org>
2 changes: 1 addition & 1 deletion src/cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ args:
short: f
long: format
takes_value: true
help: Specify a format to control the output. Placeholders are %n (pkgname) and %c (CVEs)
help: Specify a format to control the output. Placeholders are %n (pkgname), %c (CVEs) and %v (fixed version)
- quiet:
short: q
long: quiet
Expand Down
65 changes: 40 additions & 25 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,30 +393,10 @@ fn print_avgs(options: &Options, avgs: &BTreeMap<String, avg::AVG>) {
} else {
match options.format {
Some(ref f) => {
print_avg_formatted(&mut t, pkg, avg, f);
print_avg_formatted(&mut t, pkg, avg, v, f);
}
None => {
print_avg_colored(&mut t, pkg, avg);

// Colored update
if avg.status == enums::Status::Testing {
// Print: Update to {} from the testing repos!"
write!(t, " Update to").expect("term::write failed");
t.attr(term::Attr::Bold).expect("term::attr failed");
t.fg(term::color::GREEN).expect("term::fg failed");
write!(t, " {}", v).expect("term::write failed");
t.reset().expect("term::stdout failed");
write!(t, " from the testing repos!")
.expect("term::writeln failed");
} else if avg.status == enums::Status::Fixed {
// Print: Update to {}!
write!(t, " Update to").expect("term::write failed");
t.attr(term::Attr::Bold).expect("term::attr failed");
t.fg(term::color::GREEN).expect("term::fg failed");
write!(t, " {}", v).expect("term::write failed");
t.reset().expect("term::stdout failed");
write!(t, "!").expect("term::writeln failed");
}
print_avg_colored(&mut t, pkg, avg, v);
}
}
}
Expand All @@ -432,10 +412,10 @@ fn print_avgs(options: &Options, avgs: &BTreeMap<String, avg::AVG>) {
} else {
match options.format {
Some(ref f) => {
print_avg_formatted(&mut t, pkg, avg, f);
print_avg_formatted(&mut t, pkg, avg, &String::new(), f);
}
None => {
print_avg_colored(&mut t, pkg, avg);
print_avg_colored(&mut t, pkg, avg, &String::new());
}
}

Expand All @@ -448,7 +428,12 @@ fn print_avgs(options: &Options, avgs: &BTreeMap<String, avg::AVG>) {
}

/// Prints "Package {pkg} is affected by {issues}. {severity}!" colored
fn print_avg_colored(t: &mut Box<term::StdoutTerminal>, pkg: &String, avg: &avg::AVG) {
fn print_avg_colored(
t: &mut Box<term::StdoutTerminal>,
pkg: &String,
avg: &avg::AVG,
version: &String,
) {
// Bold package
write!(t, "Package").expect("term::write failed");
t.attr(term::Attr::Bold).expect("term::attr failed");
Expand All @@ -460,13 +445,34 @@ fn print_avg_colored(t: &mut Box<term::StdoutTerminal>, pkg: &String, avg: &avg:
t.fg(avg.severity.to_color()).expect("term::fg failed");
write!(t, " {}!", avg.severity).expect("term::write failed");
t.reset().expect("term::stdout failed");

if !version.is_empty() {
if avg.status == enums::Status::Testing {
// Print: Update to {} from the testing repos!"
write!(t, " Update to").expect("term::write failed");
t.attr(term::Attr::Bold).expect("term::attr failed");
t.fg(term::color::GREEN).expect("term::fg failed");
write!(t, " {}", version).expect("term::write failed");
t.reset().expect("term::stdout failed");
write!(t, " from the testing repos!").expect("term::writeln failed");
} else if avg.status == enums::Status::Fixed {
// Print: Update to {}!
write!(t, " Update to").expect("term::write failed");
t.attr(term::Attr::Bold).expect("term::attr failed");
t.fg(term::color::GREEN).expect("term::fg failed");
write!(t, " {}", version).expect("term::write failed");
t.reset().expect("term::stdout failed");
write!(t, "!").expect("term::writeln failed");
}
}
}

/// Prints output formatted as the user wants
fn print_avg_formatted(
t: &mut Box<term::StdoutTerminal>,
pkg: &String,
avg: &avg::AVG,
version: &String,
f: &String,
) {
let mut chars = f.chars().peekable();
Expand All @@ -485,6 +491,15 @@ fn print_avg_formatted(
.expect("term::write failed");
chars.next();
}
Some('v') => {
if !version.is_empty() {
t.attr(term::Attr::Bold).expect("term::attr failed");
t.fg(term::color::GREEN).expect("term::fg failed");
write!(t, " {}", version).expect("term::write failed");
t.reset().expect("term::stdout failed");
}
chars.next();
}
Some(x) => {
debug!("Unknown placeholder {}", x);
chars.next();
Expand Down

0 comments on commit ab59445

Please sign in to comment.