-
Notifications
You must be signed in to change notification settings - Fork 0
/
cran-versions.R
55 lines (46 loc) · 1.48 KB
/
cran-versions.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#' Get all package versions on CRAN
#'
#' @description This function queries CRAN for the codes of all available
#' package versions, both current and archived, for a given package.
#'
#' @template package
#'
#' @return A character vector of version codes.
#'
#' @examples
#' \donttest{
#' wood_cran_versions("versionsort")
#' }
#'
#' @family cran
#' @family versions
#' @export
wood_cran_versions <- function(package) {
assert_param_package(package)
cran_versions_cache(package)
}
#' @importFrom versionsort ver_latest
cran_versions_cache <- function(package) {
cache_file <- cache_path("versions", "CRAN", package)
# Return usable cache if exists
if (is_cache_usable(cache_file)) return(readRDS(cache_file))
# Return "expired" cache if no new version was published in the meantime
if (file.exists(cache_file)) {
version_codes <- readRDS(cache_file)
if (ver_latest(version_codes) == wood_cran_latest(package)) return(version_codes)
}
# Download new data and cache it
url <- crandb_url("-", "allall", params = list(start_key = package, limit = 1))
desc <- download_safely(url)
validate_cran_package(package, desc)
# Extract all cacheable data
versions <- desc[[package]][["versions"]]
version_codes <- names(versions)
latest <- desc[[package]][["latest"]]
# Save cache
saveRDS(versions, cache_path("descriptions", "CRAN", package))
saveRDS(version_codes, cache_file)
saveRDS(latest, cache_path("latest", "CRAN", package))
# Return value
version_codes
}