Skip to content

Commit

Permalink
Allow Suppressing of Failing Commands with - Prefix
Browse files Browse the repository at this point in the history
Similar to `make` if a command is prefixed with `-` then the exit
status is ignored.

Fix for  casey#660
  • Loading branch information
iwillspeak committed Oct 3, 2020
1 parent 991f42d commit a4973ae
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
7 changes: 7 additions & 0 deletions src/line.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,11 @@ impl<'src> Line<'src> {
_ => false,
}
}

pub(crate) fn is_infallable(&self) -> bool {
match self.fragments.first() {
Some(Fragment::Text { token }) => token.lexeme().starts_with('-'),
_ => false,
}
}
}
8 changes: 6 additions & 2 deletions src/recipe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,10 @@ impl<'src, D> Recipe<'src, D> {
let mut evaluated = String::new();
let mut continued = false;
let quiet_command = lines.peek().map(|line| line.is_quiet()).unwrap_or(false);
let infallable_command = lines
.peek()
.map(|line| line.is_infallable())
.unwrap_or(false);
loop {
if lines.peek().is_none() {
break;
Expand All @@ -226,7 +230,7 @@ impl<'src, D> Recipe<'src, D> {
}
}
let mut command = evaluated.as_str();
if quiet_command {
if quiet_command || infallable_command {
command = &command[1..];
}

Expand Down Expand Up @@ -266,7 +270,7 @@ impl<'src, D> Recipe<'src, D> {
match InterruptHandler::guard(|| cmd.status()) {
Ok(exit_status) =>
if let Some(code) = exit_status.code() {
if code != 0 {
if code != 0 && !infallable_command {
return Err(RuntimeError::Code {
recipe: self.name(),
line_number: Some(line_number),
Expand Down
24 changes: 24 additions & 0 deletions tests/misc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1285,6 +1285,30 @@ test! {
status: EXIT_FAILURE,
}

test! {
name: infallable_command,
justfile: r#"
infallable:
-exit 101
"#,
stderr: "exit 101\n",
status: EXIT_SUCCESS,
}

test! {
name: infallable_with_failing,
justfile: r#"
infallable:
-exit 101
exit 202
"#,
stderr: r#"exit 101
exit 202
error: Recipe `infallable` failed on line 4 with exit code 202
"#,
status: 202,
}

test! {
name: quiet_recipe,
justfile: r#"
Expand Down

0 comments on commit a4973ae

Please sign in to comment.