diff --git a/src/cli/commands/install.rs b/src/cli/commands/install.rs index f07d1f2..ab008d8 100644 --- a/src/cli/commands/install.rs +++ b/src/cli/commands/install.rs @@ -8,7 +8,7 @@ use anyhow::Context; use clap::Args; use indicatif::MultiProgress; -use pesde::{lockfile::Lockfile, manifest::target::TargetKind, Project}; +use pesde::{lockfile::Lockfile, manifest::target::TargetKind, Project, MANIFEST_FILE_NAME}; use crate::cli::{bin_dir, files::make_executable, IsUpToDate}; @@ -48,9 +48,20 @@ fn bin_link_file(alias: &str) -> String { format!( r#"{prefix}local process = require("@lune/process") local fs = require("@lune/fs") - + +local project_root = process.cwd +local path_components = string.split(string.gsub(project_root, "\\", "/"), "/") + +for i = #path_components, 1, -1 do + local path = table.concat(path_components, "/", 1, i) + if fs.isFile(path .. "/{MANIFEST_FILE_NAME}") then + project_root = path + break + end +end + for _, packages_folder in {{ {all_folders} }} do - local path = `{{process.cwd}}/{{packages_folder}}/{alias}.bin.luau` + local path = `{{project_root}}/{{packages_folder}}/{alias}.bin.luau` if fs.isFile(path) then require(path) diff --git a/src/linking/mod.rs b/src/linking/mod.rs index 0368950..12ab1f8 100644 --- a/src/linking/mod.rs +++ b/src/linking/mod.rs @@ -1,9 +1,3 @@ -use std::{ - collections::BTreeMap, - fs::create_dir_all, - path::{Path, PathBuf}, -}; - use crate::{ linking::generator::get_file_types, lockfile::DownloadedGraph, @@ -13,6 +7,12 @@ use crate::{ source::{fs::store_in_cas, traits::PackageRef, version_id::VersionId}, Project, LINK_LIB_NO_FILE_FOUND, PACKAGES_CONTAINER_NAME, }; +use std::{ + collections::BTreeMap, + ffi::OsStr, + fs::create_dir_all, + path::{Path, PathBuf}, +}; /// Generates linking modules for a project pub mod generator; @@ -100,8 +100,9 @@ impl Project { execute_script( ScriptName::RobloxSyncConfigGenerator, &script_path.to_path(self.path()), - build_files, - &container_folder, + std::iter::once(container_folder.as_os_str()) + .chain(build_files.iter().map(OsStr::new)), + self, false, ) .map_err(|e| { diff --git a/src/main.rs b/src/main.rs index 9fb3cd6..67d32d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,13 @@ +use std::{fs::create_dir_all, path::PathBuf}; + +use anyhow::Context; +use clap::Parser; +use colored::Colorize; +use indicatif::MultiProgress; +use indicatif_log_bridge::LogWrapper; + +use pesde::{AuthConfig, Project, MANIFEST_FILE_NAME}; + use crate::cli::{ auth::get_token, home_dir, @@ -5,13 +15,6 @@ use crate::cli::{ version::{check_for_updates, current_version, get_or_download_version, max_installed_version}, HOME_DIR, }; -use anyhow::Context; -use clap::Parser; -use colored::Colorize; -use indicatif::MultiProgress; -use indicatif_log_bridge::LogWrapper; -use pesde::{AuthConfig, Project}; -use std::{fs::create_dir_all, path::PathBuf}; mod cli; pub mod util; @@ -62,14 +65,30 @@ fn get_root(path: &std::path::Path) -> PathBuf { } fn run() -> anyhow::Result<()> { + let cwd = std::env::current_dir().expect("failed to get current working directory"); + let project_root_dir = 'finder: { + let mut project_root = cwd.clone(); + + while project_root.components().count() > 1 { + if project_root.join(MANIFEST_FILE_NAME).exists() { + break 'finder project_root; + } + + project_root = project_root.parent().unwrap().to_path_buf(); + } + + cwd.clone() + }; + #[cfg(windows)] 'scripts: { let exe = std::env::current_exe().expect("failed to get current executable path"); if exe.parent().is_some_and(|parent| { - parent.as_os_str() != "bin" + parent.file_name().is_some_and(|parent| parent != "bin") || parent .parent() - .is_some_and(|parent| parent.as_os_str() != HOME_DIR) + .and_then(|parent| parent.file_name()) + .is_some_and(|parent| parent != HOME_DIR) }) { break 'scripts; } @@ -85,7 +104,7 @@ fn run() -> anyhow::Result<()> { .arg("run") .arg(exe.with_extension("luau")) .args(std::env::args_os().skip(1)) - .current_dir(std::env::current_dir().unwrap()) + .current_dir(project_root_dir) .status() .expect("failed to run lune"); @@ -103,8 +122,6 @@ fn run() -> anyhow::Result<()> { multi }; - let cwd = std::env::current_dir().expect("failed to get current working directory"); - let data_dir = home_dir()?.join("data"); create_dir_all(&data_dir).expect("failed to create data directory"); @@ -112,7 +129,7 @@ fn run() -> anyhow::Result<()> { let home_cas_dir = data_dir.join("cas"); create_dir_all(&home_cas_dir).expect("failed to create cas directory"); - let project_root = get_root(&cwd); + let project_root = get_root(&project_root_dir); let cas_dir = if get_root(&home_cas_dir) == project_root { home_cas_dir } else { @@ -120,7 +137,7 @@ fn run() -> anyhow::Result<()> { }; let project = Project::new( - cwd, + project_root_dir, data_dir, cas_dir, AuthConfig::new().with_github_token(token.as_ref()), diff --git a/src/resolver.rs b/src/resolver.rs index ccb3787..e463ea9 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -203,7 +203,7 @@ impl Project { .cloned() else { return Err(Box::new(errors::DependencyGraphError::NoMatchingVersion( - format!("{specifier} ({})", manifest.target.kind()), + format!("{specifier} ({target})"), ))); }; diff --git a/src/scripts.rs b/src/scripts.rs index 8991d5b..8e80c47 100644 --- a/src/scripts.rs +++ b/src/scripts.rs @@ -1,3 +1,4 @@ +use crate::Project; use std::{ ffi::OsStr, fmt::{Display, Formatter}, @@ -29,11 +30,11 @@ impl Display for ScriptName { } } -pub(crate) fn execute_script, S: AsRef, P: AsRef>( +pub(crate) fn execute_script, S: AsRef>( script_name: ScriptName, script_path: &Path, args: A, - cwd: P, + project: &Project, return_stdout: bool, ) -> Result, std::io::Error> { match Command::new("lune") @@ -41,7 +42,7 @@ pub(crate) fn execute_script, S: AsRef, P: AsRe .arg(script_path.as_os_str()) .arg("--") .args(args) - .current_dir(cwd) + .current_dir(project.path()) .stdin(Stdio::inherit()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) diff --git a/src/source/wally/compat_util.rs b/src/source/wally/compat_util.rs index 40d9f7f..926f1a1 100644 --- a/src/source/wally/compat_util.rs +++ b/src/source/wally/compat_util.rs @@ -19,7 +19,7 @@ struct SourcemapNode { pub(crate) fn find_lib_path( project: &Project, - cwd: &Path, + package_dir: &Path, ) -> Result, errors::FindLibPathError> { let manifest = project.deser_manifest()?; @@ -34,12 +34,12 @@ pub(crate) fn find_lib_path( let result = execute_script( ScriptName::SourcemapGenerator, &script_path.to_path(&project.path), - ["--wally"], - cwd, + [package_dir], + project, true, )?; - if let Some(result) = result { + if let Some(result) = result.filter(|result| !result.is_empty()) { let node: SourcemapNode = serde_json::from_str(&result)?; Ok(node.file_paths.into_iter().find(|path| { path.extension()