diff --git a/README.adoc b/README.adoc index 2aeb392a..d7e53ba7 100644 --- a/README.adoc +++ b/README.adoc @@ -622,6 +622,22 @@ script: ./{{justfile_directory()}}/scripts/some_script ``` +==== Just Executable + +- `just_executable()` - Absolute path to the just executable. + +For example: + +```make +executable: + @echo The executable is at: {{just_executable()}} +``` + +``` +$ just +The executable is at: /bin/just +``` + ==== Dotenv Integration `just` will load environment variables from a file named `.env`. This file can be located in the same directory as your justfile or in a parent directory. These variables are environment variables, not `just` variables, and so must be accessed using `$VARIABLE_NAME` in recipes and backticks. diff --git a/src/function.rs b/src/function.rs index dffb3a51..3faed59c 100644 --- a/src/function.rs +++ b/src/function.rs @@ -18,6 +18,7 @@ lazy_static! { ("invocation_directory", Nullary(invocation_directory)), ("env_var", Unary(env_var)), ("env_var_or_default", Binary(env_var_or_default)), + ("just_executable", Nullary(just_executable)), ] .into_iter() .collect(); @@ -123,3 +124,15 @@ fn env_var_or_default( Ok(value) => Ok(value), } } + +fn just_executable(_context: &FunctionContext) -> Result { + let exe_path = + std::env::current_exe().map_err(|e| format!("Error getting current executable: {}", e))?; + + exe_path.to_str().map(str::to_owned).ok_or_else(|| { + format!( + "Executable path is not valid unicode: {}", + exe_path.to_string_lossy() + ) + }) +} diff --git a/tests/misc.rs b/tests/misc.rs index 012fdc48..2e0db25f 100644 --- a/tests/misc.rs +++ b/tests/misc.rs @@ -1203,6 +1203,18 @@ test! { status: EXIT_FAILURE, } +test! { + name: test_just_executable_function, + justfile: " + a: + @printf 'Executable path is: %s\\n' '{{ just_executable() }}' + ", + args: ("a"), + stdout: format!("Executable path is: {}\n", executable_path("just").to_str().unwrap()).as_str(), + stderr: "", + status: EXIT_SUCCESS, +} + test! { name: infallable_command, justfile: r#"