mirror of
https://github.com/lune-org/lune.git
synced 2024-12-12 13:00:37 +00:00
Implement home dir script discovery
This commit is contained in:
parent
933cfa84c0
commit
c063230f4c
2 changed files with 42 additions and 8 deletions
|
@ -47,6 +47,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Added automatic decompression for compressed responses when using `net.request`.
|
- Added automatic decompression for compressed responses when using `net.request`.
|
||||||
This behavior can be disabled by passing `options = { decompress = false }` in request params.
|
This behavior can be disabled by passing `options = { decompress = false }` in request params.
|
||||||
|
|
||||||
|
- Added support for finding scripts in the current home directory.
|
||||||
|
This means that if you have a script called `script-name.luau`, you can place it in the following location:
|
||||||
|
|
||||||
|
- `C:\Users\YourName\.lune\script-name.luau` (Windows)
|
||||||
|
- `/Users/YourName/.lune/script-name.luau` (macOS)
|
||||||
|
- `/home/YourName/.lune/script-name.luau` (Linux)
|
||||||
|
|
||||||
|
And then run it using `lune script-name` from any directory you are currently in.
|
||||||
|
|
||||||
- Added several new instance methods in the `roblox` builtin library:
|
- Added several new instance methods in the `roblox` builtin library:
|
||||||
- [`Instance:AddTag`](https://create.roblox.com/docs/reference/engine/classes/Instance#AddTag)
|
- [`Instance:AddTag`](https://create.roblox.com/docs/reference/engine/classes/Instance#AddTag)
|
||||||
- [`Instance:GetTags`](https://create.roblox.com/docs/reference/engine/classes/Instance#GetTags)
|
- [`Instance:GetTags`](https://create.roblox.com/docs/reference/engine/classes/Instance#GetTags)
|
||||||
|
|
|
@ -3,8 +3,9 @@ use std::{
|
||||||
path::{PathBuf, MAIN_SEPARATOR},
|
path::{PathBuf, MAIN_SEPARATOR},
|
||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, bail, Result};
|
||||||
use console::style;
|
use console::style;
|
||||||
|
use directories::UserDirs;
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
const LUNE_COMMENT_PREFIX: &str = "-->";
|
const LUNE_COMMENT_PREFIX: &str = "-->";
|
||||||
|
@ -42,8 +43,23 @@ static ERR_MESSAGE_HELP_NOTE: Lazy<String> = Lazy::new(|| {
|
||||||
path, and that they then have control over script discovery behavior, whereas if they pass in
|
path, and that they then have control over script discovery behavior, whereas if they pass in
|
||||||
a relative path we will instead try to be as permissive as possible for user-friendliness
|
a relative path we will instead try to be as permissive as possible for user-friendliness
|
||||||
*/
|
*/
|
||||||
pub fn discover_script_file_path(path: &str) -> Result<PathBuf> {
|
pub fn discover_script_file_path(path: &str, in_home_dir: bool) -> Result<PathBuf> {
|
||||||
let file_path = PathBuf::from(path);
|
// NOTE: We don't actually support any platforms without home directories,
|
||||||
|
// but just in case the user has some strange configuration and it cannot
|
||||||
|
// be found we should at least throw a nice error instead of panicking
|
||||||
|
let file_path = if in_home_dir {
|
||||||
|
match UserDirs::new() {
|
||||||
|
Some(dirs) => dirs.home_dir().join(path),
|
||||||
|
None => {
|
||||||
|
bail!(
|
||||||
|
"No file was found at {}\nThe home directory does not exist",
|
||||||
|
style(path).yellow()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PathBuf::from(path)
|
||||||
|
};
|
||||||
// NOTE: We use metadata directly here to try to
|
// NOTE: We use metadata directly here to try to
|
||||||
// avoid accessing the file path more than once
|
// avoid accessing the file path more than once
|
||||||
let file_meta = file_path.metadata();
|
let file_meta = file_path.metadata();
|
||||||
|
@ -112,7 +128,7 @@ pub fn discover_script_file_path(path: &str) -> Result<PathBuf> {
|
||||||
Behavior is otherwise exactly the same as for `discover_script_file_path`.
|
Behavior is otherwise exactly the same as for `discover_script_file_path`.
|
||||||
*/
|
*/
|
||||||
pub fn discover_script_file_path_including_lune_dirs(path: &str) -> Result<PathBuf> {
|
pub fn discover_script_file_path_including_lune_dirs(path: &str) -> Result<PathBuf> {
|
||||||
match discover_script_file_path(path) {
|
match discover_script_file_path(path, false) {
|
||||||
Ok(path) => Ok(path),
|
Ok(path) => Ok(path),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
// If we got any absolute path it means the user has also
|
// If we got any absolute path it means the user has also
|
||||||
|
@ -121,10 +137,19 @@ pub fn discover_script_file_path_including_lune_dirs(path: &str) -> Result<PathB
|
||||||
if PathBuf::from(path).is_absolute() {
|
if PathBuf::from(path).is_absolute() {
|
||||||
return Err(e);
|
return Err(e);
|
||||||
}
|
}
|
||||||
// Otherwise we take a look in either relative lune or .lune directories
|
// Otherwise we take a look in relative lune and .lune
|
||||||
let res_lune = discover_script_file_path(&format!("lune{MAIN_SEPARATOR}{path}"));
|
// directories + the home directory for the current user
|
||||||
let res_dotlune = discover_script_file_path(&format!(".lune{MAIN_SEPARATOR}{path}"));
|
let res = discover_script_file_path(&format!("lune{MAIN_SEPARATOR}{path}"), false)
|
||||||
match res_lune.or(res_dotlune) {
|
.or_else(|_| {
|
||||||
|
discover_script_file_path(&format!(".lune{MAIN_SEPARATOR}{path}"), false)
|
||||||
|
})
|
||||||
|
.or_else(|_| {
|
||||||
|
discover_script_file_path(&format!("lune{MAIN_SEPARATOR}{path}"), true)
|
||||||
|
})
|
||||||
|
.or_else(|_| {
|
||||||
|
discover_script_file_path(&format!(".lune{MAIN_SEPARATOR}{path}"), true)
|
||||||
|
});
|
||||||
|
match res {
|
||||||
// NOTE: The first error message is generally more
|
// NOTE: The first error message is generally more
|
||||||
// descriptive than the ones for the lune subfolders
|
// descriptive than the ones for the lune subfolders
|
||||||
Err(_) => Err(e),
|
Err(_) => Err(e),
|
||||||
|
|
Loading…
Reference in a new issue