Change updater to replace the existing installer.

This commit is contained in:
James Rowe 2019-12-19 23:05:33 -07:00
parent 93e24ea06a
commit c68ebcb61e

View File

@ -72,6 +72,7 @@ use clap::Arg;
use config::BaseAttributes; use config::BaseAttributes;
use std::process::{Command, Stdio, exit}; use std::process::{Command, Stdio, exit};
use std::fs;
static RAW_CONFIG: &'static str = include_str!(concat!(env!("OUT_DIR"), "/bootstrap.toml")); static RAW_CONFIG: &'static str = include_str!(concat!(env!("OUT_DIR"), "/bootstrap.toml"));
@ -135,26 +136,9 @@ fn main() {
// check for existing installs if we are running as a fresh install // check for existing installs if we are running as a fresh install
let installed_path = PathBuf::from(framework.get_default_path().unwrap()); let installed_path = PathBuf::from(framework.get_default_path().unwrap());
if fresh_install && installed_path.join("metadata.json").exists() { if fresh_install && installed_path.join("metadata.json").exists() {
info!("Existing install detected! Trying to launch this install instead"); info!("Existing install detected! Copying Trying to launch this install instead");
// Generate installer path // Ignore the return value from this since it should exit the application if its successful
let platform_extension = if cfg!(windows) { let _ = replace_existing_install(&current_exe, &installed_path);
"maintenancetool.exe"
} else {
"maintenancetool"
};
let existing = installed_path.join(platform_extension).into_os_string().into_string();
if existing.is_ok() {
info!("Launching {:?}", existing);
let success = Command::new(existing.unwrap())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn();
if success.is_ok() {
exit(0);
} else {
error!("Unable to start existing yuzu maintenance tool. Launching old one instead");
}
}
} }
let is_launcher = if let Some(string) = matches.value_of("launcher") { let is_launcher = if let Some(string) = matches.value_of("launcher") {
@ -168,3 +152,45 @@ fn main() {
// Start up the UI // Start up the UI
frontend::launch(&app_name, is_launcher, framework); frontend::launch(&app_name, is_launcher, framework);
} }
fn replace_existing_install(current_exe: &PathBuf, installed_path: &PathBuf) -> Result<(), String> {
// Generate installer path
let platform_extension = if cfg!(windows) {
"maintenancetool.exe"
} else {
"maintenancetool"
};
let new_tool = if cfg!(windows) {
"maintenancetool_new.exe"
} else {
"maintenancetool_new"
};
if let Err(v) = fs::copy(current_exe, installed_path.join(new_tool)) {
return Err(format!("Unable to copy installer binary: {:?}", v));
}
let existing = installed_path.join(platform_extension).into_os_string().into_string();
let new = installed_path.join(new_tool).into_os_string().into_string();
if existing.is_ok() && new.is_ok() {
// Remove NTFS alternate stream which tells the operating system that the updater was downloaded from the internet
if cfg!(windows) {
let _ = fs::remove_file(installed_path.join("maintenancetool_new.exe:Zone.Identifier:$DATA"));
}
info!("Launching {:?}", existing);
let success = Command::new(new.unwrap())
.arg("--swap")
.arg(existing.unwrap())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn();
if success.is_ok() {
exit(0);
} else {
error!("Unable to start existing yuzu maintenance tool. Launching old one instead");
}
}
Ok(())
}