[WINDOWS] Add bin folder in path
This commit is contained in:
parent
bb6d50d76c
commit
98564956ac
9 changed files with 101 additions and 13 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -46,6 +46,7 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"structopt",
|
"structopt",
|
||||||
"tar",
|
"tar",
|
||||||
|
"winreg 0.9.0",
|
||||||
"zip",
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -770,7 +771,7 @@ dependencies = [
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
"wasm-bindgen-futures",
|
"wasm-bindgen-futures",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"winreg",
|
"winreg 0.7.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1251,6 +1252,15 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winreg"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "16cdb3898397cf7f624c294948669beafaeebc5577d5ec53d0afb76633593597"
|
||||||
|
dependencies = [
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xattr"
|
name = "xattr"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
|
|
|
@ -15,3 +15,6 @@ zip = "0.5"
|
||||||
tar = "0.4"
|
tar = "0.4"
|
||||||
flate2 = "1.0"
|
flate2 = "1.0"
|
||||||
dirs = "3.0"
|
dirs = "3.0"
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
winreg = "0.9"
|
|
@ -4,8 +4,6 @@ use crate::common::utils::downloader;
|
||||||
use crate::common::utils::extractor;
|
use crate::common::utils::extractor;
|
||||||
use crate::common::utils::installer;
|
use crate::common::utils::installer;
|
||||||
|
|
||||||
// use std::process::Command;
|
|
||||||
|
|
||||||
pub fn install() -> Result<(), String> {
|
pub fn install() -> Result<(), String> {
|
||||||
println!("Installing FVM");
|
println!("Installing FVM");
|
||||||
|
|
||||||
|
|
19
src/common/utils/configure/mod.rs
Normal file
19
src/common/utils/configure/mod.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
mod windows;
|
||||||
|
|
||||||
|
pub fn configure() -> Result<(), String> {
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
windows::configure().ok_or(format!("Failed to configure environment"))?;
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
#[cfg(not(target_os = "linux"))]
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
{
|
||||||
|
Err(format!("OS not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||||
|
{
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
45
src/common/utils/configure/windows/env.rs
Normal file
45
src/common/utils/configure/windows/env.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
use winreg::RegKey;
|
||||||
|
use winreg::enums::*;
|
||||||
|
use crate::common::utils::installer;
|
||||||
|
|
||||||
|
pub enum ConfigEnvMode {
|
||||||
|
ADD,
|
||||||
|
REMOVE
|
||||||
|
}
|
||||||
|
|
||||||
|
fn env_exist(path_env: &str, binary_folder: &str) -> bool {
|
||||||
|
for env in path_env.split(';') {
|
||||||
|
if env == binary_folder {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn configure_env(mode: ConfigEnvMode) -> Option<()> {
|
||||||
|
let hklm = RegKey::predef(HKEY_CURRENT_USER);
|
||||||
|
let environment = hklm.open_subkey_with_flags("Environment", KEY_READ | KEY_WRITE).ok()?;
|
||||||
|
let mut reg_value : String = environment.get_value("PATH").ok()?;
|
||||||
|
let binary_folder_path = installer::get_install_dir(installer::InstallType::Command).ok()?;
|
||||||
|
let binary_folder_str = binary_folder_path.to_str()?;
|
||||||
|
|
||||||
|
match mode {
|
||||||
|
ConfigEnvMode::ADD => {
|
||||||
|
if !env_exist(reg_value.as_str(), binary_folder_str) {
|
||||||
|
reg_value.push_str(format!(";{}", binary_folder_str).as_str()); // Add binary folder to path
|
||||||
|
environment.set_value("PATH", ®_value).ok()?;
|
||||||
|
println!("[INFO] Folder {} added to PATH", binary_folder_str);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ConfigEnvMode::REMOVE => {
|
||||||
|
if env_exist(reg_value.as_str(), binary_folder_str) {
|
||||||
|
let new_value = reg_value.replace(format!(";{}", binary_folder_str).as_str(), ""); // Remove binary folder to path
|
||||||
|
environment.set_value("PATH", &new_value).ok()?;
|
||||||
|
println!("[INFO] Folder {} removed to PATH", binary_folder_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(())
|
||||||
|
}
|
7
src/common/utils/configure/windows/mod.rs
Normal file
7
src/common/utils/configure/windows/mod.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
mod env;
|
||||||
|
|
||||||
|
pub fn configure() -> Option<()> {
|
||||||
|
env::configure_env(env::ConfigEnvMode::ADD)?;
|
||||||
|
|
||||||
|
Some(())
|
||||||
|
}
|
|
@ -6,11 +6,16 @@ pub enum InstallType {
|
||||||
Config
|
Config
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_install_dir() -> Result<PathBuf, String> {
|
pub fn get_install_dir(install_type: InstallType) -> Result<PathBuf, String> {
|
||||||
let home_dir = dirs::home_dir()
|
let home_dir = dirs::home_dir()
|
||||||
.ok_or(format!("Failed to get home_directory"))?;
|
.ok_or(format!("Failed to get home_directory"))?;
|
||||||
|
|
||||||
Ok(home_dir.join(super::super::INSTALL_FOLDER))
|
let subfolder = match install_type {
|
||||||
|
InstallType::Command => "bin",
|
||||||
|
InstallType::Config => "configs"
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(home_dir.join(super::super::INSTALL_FOLDER).join(subfolder))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {
|
fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {
|
||||||
|
@ -30,12 +35,7 @@ fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()>
|
||||||
pub fn install(source_path: &str, install_type: InstallType) -> Option <()> {
|
pub fn install(source_path: &str, install_type: InstallType) -> Option <()> {
|
||||||
let source_folder = std::path::Path::new(super::super::TEMP_FOLDER).join(source_path);
|
let source_folder = std::path::Path::new(super::super::TEMP_FOLDER).join(source_path);
|
||||||
|
|
||||||
let subfolder = match install_type {
|
let install_folder = get_install_dir(install_type).ok()?;
|
||||||
InstallType::Command => "bin",
|
|
||||||
InstallType::Config => "configs"
|
|
||||||
};
|
|
||||||
|
|
||||||
let install_folder = get_install_dir().ok()?.join(subfolder);
|
|
||||||
copy_dir_all(source_folder, install_folder).ok()?;
|
copy_dir_all(source_folder, install_folder).ok()?;
|
||||||
Some(())
|
Some(())
|
||||||
}
|
}
|
|
@ -2,3 +2,4 @@ pub mod downloader;
|
||||||
pub mod extractor;
|
pub mod extractor;
|
||||||
pub mod git;
|
pub mod git;
|
||||||
pub mod installer;
|
pub mod installer;
|
||||||
|
pub mod configure;
|
|
@ -10,6 +10,11 @@ mod macos;
|
||||||
pub mod common;
|
pub mod common;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
if let Err(err) = common::utils::configure::configure() {
|
||||||
|
eprintln!("[ERROR] {}", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
windows::start();
|
windows::start();
|
||||||
|
|
||||||
|
|
Reference in a new issue