mirror of
https://github.com/yuzu-emu/liftinstall.git
synced 2024-11-22 23:45:43 +01:00
Add checks for updating of packages
This commit is contained in:
parent
05de23a918
commit
7f86ac634a
@ -94,8 +94,24 @@ impl InstallerFramework {
|
|||||||
.expect("Install directory not initialised")
|
.expect("Install directory not initialised")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Calculate packages to *uninstall*
|
||||||
|
let mut uninstall_items = Vec::new();
|
||||||
|
if !fresh_install {
|
||||||
|
for package in &self.database {
|
||||||
|
if !items.contains(&package.name) {
|
||||||
|
uninstall_items.push(package.name.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"Framework: Uninstalling {:?} additionally.",
|
||||||
|
uninstall_items
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let task = Box::new(InstallTask {
|
let task = Box::new(InstallTask {
|
||||||
items,
|
items,
|
||||||
|
uninstall_items,
|
||||||
fresh_install,
|
fresh_install,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -19,11 +19,10 @@ impl Task for DownloadPackageTask {
|
|||||||
fn execute(
|
fn execute(
|
||||||
&mut self,
|
&mut self,
|
||||||
mut input: Vec<TaskParamType>,
|
mut input: Vec<TaskParamType>,
|
||||||
_: &mut InstallerFramework,
|
context: &mut InstallerFramework,
|
||||||
messenger: &Fn(&str, f32),
|
messenger: &Fn(&str, f32),
|
||||||
) -> Result<TaskParamType, String> {
|
) -> Result<TaskParamType, String> {
|
||||||
assert_eq!(input.len(), 1);
|
assert_eq!(input.len(), 1);
|
||||||
messenger(&format!("Downloading package {:?}...", self.name), 0.0);
|
|
||||||
|
|
||||||
let file = input.pop().expect("Should have input from resolver!");
|
let file = input.pop().expect("Should have input from resolver!");
|
||||||
let (version, file) = match file {
|
let (version, file) = match file {
|
||||||
@ -31,6 +30,19 @@ impl Task for DownloadPackageTask {
|
|||||||
_ => return Err(format!("Unexpected param type to download package")),
|
_ => return Err(format!("Unexpected param type to download package")),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Check to see if this is the newest file available already
|
||||||
|
for element in &context.database {
|
||||||
|
if element.name == self.name {
|
||||||
|
if element.version == version {
|
||||||
|
println!("{:?} is already up to date.", self.name);
|
||||||
|
return Ok(TaskParamType::Break);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
messenger(&format!("Downloading package {:?}...", self.name), 0.0);
|
||||||
|
|
||||||
let mut downloaded = 0;
|
let mut downloaded = 0;
|
||||||
let mut data_storage: Vec<u8> = Vec::new();
|
let mut data_storage: Vec<u8> = Vec::new();
|
||||||
|
|
||||||
|
@ -6,12 +6,14 @@ use tasks::install_dir::VerifyInstallDirTask;
|
|||||||
use tasks::install_pkg::InstallPackageTask;
|
use tasks::install_pkg::InstallPackageTask;
|
||||||
use tasks::save_database::SaveDatabaseTask;
|
use tasks::save_database::SaveDatabaseTask;
|
||||||
use tasks::save_executable::SaveExecutableTask;
|
use tasks::save_executable::SaveExecutableTask;
|
||||||
|
use tasks::uninstall_pkg::UninstallPackageTask;
|
||||||
|
|
||||||
use tasks::Task;
|
use tasks::Task;
|
||||||
use tasks::TaskParamType;
|
use tasks::TaskParamType;
|
||||||
|
|
||||||
pub struct InstallTask {
|
pub struct InstallTask {
|
||||||
pub items: Vec<String>,
|
pub items: Vec<String>,
|
||||||
|
pub uninstall_items: Vec<String>,
|
||||||
pub fresh_install: bool,
|
pub fresh_install: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,6 +39,13 @@ impl Task for InstallTask {
|
|||||||
elements.push(Box::new(InstallPackageTask { name: item.clone() }));
|
elements.push(Box::new(InstallPackageTask { name: item.clone() }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for item in &self.uninstall_items {
|
||||||
|
elements.push(Box::new(UninstallPackageTask {
|
||||||
|
name: item.clone(),
|
||||||
|
optional: false,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
elements.push(Box::new(SaveDatabaseTask {}));
|
elements.push(Box::new(SaveDatabaseTask {}));
|
||||||
|
|
||||||
if self.fresh_install {
|
if self.fresh_install {
|
||||||
|
@ -51,7 +51,12 @@ impl Task for InstallPackageTask {
|
|||||||
None => return Err(format!("Package {:?} could not be found.", self.name)),
|
None => return Err(format!("Package {:?} could not be found.", self.name)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = input.pop().expect("Should have input from uninstaller!");
|
// Check to see if no archive was available.
|
||||||
|
match input.pop().expect("Should have input from uninstaller!") {
|
||||||
|
// No file to install, but all is good.
|
||||||
|
TaskParamType::Break => return Ok(TaskParamType::None),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
let data = input.pop().expect("Should have input from resolver!");
|
let data = input.pop().expect("Should have input from resolver!");
|
||||||
let (file, data) = match data {
|
let (file, data) = match data {
|
||||||
@ -97,20 +102,17 @@ impl Task for InstallPackageTask {
|
|||||||
|
|
||||||
// Create target file
|
// Create target file
|
||||||
let target_path = path.join(&filename);
|
let target_path = path.join(&filename);
|
||||||
println!("target_path: {:?}", target_path);
|
|
||||||
|
|
||||||
installed_files.push(filename.to_string());
|
|
||||||
|
|
||||||
// Check to make sure this isn't a directory
|
// Check to make sure this isn't a directory
|
||||||
if filename.ends_with("/") || filename.ends_with("\\") {
|
if filename.ends_with("/") || filename.ends_with("\\") {
|
||||||
// Create this directory and move on
|
// Directory was already created
|
||||||
match create_dir_all(target_path) {
|
|
||||||
Ok(v) => v,
|
|
||||||
Err(v) => return Err(format!("Unable to create dir: {:?}", v)),
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!("Creating file: {:?}", target_path);
|
||||||
|
|
||||||
|
installed_files.push(filename.to_string());
|
||||||
|
|
||||||
let mut target_file = match File::create(target_path) {
|
let mut target_file = match File::create(target_path) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(v) => return Err(format!("Unable to open file handle: {:?}", v)),
|
Err(v) => return Err(format!("Unable to open file handle: {:?}", v)),
|
||||||
|
@ -22,8 +22,12 @@ pub mod uninstall_pkg;
|
|||||||
/// An abstraction over the various paramaters that can be passed around.
|
/// An abstraction over the various paramaters that can be passed around.
|
||||||
pub enum TaskParamType {
|
pub enum TaskParamType {
|
||||||
None,
|
None,
|
||||||
|
/// Metadata about a file
|
||||||
File(Version, File),
|
File(Version, File),
|
||||||
|
/// Downloaded contents of a file
|
||||||
FileContents(Version, Vec<u8>),
|
FileContents(Version, Vec<u8>),
|
||||||
|
/// Tells the runtime to break parsing other dependencies
|
||||||
|
Break
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A Task is a small, async task conforming to a fixed set of inputs/outputs.
|
/// A Task is a small, async task conforming to a fixed set of inputs/outputs.
|
||||||
@ -89,13 +93,25 @@ impl DependencyTree {
|
|||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
|
|
||||||
for i in &mut self.dependencies {
|
for i in &mut self.dependencies {
|
||||||
inputs.push(i.execute(context, &|msg: &str, progress: f32| {
|
let result = i.execute(context, &|msg: &str, progress: f32| {
|
||||||
messenger(
|
messenger(
|
||||||
msg,
|
msg,
|
||||||
progress / total_tasks + (1.0 / total_tasks) * count as f32,
|
progress / total_tasks + (1.0 / total_tasks) * count as f32,
|
||||||
)
|
)
|
||||||
})?);
|
})?;
|
||||||
|
|
||||||
|
// Check to see if we skip matching other dependencies
|
||||||
|
let do_break = match &result {
|
||||||
|
&TaskParamType::Break => true,
|
||||||
|
_ => false
|
||||||
|
};
|
||||||
|
|
||||||
|
inputs.push(result);
|
||||||
count += 1;
|
count += 1;
|
||||||
|
|
||||||
|
if do_break {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
|
Loading…
Reference in New Issue
Block a user