Added self update function
This commit is contained in:
24
src/main.rs
24
src/main.rs
@@ -3,10 +3,9 @@ mod repository;
|
||||
mod config;
|
||||
mod operations;
|
||||
mod utils;
|
||||
mod update;
|
||||
|
||||
use strum::{EnumIter, IntoEnumIterator};
|
||||
|
||||
#[derive(Debug, Clone, EnumIter)]
|
||||
#[derive(Debug, Clone)]
|
||||
enum MainMenu {
|
||||
Install,
|
||||
Collect,
|
||||
@@ -30,6 +29,13 @@ impl ToString for MainMenu {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
if let Some(version) = option_env!("CI_COMMIT_SHA") {
|
||||
println!("Starting installer version {}", version);
|
||||
update::check_for_updates(version);
|
||||
} else {
|
||||
println!("Starting installer version unknown");
|
||||
}
|
||||
|
||||
if !repository::open_repo() {
|
||||
println!("Failed to open/clone repo!");
|
||||
return;
|
||||
@@ -50,7 +56,17 @@ fn main() {
|
||||
};
|
||||
|
||||
'main_loop: loop {
|
||||
let res = prompt::select(Some("What do you want to do?"), MainMenu::iter().collect());
|
||||
let res = prompt::select(
|
||||
Some("What do you want to do?"),
|
||||
vec![
|
||||
MainMenu::Install,
|
||||
MainMenu::Collect,
|
||||
MainMenu::Pull,
|
||||
MainMenu::Diff,
|
||||
MainMenu::Upload,
|
||||
MainMenu::Quit
|
||||
]
|
||||
);
|
||||
match res {
|
||||
MainMenu::Install => operations::install(&mods),
|
||||
MainMenu::Collect => operations::collect(&mods),
|
||||
|
||||
50
src/update.rs
Normal file
50
src/update.rs
Normal file
@@ -0,0 +1,50 @@
|
||||
use std::env::current_exe;
|
||||
use std::fs;
|
||||
use std::fs::File;
|
||||
use std::os::unix::process::CommandExt;
|
||||
use std::path::Path;
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct Commit {
|
||||
id: String
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct Link {
|
||||
direct_asset_url: String
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct Assets {
|
||||
links: Vec<Link>
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct ReleaseEntry {
|
||||
commit: Commit,
|
||||
assets: Assets
|
||||
}
|
||||
|
||||
pub fn check_for_updates(version: &str) {
|
||||
print!("Checking for updates... ");
|
||||
let resp: Vec<ReleaseEntry> = attohttpc::get("https://gitlab.mattv.de/api/v4/projects/43/releases").send().unwrap().json().unwrap();
|
||||
let newest = resp.first().unwrap();
|
||||
if newest.commit.id != version {
|
||||
println!("New version exists");
|
||||
let exe = current_exe().unwrap();
|
||||
let temp = Path::new("temp");
|
||||
|
||||
print!("Downloading... ");
|
||||
attohttpc::get(newest.assets.links.first().unwrap().direct_asset_url.clone()).send().unwrap().write_to(File::create(temp).unwrap()).unwrap();
|
||||
println!("Done");
|
||||
|
||||
fs::set_permissions(&temp, exe.metadata().unwrap().permissions()).unwrap();
|
||||
|
||||
fs::rename(&temp, &exe).unwrap();
|
||||
|
||||
std::process::Command::new(exe).exec();
|
||||
std::process::exit(1);
|
||||
}
|
||||
println!("No new version");
|
||||
}
|
||||
Reference in New Issue
Block a user