mirror of
https://github.com/casey/just.git
synced 2024-11-27 09:15:08 +03:00
e80bf34d9a
Add a `set SETTING := VALUE` construct. This construct is intended to be extended as needed with new settings, but for now we're starting with `set shell := [COMMAND, ARG1, ...]`, which allows setting the shell to use for recipe and backtick execution in a justfile. One of the primary reasons for adding this feature is to have a better story on windows, where users are forced to scrounge up an `sh` binary if they want to use `just`. This should allow them to use cmd.exe or powershell in their justfiles, making just optionally dependency-free.
101 lines
1.9 KiB
Rust
101 lines
1.9 KiB
Rust
use std::{process::Command, str};
|
|
|
|
use executable_path::executable_path;
|
|
|
|
use test_utilities::{assert_stdout, tmptree};
|
|
|
|
const JUSTFILE: &str = "
|
|
expression := `EXPRESSION`
|
|
|
|
recipe default=`DEFAULT`:
|
|
{{expression}}
|
|
{{default}}
|
|
RECIPE
|
|
";
|
|
|
|
/// Test that --shell correctly sets the shell
|
|
#[test]
|
|
#[cfg_attr(windows, ignore)]
|
|
fn flag() {
|
|
let tmp = tmptree! {
|
|
justfile: JUSTFILE,
|
|
shell: "#!/usr/bin/env bash\necho \"$@\"",
|
|
};
|
|
|
|
let shell = tmp.path().join("shell");
|
|
|
|
#[cfg(not(windows))]
|
|
{
|
|
let permissions = std::os::unix::fs::PermissionsExt::from_mode(0o700);
|
|
std::fs::set_permissions(&shell, permissions).unwrap();
|
|
}
|
|
|
|
let output = Command::new(executable_path("just"))
|
|
.current_dir(tmp.path())
|
|
.arg("--shell")
|
|
.arg(shell)
|
|
.output()
|
|
.unwrap();
|
|
|
|
let stdout = "-cu -cu EXPRESSION\n-cu -cu DEFAULT\n-cu RECIPE\n";
|
|
assert_stdout(&output, stdout);
|
|
}
|
|
|
|
const JUSTFILE_CMD: &str = r#"
|
|
|
|
set shell := ["cmd.exe", "/C"]
|
|
|
|
x := `Echo`
|
|
|
|
recipe:
|
|
REM foo
|
|
Echo "{{x}}"
|
|
"#;
|
|
|
|
/// Test that we can use `set shell` to use cmd.exe on windows
|
|
#[test]
|
|
#[cfg_attr(unix, ignore)]
|
|
fn cmd() {
|
|
let tmp = tmptree! {
|
|
justfile: JUSTFILE_CMD,
|
|
};
|
|
|
|
let output = Command::new(executable_path("just"))
|
|
.current_dir(tmp.path())
|
|
.output()
|
|
.unwrap();
|
|
|
|
let stdout = "\\\"ECHO is on.\\\"\r\n";
|
|
|
|
assert_stdout(&output, stdout);
|
|
}
|
|
|
|
const JUSTFILE_POWERSHELL: &str = r#"
|
|
|
|
set shell := ["powershell.exe", "-c"]
|
|
|
|
x := `Write-Host "Hello, world!"`
|
|
|
|
recipe:
|
|
For ($i=0; $i -le 10; $i++) { Write-Host $i }
|
|
Write-Host "{{x}}"
|
|
"#;
|
|
|
|
/// Test that we can use `set shell` to use cmd.exe on windows
|
|
#[test]
|
|
#[cfg_attr(unix, ignore)]
|
|
fn powershell() {
|
|
let tmp = tmptree! {
|
|
justfile: JUSTFILE_POWERSHELL,
|
|
};
|
|
|
|
let output = Command::new(executable_path("just"))
|
|
.current_dir(tmp.path())
|
|
.output()
|
|
.unwrap();
|
|
|
|
let stdout = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\nHello, world!\n";
|
|
|
|
assert_stdout(&output, stdout);
|
|
}
|