Skip to content

Commit

Permalink
Quiet Recipes
Browse files Browse the repository at this point in the history
This commit brings the concept of globally quiet recipes to the
Justfile. If the justfile has this setting:

set quiet

With this (implicitly true) setting, every recipe within the Justfile
will be quiet - unless the recipe has the (new) attribute of
[no-quiet].

closes #1698

-=david=-
  • Loading branch information
dharrigan committed Jan 12, 2024
1 parent 53cea2f commit fc22352
Show file tree
Hide file tree
Showing 11 changed files with 201 additions and 3 deletions.
1 change: 1 addition & 0 deletions GRAMMAR.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ setting : 'set' 'allow-duplicate-recipes' boolean?
| 'set' 'fallback' boolean?
| 'set' 'ignore-comments' boolean?
| 'set' 'positional-arguments' boolean?
| 'set' 'quiet' boolean?
| 'set' 'shell' ':=' '[' string (',' string)* ','? ']'
| 'set' 'tempdir ':=' string
| 'set' 'windows-powershell' boolean?
Expand Down
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1460,6 +1460,7 @@ Recipes may be annotated with attributes that change their behavior.
| `[macos]`<sup>1.8.0</sup> | Enable recipe on MacOS. |
| `[no-cd]`<sup>1.9.0</sup> | Don't change directory before executing recipe. |
| `[no-exit-message]`<sup>1.7.0</sup> | Don't print an error message if recipe fails. |
| `[no-quiet]`<sup>?</sup> | Override globally quiet recipes and always echo out the recipe. |
| `[private]`<sup>1.10.0</sup> | See [Private Recipes](#private-recipes). |
| `[unix]`<sup>1.8.0</sup> | Enable recipe on Unixes. (Includes MacOS). |
| `[windows]`<sup>1.8.0</sup> | Enable recipe on Windows. |
Expand Down Expand Up @@ -2496,6 +2497,31 @@ goodbye
# all done!
```

All recipes in a Justfile can be made quiet with `set quiet`:

```just
set quiet
foo:
echo "This is quiet"
@foo2:
echo "This is also quiet"
```

If the recipe has `[no-quiet]`, then the setting is ignored:

```just
set quiet
foo:
echo "This is quiet"
[no-quiet]
foo2:
echo "This is not quiet"
```

Shebang recipes are quiet by default:

```just
Expand Down
1 change: 1 addition & 0 deletions src/attribute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ pub(crate) enum Attribute {
NoCd,
NoExitMessage,
Private,
NoQuiet,
Unix,
Windows,
}
Expand Down
1 change: 1 addition & 0 deletions src/keyword.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pub(crate) enum Keyword {
Import,
Mod,
PositionalArguments,
Quiet,
Set,
Shell,
Tempdir,
Expand Down
1 change: 1 addition & 0 deletions src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ impl<'src> Node<'src> for Set<'src> {
| Setting::Export(value)
| Setting::Fallback(value)
| Setting::PositionalArguments(value)
| Setting::Quiet(value)
| Setting::WindowsPowerShell(value)
| Setting::IgnoreComments(value) => {
set.push_mut(value.to_string());
Expand Down
19 changes: 19 additions & 0 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,7 @@ impl<'run, 'src> Parser<'run, 'src> {
Keyword::Fallback => Some(Setting::Fallback(self.parse_set_bool()?)),
Keyword::IgnoreComments => Some(Setting::IgnoreComments(self.parse_set_bool()?)),
Keyword::PositionalArguments => Some(Setting::PositionalArguments(self.parse_set_bool()?)),
Keyword::Quiet => Some(Setting::Quiet(self.parse_set_bool()?)),
Keyword::WindowsPowershell => Some(Setting::WindowsPowerShell(self.parse_set_bool()?)),
_ => None,
};
Expand Down Expand Up @@ -1927,6 +1928,24 @@ mod tests {
tree: (justfile (set positional_arguments true)),
}

test! {
name: set_quiet_implicit,
text: "set quiet",
tree: (justfile (set quiet true)),
}

test! {
name: set_quiet_true,
text: "set quiet := true",
tree: (justfile (set quiet true)),
}

test! {
name: set_quiet_false,
text: "set quiet := false",
tree: (justfile (set quiet false)),
}

test! {
name: set_positional_arguments_false,
text: "set positional-arguments := false",
Expand Down
17 changes: 14 additions & 3 deletions src/recipe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ impl<'src, D> Recipe<'src, D> {
}
}

fn no_quiet(&self) -> bool {
self.attributes.contains(&Attribute::NoQuiet)
}

pub(crate) fn run<'run>(
&self,
context: &RecipeContext<'src, 'run>,
Expand Down Expand Up @@ -181,7 +185,8 @@ impl<'src, D> Recipe<'src, D> {
}
let mut evaluated = String::new();
let mut continued = false;
let quiet_command = lines.peek().map_or(false, |line| line.is_quiet());
let quiet_command = self.no_quiet() && context.settings.quiet;
let quiet_line = lines.peek().map_or(false, |line| line.is_quiet());
let infallible_command = lines.peek().map_or(false, |line| line.is_infallible());

let comment_line =
Expand Down Expand Up @@ -210,7 +215,11 @@ impl<'src, D> Recipe<'src, D> {

let mut command = evaluated.as_str();

let sigils = usize::from(infallible_command) + usize::from(quiet_command);
if quiet_command && !context.settings.quiet {
command = &command[1..];
}

let sigils = usize::from(infallible_command) + usize::from(quiet_line);

command = &command[sigils..];

Expand All @@ -220,7 +229,9 @@ impl<'src, D> Recipe<'src, D> {

if config.dry_run
|| config.verbosity.loquacious()
|| !((quiet_command ^ self.quiet) || config.verbosity.quiet())
|| !((quiet_line ^ self.quiet)
|| (context.settings.quiet && !self.no_quiet())
|| config.verbosity.quiet())
{
let color = if config.highlight {
config.color.command(config.command_color)
Expand Down
2 changes: 2 additions & 0 deletions src/setting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ pub(crate) enum Setting<'src> {
Fallback(bool),
IgnoreComments(bool),
PositionalArguments(bool),
Quiet(bool),
Shell(Shell<'src>),
Tempdir(String),
WindowsPowerShell(bool),
Expand All @@ -25,6 +26,7 @@ impl<'src> Display for Setting<'src> {
| Setting::Fallback(value)
| Setting::IgnoreComments(value)
| Setting::PositionalArguments(value)
| Setting::Quiet(value)
| Setting::WindowsPowerShell(value) => write!(f, "{value}"),
Setting::Shell(shell) | Setting::WindowsShell(shell) => write!(f, "{shell}"),
Setting::DotenvFilename(value) | Setting::DotenvPath(value) | Setting::Tempdir(value) => {
Expand Down
4 changes: 4 additions & 0 deletions src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub(crate) struct Settings<'src> {
pub(crate) fallback: bool,
pub(crate) ignore_comments: bool,
pub(crate) positional_arguments: bool,
pub(crate) quiet: bool,
pub(crate) shell: Option<Shell<'src>>,
pub(crate) tempdir: Option<String>,
pub(crate) windows_powershell: bool,
Expand Down Expand Up @@ -51,6 +52,9 @@ impl<'src> Settings<'src> {
Setting::PositionalArguments(positional_arguments) => {
settings.positional_arguments = positional_arguments;
}
Setting::Quiet(quiet) => {
settings.quiet = quiet;
}
Setting::Shell(shell) => {
settings.shell = Some(shell);
}
Expand Down
19 changes: 19 additions & 0 deletions tests/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ fn alias() {
"export": false,
"fallback": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"ignore_comments": false,
Expand Down Expand Up @@ -86,6 +87,7 @@ fn assignment() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -136,6 +138,7 @@ fn body() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -198,6 +201,7 @@ fn dependencies() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -297,6 +301,7 @@ fn dependency_argument() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -359,6 +364,7 @@ fn duplicate_recipes() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -402,6 +408,7 @@ fn doc_comment() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -431,6 +438,7 @@ fn empty_justfile() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -581,6 +589,7 @@ fn parameters() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -664,6 +673,7 @@ fn priors() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -707,6 +717,7 @@ fn private() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand Down Expand Up @@ -750,6 +761,7 @@ fn quiet() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"windows_powershell": false,
Expand All @@ -770,6 +782,7 @@ fn settings() {
set export
set fallback
set positional-arguments
set quiet
set ignore-comments
set shell := ['a', 'b', 'c']
foo:
Expand Down Expand Up @@ -804,6 +817,7 @@ fn settings() {
"fallback": true,
"ignore_comments": true,
"positional_arguments": true,
"quiet": true,
"shell": {
"arguments": ["b", "c"],
"command": "a",
Expand Down Expand Up @@ -853,6 +867,7 @@ fn shebang() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir": null,
"windows_powershell": false,
Expand Down Expand Up @@ -896,6 +911,7 @@ fn simple() {
"fallback": false,
"ignore_comments": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir": null,
"windows_powershell": false,
Expand Down Expand Up @@ -941,6 +957,7 @@ fn attribute() {
"export": false,
"fallback": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"ignore_comments": false,
Expand Down Expand Up @@ -1000,6 +1017,7 @@ fn module() {
"export": false,
"fallback": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"ignore_comments": false,
Expand All @@ -1018,6 +1036,7 @@ fn module() {
"export": false,
"fallback": false,
"positional_arguments": false,
"quiet": false,
"shell": null,
"tempdir" : null,
"ignore_comments": false,
Expand Down
Loading

0 comments on commit fc22352

Please sign in to comment.