You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
malachite/src/operations/build.rs

141 lines
4.6 KiB
Rust

use crate::internal::structs::{ErroredPackage, Repo};
use crate::internal::AppExitCode;
use crate::{crash, info, log, repository};
pub fn build(packages: &[String], exclude: Vec<String>, no_regen: bool, verbose: bool) {
// Read config struct from mlc.toml
let config = crate::internal::parse_cfg(verbose);
log!(verbose, "Config: {:?}", config);
// Check if any packages were passed, if not, imply all
let all = packages.is_empty();
log!(verbose, "All: {:?}", all);
// Read signing
let signing = config.mode.repository.as_ref().unwrap().signing.enabled;
// Read on_gen
let on_gen = config.mode.repository.as_ref().unwrap().signing.on_gen;
// Parse whether to sign on build or not
let sign = if signing && on_gen.is_some() && on_gen.unwrap() {
false
} else {
signing
};
log!(verbose, "Signing: {:?}", sign);
// Get list of repos and subtract exclude
let mut repos: Vec<Repo> = config.repositories;
log!(verbose, "{} Repos: {:?}", repos.len(), repos);
if !exclude.is_empty() {
log!(verbose, "Exclude not empty: {:?}", exclude);
for ex in exclude {
repos.retain(|x| *x.name != ex);
}
}
log!(
verbose,
"Exclusions parsed. Now {} Repos: {:?}",
repos.len(),
repos
);
// If packages is not empty and all isn't specified, build specified packages
let mut errored: Vec<ErroredPackage> = vec![];
if !packages.is_empty() && !all {
log!(verbose, "Packages not empty: {:?}", packages);
for pkg in packages.iter() {
// If repo is not in config, crash, otherwise, build
if repos.iter().map(|x| x.name.clone()).any(|x| x == *pkg) {
// Otherwise, build
log!(verbose, "Building {}", pkg);
let code = repository::build(pkg, sign, verbose);
log!(
verbose,
"Package {} finished with exit code: {:?}",
pkg,
code
);
if code != 0 {
let error = ErroredPackage {
name: pkg.to_string(),
code,
};
errored.push(error);
}
} else {
crash!(
AppExitCode::PkgsNotFound,
"Package repo {} not found in in mlc.toml",
pkg
);
}
}
}
// If all is specified, attempt to build a package from all repos
if all {
log!(verbose, "Proceeding to build all");
// Sort by package priority
log!(verbose, "Sorting by priority: {:?}", repos);
repos.sort_by(|a, b| b.priority.cmp(&a.priority));
log!(verbose, "Sorted: {:?}", repos);
for pkg in repos {
log!(verbose, "Building {}", pkg.name);
let code = repository::build(&pkg.name, sign, verbose);
log!(
verbose,
"Package {} finished with exit code: {:?}",
pkg.name,
code
);
if code != 0 {
let error = ErroredPackage {
name: pkg.name,
code,
};
errored.push(error);
}
}
}
// If all is not specified, but packages is empty, crash
if !all && packages.is_empty() {
log!(verbose, "Packages empty. Crashing");
crash!(AppExitCode::PkgsNotFound, "No packages specified");
}
// If no_regen is passed, do not generate a repository
if !no_regen {
log!(verbose, "Generating repository");
repository::generate(verbose);
}
// Map errored packages to a string for display
let error_strings: Vec<String> = errored
.iter()
.map(|x| format!("{}: Returned {}", x.name, x.code))
.collect();
// If errored is not empty, let the user know which packages failed
if !errored.is_empty() {
log!(verbose, "Errored packages: \n{:?}", error_strings);
info!(
"The following packages build jobs returned a non-zero exit code: \n {}",
error_strings.join("\n ")
);
info!("Please check `man 8 makepkg` for more information");
// Check if code 63 appeared at all
if errored.iter().any(|x| x.code == 63) {
log!(verbose, "Code 63 found");
info!("Note: Code 63 is an internal Malachite exit code, and specifies that no PKGBUILD was found.");
}
}
}