1
0
Fork 0

Finish FVM package

This commit is contained in:
Florian RICHER (MrDev023) 2021-07-24 20:17:11 +02:00
parent f2bf17fde9
commit 3c390e5396
13 changed files with 178 additions and 28 deletions

31
Cargo.lock generated
View file

@ -38,6 +38,7 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
name = "autoconfig" name = "autoconfig"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"dirs",
"flate2", "flate2",
"reqwest", "reqwest",
"serde", "serde",
@ -151,6 +152,26 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "dirs"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309"
dependencies = [
"dirs-sys",
]
[[package]]
name = "dirs-sys"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780"
dependencies = [
"libc",
"redox_users",
"winapi",
]
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
version = "0.8.28" version = "0.8.28"
@ -699,6 +720,16 @@ dependencies = [
"bitflags", "bitflags",
] ]
[[package]]
name = "redox_users"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
dependencies = [
"getrandom",
"redox_syscall",
]
[[package]] [[package]]
name = "remove_dir_all" name = "remove_dir_all"
version = "0.5.3" version = "0.5.3"

View file

@ -14,3 +14,4 @@ serde_derive = "1.0"
zip = "0.5" zip = "0.5"
tar = "0.4" tar = "0.4"
flate2 = "1.0" flate2 = "1.0"
dirs = "3.0"

View file

@ -2,11 +2,12 @@ mod git;
use crate::common::utils::downloader; use crate::common::utils::downloader;
use crate::common::utils::extractor; use crate::common::utils::extractor;
use crate::common::utils::installer;
// use std::process::Command; // use std::process::Command;
pub fn install() -> Result<(), String> { pub fn install() -> Result<(), String> {
println!("Install FVM"); println!("Installing FVM");
let url = git::get_file_url()?; let url = git::get_file_url()?;
@ -18,15 +19,9 @@ pub fn install() -> Result<(), String> {
extractor::extract_file(&file, "fvm")?; extractor::extract_file(&file, "fvm")?;
println!("{}", url); installer::install("fvm/fvm", installer::InstallType::Command).ok_or(format!("Failed to install"))?;
// let output = Command::new("winget") println!("FVM Installed");
// .args(&[""])
// .output()
// .map_err(|_| format!("Permision refused ! Please run as administrator."))?;
// println!("{}", std::str::from_utf8(&output.stdout).map_err(|_| format!("Internal error"))?);
Ok(()) Ok(())
} }

View file

@ -1,3 +1,5 @@
pub static TEMP_FOLDER: &str = "temp"; pub static TEMP_FOLDER: &str = "temp";
pub static INSTALL_FOLDER: &str = ".autoconfig";
pub mod utils; pub mod utils;
pub mod fvm;

View file

@ -6,13 +6,7 @@ use std::{fs::{
pub fn extract_file(path: &PathBuf, outdir: &str) -> Option<()> { pub fn extract_file(path: &PathBuf, outdir: &str) -> Option<()> {
let file = File::open(&path).ok()?; let file = File::open(&path).ok()?;
let mut archive = match zip::ZipArchive::new(file) { let mut archive = zip::ZipArchive::new(file).ok()?;
Ok(archive) => archive,
Err(err) => {
println!("[ERROR][EXTRACTOR] {}", err);
return None
}
};
let path = path::Path::new(common::TEMP_FOLDER).join(outdir); let path = path::Path::new(common::TEMP_FOLDER).join(outdir);
@ -22,15 +16,8 @@ pub fn extract_file(path: &PathBuf, outdir: &str) -> Option<()> {
let output_path = path.join(file_path); let output_path = path.join(file_path);
if (&*file.name()).ends_with('/') { if (&*file.name()).ends_with('/') {
println!("File {} extracted to \"{}\"", i, output_path.display());
create_dir_all(&output_path).ok()?; create_dir_all(&output_path).ok()?;
} else { } else {
println!(
"File {} extracted to \"{}\" ({} bytes)",
i,
output_path.display(),
file.size()
);
if let Some(p) = output_path.parent() { if let Some(p) = output_path.parent() {
if !p.exists() { if !p.exists() {
create_dir_all(&p).ok()?; create_dir_all(&p).ok()?;

View file

@ -9,6 +9,9 @@ pub struct Asset {
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct GitResponse { pub struct GitResponse {
pub tag_name: String,
pub prerelease: bool,
pub draft: bool,
pub assets: Vec<Asset> pub assets: Vec<Asset>
} }

View file

@ -0,0 +1,41 @@
use std::path::{PathBuf, Path};
use std::{io, fs};
pub enum InstallType {
Command,
Config
}
pub fn get_install_dir() -> Result<PathBuf, String> {
let home_dir = dirs::home_dir()
.ok_or(format!("Failed to get home_directory"))?;
Ok(home_dir.join(super::super::INSTALL_FOLDER))
}
fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {
fs::create_dir_all(&dst)?;
for entry in fs::read_dir(src)? {
let entry = entry?;
let ty = entry.file_type()?;
if ty.is_dir() {
copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?;
} else {
fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?;
}
}
Ok(())
}
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 subfolder = match install_type {
InstallType::Command => "bin",
InstallType::Config => "configs"
};
let install_folder = get_install_dir().ok()?.join(subfolder);
copy_dir_all(source_folder, install_folder).ok()?;
Some(())
}

View file

@ -1,3 +1,4 @@
pub mod downloader; pub mod downloader;
pub mod extractor; pub mod extractor;
pub mod git; pub mod git;
pub mod installer;

35
src/linux/mod.rs Normal file
View file

@ -0,0 +1,35 @@
use structopt::{
StructOpt,
clap::{
arg_enum
}
};
arg_enum! {
#[derive(Debug)]
enum Tool {
Fvm
}
}
#[derive(Debug, StructOpt)]
#[structopt(name = "autoconfig", about = "Auto install local config.")]
struct Opt {
#[structopt(short = "i", long = "install", help = "Available values : fvm (Flutter version manager)")]
tools: Vec<Tool>,
}
pub fn start() {
let opt = Opt::from_args();
for tool in &opt.tools {
let result = match tool {
Tool::Fvm => super::common::fvm::install()
};
if let Err(err) = result {
eprintln!("[ERROR] {}", err);
}
}
}

35
src/macos/mod.rs Normal file
View file

@ -0,0 +1,35 @@
use structopt::{
StructOpt,
clap::{
arg_enum
}
};
arg_enum! {
#[derive(Debug)]
enum Tool {
Fvm
}
}
#[derive(Debug, StructOpt)]
#[structopt(name = "autoconfig", about = "Auto install local config.")]
struct Opt {
#[structopt(short = "i", long = "install", help = "Available values : fvm (Flutter version manager)")]
tools: Vec<Tool>,
}
pub fn start() {
let opt = Opt::from_args();
for tool in &opt.tools {
let result = match tool {
Tool::Fvm => super::common::fvm::install()
};
if let Err(err) = result {
eprintln!("[ERROR] {}", err);
}
}
}

View file

@ -1,6 +1,26 @@
#[cfg(target_os = "windows")]
mod windows; mod windows;
#[cfg(target_os = "linux")]
mod linux;
#[cfg(target_os = "macos")]
mod macos;
pub mod common; pub mod common;
fn main() { fn main() {
#[cfg(target_os = "windows")]
windows::start(); windows::start();
#[cfg(target_os = "linux")]
linux::start();
#[cfg(target_os = "macos")]
macos::start();
#[cfg(not(target_os = "windows"))]
#[cfg(not(target_os = "linux"))]
#[cfg(not(target_os = "macos"))]
println!("[ERROR] Operating system not supported");
} }

View file

@ -1,4 +1,3 @@
mod fvm;
use structopt::{ use structopt::{
StructOpt, StructOpt,
@ -26,7 +25,7 @@ pub fn start() {
let opt = Opt::from_args(); let opt = Opt::from_args();
for tool in &opt.tools { for tool in &opt.tools {
let result = match tool { let result = match tool {
Tool::Fvm => fvm::install() Tool::Fvm => super::common::fvm::install()
}; };
if let Err(err) = result { if let Err(err) = result {