From 202508dcb9f0564320df26ec0f84fb5585289a41 Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 25 Jul 2022 14:23:44 +0100 Subject: [PATCH] Fixed issues presented in @axtloss 's testing --- examples/repository/mlc.toml | 2 ++ src/internal/structs.rs | 4 +-- src/operations/build.rs | 24 +++++++++----- src/operations/pull.rs | 32 +++++++++++++++++- src/repository/package.rs | 7 ++++ src/repository/repo.rs | 64 +++++++++++++++++++++++++++++++----- 6 files changed, 112 insertions(+), 21 deletions(-) diff --git a/examples/repository/mlc.toml b/examples/repository/mlc.toml index bf7510e..a8aa808 100644 --- a/examples/repository/mlc.toml +++ b/examples/repository/mlc.toml @@ -16,9 +16,11 @@ repos = [ "crs:malachite/development:0a5bdc9", # Note, in this example, these two "mic:apod:v.1.1.2", # will fail to build. "pkg:pfetch!", + "nms:rpass" # This too ] [repositories.urls] crs = "https://github.com/crystal-linux/{}" pkg = "https://github.com/crystal-linux/pkgbuild.{}" mic = "https://git.tar.black/michal/{}" +nms = "https://github.com/not-my-segfault/{}" diff --git a/src/internal/structs.rs b/src/internal/structs.rs index 59cb8b3..c023b12 100755 --- a/src/internal/structs.rs +++ b/src/internal/structs.rs @@ -38,8 +38,8 @@ pub struct ConfigModeRepository { #[derive(Debug, Deserialize)] pub struct ConfigModeRepositorySigning { pub enabled: bool, - pub key: String, - pub on_gen: bool, + pub key: Option, + pub on_gen: Option, } #[derive(Debug, Deserialize)] diff --git a/src/operations/build.rs b/src/operations/build.rs index 1de926e..49c3db3 100644 --- a/src/operations/build.rs +++ b/src/operations/build.rs @@ -10,19 +10,19 @@ pub fn build(packages: &[String], exclude: Vec, no_regen: bool, verbose: 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 config.mode.repository.as_ref().unwrap().signing.enabled - && config.mode.repository.as_ref().unwrap().signing.on_gen - { + let sign = if signing && on_gen.is_some() && on_gen.unwrap() { false } else { - config.mode.repository.as_ref().unwrap().signing.enabled + signing }; - log!( - verbose, - "Signing: {:?}", - config.mode.repository.unwrap().signing - ); + log!(verbose, "Signing: {:?}", sign); // Get list of repos and subtract exclude let mut repos: Vec = config.repositories; @@ -130,5 +130,11 @@ pub fn build(packages: &[String], exclude: Vec, no_regen: bool, verbose: "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."); + } } } diff --git a/src/operations/pull.rs b/src/operations/pull.rs index 0622498..7f179bb 100644 --- a/src/operations/pull.rs +++ b/src/operations/pull.rs @@ -138,8 +138,38 @@ pub fn pull(packages: Vec, exclude: &[String], verbose: bool, no_regen: crash!(AppExitCode::NoPkgs, "No packages specified"); } - // Pull! + // Sort repos_applicable by priority + repos_applicable.sort_by(|a, b| { + config + .repositories + .iter() + .find(|x| x.name == *a) + .unwrap() + .priority + .cmp( + &config + .repositories + .iter() + .find(|x| x.name == *b) + .unwrap() + .priority, + ) + }); + log!(verbose, "Pulling {:?}", repos_applicable); + + // If the directories specified in repos_applicable do not exist, crash + for repo in &repos_applicable { + if !std::path::Path::new(repo).exists() { + crash!( + AppExitCode::NoPkgs, + "Package {} does not exist, have you run `mlc clone/init`?", + repo + ); + } + } + + // Pull! do_the_pulling( repos_applicable, verbose, diff --git a/src/repository/package.rs b/src/repository/package.rs index 6a56aef..bf7e41f 100755 --- a/src/repository/package.rs +++ b/src/repository/package.rs @@ -32,6 +32,13 @@ pub fn build(pkg: &str, sign: bool, verbose: bool) -> i32 { env::set_current_dir(pkg).unwrap(); log!(verbose, "Current dir: {:?}", env::current_dir().unwrap()); + // If PKGBUILD is not found, return 63 and break + if !Path::exists("PKGBUILD".as_ref()) { + env::set_current_dir(&dir).unwrap(); + log!(verbose, "Current dir: {:?}", env::current_dir().unwrap()); + return 63; + } + // Build each package let a = Command::new("makepkg") .args(&[ diff --git a/src/repository/repo.rs b/src/repository/repo.rs index e2f3313..e7211ac 100644 --- a/src/repository/repo.rs +++ b/src/repository/repo.rs @@ -40,7 +40,22 @@ pub fn generate(verbose: bool) { // Sign all package files in repository if signing and on_gen are true if config.mode.repository.as_ref().unwrap().signing.enabled - && config.mode.repository.as_ref().unwrap().signing.on_gen + && config + .mode + .repository + .as_ref() + .unwrap() + .signing + .on_gen + .is_some() + && config + .mode + .repository + .as_ref() + .unwrap() + .signing + .on_gen + .unwrap() { // Get a list of all .tar.* files in repository let files = fs::read_dir(".").unwrap(); @@ -48,18 +63,49 @@ pub fn generate(verbose: bool) { // Get file name let file = file.unwrap(); let path = file.path(); + + let sign_command = if config + .mode + .repository + .as_ref() + .unwrap() + .signing + .key + .is_some() + && !config + .mode + .repository + .as_ref() + .unwrap() + .signing + .key + .as_ref() + .unwrap() + .is_empty() + { + format!( + "gpg --default-key {} --detach-sign {}", + config + .mode + .repository + .as_ref() + .unwrap() + .signing + .key + .as_ref() + .unwrap(), + path.to_str().unwrap() + ) + } else { + format!("gpg --detach-sign {}", path.to_str().unwrap()) + }; + // If extension is either .zst or .xz, sign it if path.extension().unwrap() == "zst" || path.extension().unwrap() == "xz" { log!(verbose, "Signing {}", path.display()); Command::new("bash") - .args(&[ - "-c", - &format!( - "gpg --default-key {} --detach-sign {}", - config.mode.repository.as_ref().unwrap().signing.key, - file.file_name().to_str().unwrap() - ), - ]) + .arg("-c") + .args(&[&sign_command]) .spawn() .unwrap() .wait()