From 46a55254e9d836150664fe177484234344edcf9d Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 31 Aug 2026 17:01:06 +0000 Subject: [PATCH] fix(build): hold back packages the cran mirror has not picked up yet check_for_binary() reads the published version from the cran GitHub mirror (GET /repos/cran//commits), and that mirror lags CRAN. A package that has just appeared has no repository there, so the call 404s. That 404 is permanent, but it is wrapped in purrr::insistently with max_times = 10 and pause_cap = 60, so it is retried with a backoff of 1, 2, 4, 8, 16, 32, 60, 60, 60, 60 seconds and then aborts the shard. AsyPeer 0.0.1, published today at 13:50 UTC, took out an entire resolute build that way. Release versions published within CRAN_MIRROR_LAG_DAYS (default 3) are therefore held back. They cost nothing to defer: the daily update pipeline builds new and updated packages anyway, and they arrive here on the next run once the mirror has caught up. Measured against the live CRAN index: 135 of 24831 packages (0.54%) at three days, including AsyPeer. --- local/packages-to-build.R | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/local/packages-to-build.R b/local/packages-to-build.R index 3b508fb..aa30390 100644 --- a/local/packages-to-build.R +++ b/local/packages-to-build.R @@ -68,9 +68,36 @@ archive_versions <- archive_versions[ ] # Now get release versions (assuming cran_release has Package and Version columns) +# +# Packages published in the last few days are held back. `check_for_binary()` +# reads the published version from the `cran` GitHub mirror +# (`GET /repos/cran//commits`), and that mirror lags CRAN: a package that +# has just appeared has no repository there yet. The call then 404s, which is +# permanent, but it is wrapped in `purrr::insistently` and retried ten times +# with a backoff capped at 60s - so one unmirrored package burns about five +# minutes and then aborts the whole shard. +# +# Holding them back costs nothing: the daily update pipeline builds new and +# updated packages anyway, and they arrive here on the next run once the mirror +# has caught up. +mirror_lag_days <- as.numeric( + Sys.getenv("CRAN_MIRROR_LAG_DAYS", unset = "3") +) +published <- as.POSIXct(cran_release$Published, tz = "UTC") +too_recent <- !is.na(published) & + published > (Sys.time() - mirror_lag_days * 86400) +if (any(too_recent)) { + message(sprintf( + "Holding back %d package(s) published in the last %g day(s); the cran GitHub mirror will not have them yet: %s", + sum(too_recent), + mirror_lag_days, + paste(utils::head(cran_release$Package[too_recent], 10L), collapse = ", ") + )) +} + release_versions <- data.table( - Package = cran_release$Package, - Version = as.character(cran_release$Version) + Package = cran_release$Package[!too_recent], + Version = as.character(cran_release$Version[!too_recent]) ) pkgs_to_build <- unique(rbind(archive_versions, release_versions, fill = TRUE))