Add --show command line flag

This commit is contained in:
Casey Rodarmor 2016-10-05 16:03:11 -07:00
parent ba2ae0a166
commit b11b81c640
3 changed files with 32 additions and 2 deletions

3
notes
View File

@ -1,6 +1,8 @@
notes notes
----- -----
- fix --show to not print final newline, add a helper that iterates over
(item, first, last)
- look through all justfiles for features of make that I use. so far: - look through all justfiles for features of make that I use. so far:
. phony . phony
. SHELL := zsh . SHELL := zsh
@ -11,7 +13,6 @@ notes
command line arguments: command line arguments:
- --show recipe: print recipe information - --show recipe: print recipe information
- --list recipes if a bad recipe given
execution: execution:
- indent for line continuation - indent for line continuation

View File

@ -41,7 +41,7 @@ fn re(pattern: &str) -> Regex {
Regex::new(pattern).unwrap() Regex::new(pattern).unwrap()
} }
struct Recipe<'a> { pub struct Recipe<'a> {
line: usize, line: usize,
name: &'a str, name: &'a str,
leading_whitespace: &'a str, leading_whitespace: &'a str,
@ -49,6 +49,16 @@ struct Recipe<'a> {
dependencies: BTreeSet<&'a str>, dependencies: BTreeSet<&'a str>,
} }
impl<'a> Display for Recipe<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
try!(writeln!(f, "{}:", self.name));
for command in self.commands.iter() {
try!(writeln!(f, " {}", command));
}
Ok(())
}
}
#[cfg(unix)] #[cfg(unix)]
fn error_from_signal<'a>(recipe: &'a str, exit_status: process::ExitStatus) -> RunError<'a> { fn error_from_signal<'a>(recipe: &'a str, exit_status: process::ExitStatus) -> RunError<'a> {
use std::os::unix::process::ExitStatusExt; use std::os::unix::process::ExitStatusExt;
@ -300,6 +310,10 @@ impl<'a> Justfile<'a> {
} }
Ok(()) Ok(())
} }
pub fn get(&self, name: &str) -> Option<&Recipe<'a>> {
self.recipes.get(name)
}
} }
#[derive(Debug)] #[derive(Debug)]

View File

@ -29,6 +29,11 @@ fn main() {
.short("l") .short("l")
.long("list") .long("list")
.help("Lists available recipes")) .help("Lists available recipes"))
.arg(Arg::with_name("show")
.short("s")
.long("show")
.takes_value(true)
.help("Show information about a recipe"))
.arg(Arg::with_name("recipe") .arg(Arg::with_name("recipe")
.multiple(true) .multiple(true)
.help("recipe(s) to run, defaults to the first recipe in the justfile")) .help("recipe(s) to run, defaults to the first recipe in the justfile"))
@ -70,6 +75,16 @@ fn main() {
std::process::exit(0); std::process::exit(0);
} }
if let Some(name) = matches.value_of("show") {
match justfile.get(name) {
Some(recipe) => {
warn!("{}", recipe);
std::process::exit(0);
}
None => die!("justfile contains no recipe \"{}\"", name)
}
}
let names = if let Some(names) = matches.values_of("recipe") { let names = if let Some(names) = matches.values_of("recipe") {
names.collect::<Vec<_>>() names.collect::<Vec<_>>()
} else if let Some(name) = justfile.first() { } else if let Some(name) = justfile.first() {