|
|
@ -1,5 +1,6 @@
|
|
|
|
use std::{
|
|
|
|
use std::{
|
|
|
|
collections::HashSet,
|
|
|
|
collections::HashSet,
|
|
|
|
|
|
|
|
io,
|
|
|
|
path::{Path, PathBuf},
|
|
|
|
path::{Path, PathBuf},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -7,7 +8,7 @@ use tokio::fs::{self, DirEntry};
|
|
|
|
|
|
|
|
|
|
|
|
use crate::{consts::BIN_DIR, repository::node_path::NodePath};
|
|
|
|
use crate::{consts::BIN_DIR, repository::node_path::NodePath};
|
|
|
|
|
|
|
|
|
|
|
|
use super::error::MapperResult;
|
|
|
|
use super::error::{MapperError, MapperResult};
|
|
|
|
|
|
|
|
|
|
|
|
struct NodeApp {
|
|
|
|
struct NodeApp {
|
|
|
|
info: DirEntry,
|
|
|
|
info: DirEntry,
|
|
|
@ -30,11 +31,13 @@ impl NodeApp {
|
|
|
|
/// creates wrappers to map this application
|
|
|
|
/// creates wrappers to map this application
|
|
|
|
pub async fn map_executable(&self) -> MapperResult<()> {
|
|
|
|
pub async fn map_executable(&self) -> MapperResult<()> {
|
|
|
|
let src_path = BIN_DIR.join(self.info.file_name());
|
|
|
|
let src_path = BIN_DIR.join(self.info.file_name());
|
|
|
|
self.write_wrapper_script(&src_path).await
|
|
|
|
self.write_wrapper_script(&src_path)
|
|
|
|
|
|
|
|
.await
|
|
|
|
|
|
|
|
.map_err(|err| MapperError::DirMapping { src: src_path, err })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(not(target_os = "windows"))]
|
|
|
|
#[cfg(not(target_os = "windows"))]
|
|
|
|
async fn write_wrapper_script(&self, path: &Path) -> MapperResult<()> {
|
|
|
|
async fn write_wrapper_script(&self, path: &Path) -> Result<(), io::Error> {
|
|
|
|
fs::write(path, format!("#!/bin/sh\nnenv exec {} \"$@\"", self.name)).await?;
|
|
|
|
fs::write(path, format!("#!/bin/sh\nnenv exec {} \"$@\"", self.name)).await?;
|
|
|
|
let src_metadata = self.info.metadata().await?;
|
|
|
|
let src_metadata = self.info.metadata().await?;
|
|
|
|
fs::set_permissions(&path, src_metadata.permissions()).await?;
|
|
|
|
fs::set_permissions(&path, src_metadata.permissions()).await?;
|
|
|
@ -43,7 +46,7 @@ impl NodeApp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(target_os = "windows")]
|
|
|
|
#[cfg(target_os = "windows")]
|
|
|
|
async fn write_wrapper_script(&self, path: &Path) -> MapperResult<()> {
|
|
|
|
async fn write_wrapper_script(&self, path: &Path) -> Result<(), io::Error> {
|
|
|
|
fs::write(
|
|
|
|
fs::write(
|
|
|
|
path.with_extension("bat"),
|
|
|
|
path.with_extension("bat"),
|
|
|
|
format!("nenv exec {} %*", self.name),
|
|
|
|
format!("nenv exec {} %*", self.name),
|
|
|
@ -74,7 +77,12 @@ pub async fn map_node_bin(node_path: NodePath) -> MapperResult<()> {
|
|
|
|
|
|
|
|
|
|
|
|
async fn get_applications(path: &PathBuf) -> MapperResult<Vec<NodeApp>> {
|
|
|
|
async fn get_applications(path: &PathBuf) -> MapperResult<Vec<NodeApp>> {
|
|
|
|
let mut files = Vec::new();
|
|
|
|
let mut files = Vec::new();
|
|
|
|
let mut iter = fs::read_dir(path).await?;
|
|
|
|
let mut iter = fs::read_dir(path)
|
|
|
|
|
|
|
|
.await
|
|
|
|
|
|
|
|
.map_err(|err| MapperError::DirMapping {
|
|
|
|
|
|
|
|
src: path.to_owned(),
|
|
|
|
|
|
|
|
err,
|
|
|
|
|
|
|
|
})?;
|
|
|
|
|
|
|
|
|
|
|
|
while let Some(entry) = iter.next_entry().await? {
|
|
|
|
while let Some(entry) = iter.next_entry().await? {
|
|
|
|
if entry.path().is_file() {
|
|
|
|
if entry.path().is_file() {
|
|
|
|