### Print the flat-slot objects recorded as unable to load under some R minor. # # Usage: Rscript local/list-unsafe-flat-objects.R # # Prints one ` ` per line, for a caller that rebuilds each # under every installed R minor. # # The verdicts come from `abi_flat_safety`, written by the flat-safety backfill # from the binaries themselves: an object is unsafe when it references a symbol # some supported minor does not export. That is the authoritative list of what # needs a per-minor build, and it replaces the ad-hoc symbol scans that produced # earlier repair lists. options(error = function() { cat("ERROR:", geterrmessage(), "\n", file = stdout()) q(status = 1) }) args <- commandArgs(trailingOnly = TRUE) if (length(args) < 2L) { stop("usage: list-unsafe-flat-objects.R ", call. = FALSE) } arch <- args[[1L]] codename <- args[[2L]] con <- DBI::dbConnect( RPostgres::Postgres(), dbname = "build_metadata", host = "r-binaries.devxy.io", port = 15432L, user = "rpkgs", password = Sys.getenv("PGPASS"), sslmode = "require" ) on.exit(try(DBI::dbDisconnect(con), silent = TRUE), add = TRUE) rows <- DBI::dbGetQuery( con, paste0( "SELECT package, version FROM abi_flat_safety ", "WHERE NOT safe AND codename = $1 AND arch = $2 ", "ORDER BY package, version" ), params = list(codename, arch) ) # An empty result is ambiguous: either nothing is unsafe, or the backfill never # ran for this slot. Say which, rather than let the caller read silence as done. if (nrow(rows) == 0L) { total <- DBI::dbGetQuery( con, "SELECT count(*) AS n FROM abi_flat_safety WHERE codename = $1 AND arch = $2", params = list(codename, arch) )$n[[1L]] if (total == 0L) { stop( sprintf( "No verdicts recorded for %s/%s at all. Run the flat-safety backfill first; an empty repair list here would look like success.", # nolint arch, codename ), call. = FALSE ) } message(sprintf( "%s/%s: %d objects recorded, none unsafe. Nothing to repair.", arch, codename, total )) quit(status = 0) } message(sprintf( "%s/%s: %d objects need a per-minor build", arch, codename, nrow(rows) )) cat(sprintf("%s %s", rows$package, rows$version), sep = "\n")