Skip to content

Feat/issue 1698 global quiet #1704

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jan 12, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These enum variants should be sorted.

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
16 changes: 11 additions & 5 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,8 +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 infallible_command = lines.peek().map_or(false, |line| line.is_infallible());
let quiet_line = lines.peek().map_or(false, |line| line.is_quiet());
let infallible_line = lines.peek().map_or(false, |line| line.is_infallible());

let comment_line =
context.settings.ignore_comments && lines.peek().map_or(false, |line| line.is_comment());
Expand Down Expand Up @@ -210,7 +214,7 @@ impl<'src, D> Recipe<'src, D> {

let mut command = evaluated.as_str();

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

command = &command[sigils..];

Expand All @@ -220,7 +224,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 Expand Up @@ -257,7 +263,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 && !infallible_command {
if code != 0 && !infallible_line {
return Err(Error::Code {
recipe: self.name(),
line_number: Some(line_number),
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