2025-11-18 19:46:36 +03:00
|
|
|
use std::path::Path;
|
2025-06-02 18:00:32 +03:00
|
|
|
use std::process;
|
|
|
|
|
|
2025-11-18 19:46:36 +03:00
|
|
|
use crate::utils::parser::{self, pkginfo};
|
|
|
|
|
use super::run::download::download;
|
|
|
|
|
use super::run::patch::patch;
|
|
|
|
|
use super::run::build::build;
|
|
|
|
|
use super::run::config::config;
|
2025-08-08 00:00:14 +03:00
|
|
|
|
2025-06-02 18:00:32 +03:00
|
|
|
|
|
|
|
|
pub fn install(repo: &String, pkgname: &String) -> Result<(), bool> {
|
2025-11-18 19:46:36 +03:00
|
|
|
let pkg_md_path = crate::commands::get_var_path().join(format!("{}/{}.md", &repo, &pkgname));
|
2025-08-31 16:30:55 +03:00
|
|
|
|
2025-08-23 07:04:59 +03:00
|
|
|
check_build_dependency(&repo, &pkg_md_path)?;
|
|
|
|
|
check_run_dependency(&pkg_md_path)?;
|
2025-11-18 19:46:36 +03:00
|
|
|
download(&repo, &pkgname)?;
|
|
|
|
|
patch(&repo, &pkgname)?;
|
|
|
|
|
build(&repo, &pkgname)?;
|
|
|
|
|
config(&repo, &pkgname)?;
|
2025-08-08 00:00:14 +03:00
|
|
|
|
|
|
|
|
println!("Package {} installed successfully from repo {}", pkgname, repo);
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-23 07:04:59 +03:00
|
|
|
fn check_build_dependency(repo: &String, pkg_md_path: &Path) -> Result<(), bool> {
|
|
|
|
|
let deps = match parser::get_build_deps(&pkg_md_path) {
|
2025-06-02 18:00:32 +03:00
|
|
|
Ok(deps) => deps,
|
2025-08-26 04:41:14 +03:00
|
|
|
Err(_) => { return Ok(()) }
|
2025-06-02 18:00:32 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for dependency in deps.lines() {
|
2025-08-08 00:00:14 +03:00
|
|
|
if !dependency.trim().is_empty() {
|
2025-11-18 19:46:36 +03:00
|
|
|
if !super::get_aeropkg_base().join(repo).join(dependency).exists() {
|
2025-06-02 18:00:32 +03:00
|
|
|
match install(repo, &dependency.to_string()) {
|
|
|
|
|
Ok(()) => {}
|
|
|
|
|
Err(_) => {process::exit(1) }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-08 00:00:14 +03:00
|
|
|
Ok(())
|
|
|
|
|
}
|
2025-06-02 18:00:32 +03:00
|
|
|
|
2025-08-23 07:04:59 +03:00
|
|
|
fn check_run_dependency(pkg_md_path: &Path) -> Result<(), bool> {
|
|
|
|
|
let deps = match parser::get_run_deps(pkg_md_path) {
|
|
|
|
|
Ok(deps) => deps,
|
2025-08-26 04:41:14 +03:00
|
|
|
Err(_) => { return Ok(()) }
|
2025-08-23 07:04:59 +03:00
|
|
|
};
|
|
|
|
|
|
2025-11-18 19:46:36 +03:00
|
|
|
let repo_list = parser::repoinfo::get_repo_list();
|
|
|
|
|
|
|
|
|
|
for pkgname in deps.split_whitespace() {
|
2025-08-23 07:04:59 +03:00
|
|
|
let mut found = false;
|
|
|
|
|
|
|
|
|
|
for repo_name in &repo_list {
|
2025-11-18 19:46:36 +03:00
|
|
|
let path = super::get_aeropkg_base().join(repo_name).join(pkgname);
|
|
|
|
|
if path.exists() {
|
2025-08-23 07:04:59 +03:00
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !found {
|
2025-11-18 19:46:36 +03:00
|
|
|
install(&pkginfo::get_priority_repo(pkgname.to_string()), &pkgname.to_string());
|
2025-08-08 00:00:14 +03:00
|
|
|
}
|
2025-06-02 18:00:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|