From ea5f18af9efc026cc6346a2668195e031bdf2435 Mon Sep 17 00:00:00 2001 From: axtlos <3alouchi2006@gmail.com> Date: Tue, 12 Oct 2021 21:05:16 +0200 Subject: [PATCH] database now works with upgrading too(im sorry for the horrible code jnats) --- src/mods/upgrade.rs | 217 +++++++++++++++++++++++++++++++------------- 1 file changed, 154 insertions(+), 63 deletions(-) diff --git a/src/mods/upgrade.rs b/src/mods/upgrade.rs index bddc9c7..704cdd0 100644 --- a/src/mods/upgrade.rs +++ b/src/mods/upgrade.rs @@ -1,7 +1,30 @@ -use crate::mods::strs::{err_unrec, inf, sec, succ}; +//use crate::mods::strs::{err_unrec, inf, sec, succ}; +use crate::{ + err_unrec, inf, inssort, mods::strs::prompt, mods::strs::sec, mods::strs::succ, + mods::uninstall::uninstall, mods::database::addPkg +}; use runas::Command; -use std::{env, fs}; +use std::{env, fs, path::Path}; use toml; +use git2::Repository; + + +fn uninstall_make_depend(pkg: &str) { + let make_depends = raur::info(&[&pkg]).unwrap()[0].make_depends.clone(); + + if make_depends.len() != 0 { + inf(format!( + "{} installed following make dependencies: {}", + pkg, + make_depends.join(", ") + )); + let remove = prompt(format!("Would you like to remove them?")); + if remove == true { + uninstall(true, make_depends); + } + } + succ(format!("Succesfully upgraded {}", pkg)); +} pub fn upgrade(noconfirm: bool) { let homepath = std::env::var("HOME").unwrap(); @@ -48,71 +71,139 @@ pub fn upgrade(noconfirm: bool) { println!("{:?}", dbParsed); for entry in dbParsed.as_table() { for (key, value) in &*entry { - //println!("{} / {}", key, value); - for (option, entry) in { - println!("{} / {}", option, entry); - } - //if key.contains("name") { - /* println!("{}",value); - let results = raur::search(format!("{}",entry["paru"])); - println!("{}",format!("{}",entry)); - let mut test = value.to_string().replace("\"", ""); - test = test.replace("version", "").replace("name",""); - test = test.replace("=", ""); - println!("{}",test.replace(" ",""));*/ - //let results = raur::search(format!("{}",value)); - //for res in results { - // println!("{}",&res[0].name); - //} - /*} else if key.contains("version") { - if value.as_integer() == lVersion { - println!("upgrading"); - } - }*/ - } - } + let results = raur::search(format!("{}",key)); + for res in results { + println!("{}",&res[0].name); + let url = format!("https://aur.archlinux.org/{}.git", key); + let package = raur::info(&[key]).unwrap(); + let version = value.to_string().replace("name", "").replace("version","").replace(" = ","").replace("\"","").replace(format!("{}",&res[0].name.to_string()).as_str(),""); + let name = value.to_string().replace("name", "").replace("version","").replace(" = ","").replace("\"","").replace(format!("{}",&res[0].version.to_string()).as_str(),""); + println!("{} / {}",name,version); + if res[0].version.contains(&version) { + let keydir = format!("{}{}",&cachedir,&key); + if std::path::Path::new(&keydir).is_dir() { + let cd_result = env::set_current_dir(&keydir); + match cd_result { + Ok(_) => inf(format!("Entered package directory")), + Err(_) => err_unrec(format!("Could not enter package directory")), + } + inssort(true, package[0].depends.clone()); - /*for file in std::fs::read_dir(&cachedir).unwrap() { - let dir = &file.unwrap().path(); - let output = std::process::Command::new("git") - .arg("pull") - .output() - .unwrap(); - let update_available = String::from_utf8(output.stdout).unwrap(); + sec(format!("Installing {} ...", &key)); + let install_result = std::process::Command::new("makepkg") + .arg("-si") + .arg("--noconfirm") + .arg("--needed") + .status(); + match install_result { + Ok(_) => { + uninstall_make_depend(&key); + } + Err(_) => { + err_unrec(format!("Couldn't install {}", &key)); + } + }; - let cd_result = env::set_current_dir(&dir); - match cd_result { - Ok(_) => inf(format!("Entered AUR package directory to pull changes")), - Err(_) => err_unrec(format!( - "Could not enter AUR package directory to pull changes" - )), - } + sec(format!("Installing {} ...", &key)); + let install_result = std::process::Command::new("makepkg") + .arg("-si") + .arg("--needed") + .status() + .expect("Couldn't call makepkg"); + match install_result.code() { + Some(0) => { + uninstall_make_depend(&key); + } + Some(_) => { + err_unrec(format!("Couldn't install {}", &key)); + } + None => { + err_unrec(format!("Couldn't install {}", &key)); + } + }; + + } else { + inf(format!("Cloning {} ...", &key)); - if update_available != "Already up to date." { - let path_as_str = &dir.display().to_string(); - let pkg: Vec<&str> = path_as_str.split("/").collect(); + if Path::new(&keydir).is_dir() { + let rm_result = fs::remove_dir_all(&keydir); + match rm_result { + Ok(_) => inf(format!( + "Package path for {} already found. Removing to reinstall", + &key + )), + Err(_) => err_unrec(format!( + "Package path for {} already found, but could not remove to reinstall", + &key + )), + } + } + + let dir_result = fs::create_dir(&keydir); + match dir_result { + Ok(_) => inf(format!("Created package directory for {}", &key)), + Err(_) => err_unrec(format!("Couldn't create package directory for {}", &key)), + } + + let cd_result = env::set_current_dir(&keydir); + match cd_result { + Ok(_) => inf(format!("Entered package directory")), + Err(_) => err_unrec(format!("Could not enter package directory")), + } + + inssort(true, package[0].depends.clone()); - inf(format!("{} is up to date", pkg[pkg.len() - 1])); - } else { - let cd2_result = env::set_current_dir(&dir); - match cd2_result { - Ok(_) => inf(format!( - "Entering AUR package directory to install new version" - )), - Err(_) => err_unrec(format!( - "Couldn't enter AUR package directory to install new version" - )), - } + let clone = Repository::clone(&url, Path::new(&keydir)); + match clone { + Ok(_) => { + inf(format!("Cloning {} into package directory", &key)); + } + Err(_) => err_unrec(format!("Failed cloning {} into package directory", &key)), + } + } - let makepkg_result = std::process::Command::new("makepkg") - .arg("-si") - .status() - .expect("Couldn't call makepkg"); - match makepkg_result.code() { - Some(0) => succ(format!("New AUR package version installed")), - Some(_) => err_unrec(format!("Couldn't install new AUR package version")), - None => err_unrec(format!("Couldn't install new AUR package version")), - }; + sec(format!("Installing {} ...", &key)); + let install_result = std::process::Command::new("makepkg") + .arg("-si") + .arg("--noconfirm") + .arg("--needed") + .status(); + match install_result { + Ok(_) => { + uninstall_make_depend(&key); + } + Err(_) => { + err_unrec(format!("Couldn't install {}", &key)); + } + }; + sec(format!("Installing {} ...", &key)); + let install_result = std::process::Command::new("makepkg") + .arg("-si") + .arg("--needed") + .status() + .expect("Couldn't call makepkg"); + match install_result.code() { + Some(0) => { + uninstall_make_depend(&key); + } + Some(_) => { + err_unrec(format!("Couldn't install {}", &key)); + } + None => { + err_unrec(format!("Couldn't install {}", &key)); + } + }; + + } else { + println!("not upgrading!"); + if std::path::Path::new(&format!("{}{}",&cachedir,&key)).is_dir() { + println!("not cloning"); + } else { + println!("cloning"); + } + } + } + } - }*/ + } }