From c0e69e5abcea37c24d860d3292755067b3822a5b Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 4 Nov 2024 14:42:11 +0100 Subject: [PATCH] feat: add script to list missing pkgs --- local/inspect-missing-pkgs.R | 97 ++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 local/inspect-missing-pkgs.R diff --git a/local/inspect-missing-pkgs.R b/local/inspect-missing-pkgs.R new file mode 100644 index 0000000..03a9bd3 --- /dev/null +++ b/local/inspect-missing-pkgs.R @@ -0,0 +1,97 @@ +library(furrr) +library(cli) +library(dplyr) +library(data.table) + +# Packages for which the most recent CRAN release is not available +last_versions_cran <- available.packages("https://cloud.r-project.org/src/contrib")[, c("Package", "Version")] +# last_versions_devxy <- available.packages("https://cran.devxy.io/arm64/jammy/latest/src/contrib")[, c("Package", "Version")] +last_versions_devxy <- available.packages("https://cran.devxy.io/arm64/rhel8/latest/src/contrib")[, c("Package", "Version")] + +arch <- c("amd64", "arm64") +os_ids <- c("rhel8", "rhel9", "noble", "jammy", "alpine320") +# os_ids <- c("rhel8") +grid <- tidyr::expand_grid(arch = arch, os_ids = os_ids) + +# Define the function to check for missing packages +check_package <- function(pkg_name, available_pkgs, version_cran, arch, os_id) { + if (pkg_name %in% available_pkgs$Package) { + version_devxy <- available_pkgs %>% + filter(Package == pkg_name) %>% + pull(Version) + + if (is.na(version_devxy) || version_cran != version_devxy) { + # Package is missing or version mismatch + return(data.frame(pkg_name = pkg_name, arch = arch, ID = os_id)) + } + } else { + # Package completely missing in devxy + return(data.frame(pkg_name = pkg_name, arch = arch, ID = os_id)) + } + return(NULL) # No mismatch, no entry added +} + +# Run the mapping with parallel processing for each (arch, os_id) combination +future::plan("multisession", workers = 5) + + +pkgs_missing <- future_map2(grid$arch, grid$os_ids, ~ { + + # Prepare the URL and fetch available packages only once per (arch, os_id) + repo_url <- sprintf("https://cran.devxy.io/%s/%s/latest/src/contrib", .x, .y) + available_pkgs <- as.data.table(available.packages(contriburl = repo_url)[, c("Package", "Version")]) + + # Define the packages to check once + cran_pkgs <- as.data.table(last_versions_cran) + + # Accumulate results in a list + pkg_entries <- list() + + # Loop through each package name and check if it's missing + for (pkg_name in cran_pkgs$Package) { + version_cran <- cran_pkgs[Package == pkg_name, Version] + result <- check_package(pkg_name, available_pkgs, version_cran, .x, .y) + if (!is.null(result)) { + pkg_entries[[length(pkg_entries) + 1]] <- result + } + } + + # Combine results for the current (arch, os_id) + if (length(pkg_entries) > 0) { + return(rbindlist(pkg_entries)) + } else { + return(data.table(pkg_name = character(), arch = character(), ID = character())) + } +}) + +df_missing_pkgs <- rbindlist(pkgs_missing, fill = TRUE) + + +df_missing_pkgs |> + group_by(arch, ID) |> + arrange(arch, ID) |> + count() + +pkgs_missing_amd64_rhel8 = df_missing_pkgs |> filter(arch == "amd64", ID == "rhel8") |> pull(pkg_name) +pkgs_missing_amd64_rhel9 = df_missing_pkgs |> filter(arch == "amd64", ID == "rhel9") |> pull(pkg_name) +pkgs_missing_amd64_jammy = df_missing_pkgs |> filter(arch == "amd64", ID == "jammy") |> pull(pkg_name) +pkgs_missing_amd64_noble = df_missing_pkgs |> filter(arch == "amd64", ID == "noble") |> pull(pkg_name) +pkgs_missing_amd64_alpine320 = df_missing_pkgs |> filter(arch == "amd64", ID == "alpine320") |> pull(pkg_name) + +pkgs_missing_arm64_rhel8 = df_missing_pkgs |> filter(arch == "arm64", ID == "rhel8") |> pull(pkg_name) +pkgs_missing_arm64_rhel9 = df_missing_pkgs |> filter(arch == "arm64", ID == "rhel9") |> pull(pkg_name) +pkgs_missing_arm64_jammy = df_missing_pkgs |> filter(arch == "arm64", ID == "jammy") |> pull(pkg_name) +pkgs_missing_arm64_noble = df_missing_pkgs |> filter(arch == "arm64", ID == "noble") |> pull(pkg_name) +pkgs_missing_arm64_alpine320 = df_missing_pkgs |> filter(arch == "arm64", ID == "alpine320") |> pull(pkg_name) + +options(max.print=1000000) +which(names(last_versions_cran[, "Package"]) %in% pkgs_missing_amd64_rhel8) +which(names(last_versions_cran[, "Package"]) %in% pkgs_missing_amd64_rhel9) +which(names(last_versions_cran[, "Package"]) %in% pkgs_missing_amd64_jammy) +which(names(last_versions_cran[, "Package"]) %in% pkgs_missing_amd64_noble) +which(names(last_versions_cran[, "Package"]) %in% pkgs_missing_amd64_alpine320) + + +# for (i in pkgs_missing_filtered) { +# system(sprintf("just build-single jammy arm64 later latest 1")) +# }