mirror of
https://github.com/pesde-pkg/pesde.git
synced 2024-12-12 11:00:36 +00:00
feat: support toolchain managers in scripts
This commit is contained in:
parent
08e808b4b9
commit
6442030f93
6 changed files with 63 additions and 33 deletions
|
@ -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};
|
||||
|
||||
|
@ -49,8 +49,19 @@ fn bin_link_file(alias: &str) -> String {
|
|||
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)
|
||||
|
|
|
@ -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| {
|
||||
|
|
45
src/main.rs
45
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()),
|
||||
|
|
|
@ -203,7 +203,7 @@ impl Project {
|
|||
.cloned()
|
||||
else {
|
||||
return Err(Box::new(errors::DependencyGraphError::NoMatchingVersion(
|
||||
format!("{specifier} ({})", manifest.target.kind()),
|
||||
format!("{specifier} ({target})"),
|
||||
)));
|
||||
};
|
||||
|
||||
|
|
|
@ -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<A: IntoIterator<Item = S>, S: AsRef<OsStr>, P: AsRef<Path>>(
|
||||
pub(crate) fn execute_script<A: IntoIterator<Item = S>, S: AsRef<OsStr>>(
|
||||
script_name: ScriptName,
|
||||
script_path: &Path,
|
||||
args: A,
|
||||
cwd: P,
|
||||
project: &Project,
|
||||
return_stdout: bool,
|
||||
) -> Result<Option<String>, std::io::Error> {
|
||||
match Command::new("lune")
|
||||
|
@ -41,7 +42,7 @@ pub(crate) fn execute_script<A: IntoIterator<Item = S>, S: AsRef<OsStr>, 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())
|
||||
|
|
|
@ -19,7 +19,7 @@ struct SourcemapNode {
|
|||
|
||||
pub(crate) fn find_lib_path(
|
||||
project: &Project,
|
||||
cwd: &Path,
|
||||
package_dir: &Path,
|
||||
) -> Result<Option<RelativePathBuf>, 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()
|
||||
|
|
Loading…
Reference in a new issue