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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
.clean_up_dependencies2 <- function (x, installed, available)
{
.split_op_version <- function (x)
{
pat <- "^([^\\([:space:]]+)[[:space:]]*\\(([^\\)]+)\\).*"
x1 <- sub(pat, "\\1", x)
x2 <- sub(pat, "\\2", x)
if (x2 != x1) {
pat <- "[[:space:]]*([[<>=!]+)[[:space:]]+(.*)"
version <- sub(pat, "\\2", x2)
if (!grepl("^r", version))
version <- package_version(version)
list(name = x1, op = sub(pat, "\\1", x2), version = version)
}
else list(name = x1)
}
.split_dependencies <- function(x) {
.split2 <- function(x) {
x <- sub("[[:space:]]+$", "", x)
x <- unique(sub("^[[:space:]]*(.*)", "\\1", x))
names(x) <- sub("^([[:alnum:].]+).*$", "\\1", x)
x <- x[names(x) != "R"]
x <- x[nzchar(x)]
x <- x[!duplicated(names(x))]
lapply(x, .split_op_version)
}
if (!any(nzchar(x)))
return(list())
unlist(lapply(strsplit(x, ","), .split2), FALSE, FALSE)
}
x <- x[!is.na(x)]
if (!length(x))
return(list(character(), character()))
xx <- .split_dependencies(x)
if (!length(xx))
return(list(character(), character()))
pkgs <- installed[, "Package"]
have <- sapply(xx, function(x) {
if (length(x) == 3L) {
if (!x[[1L]] %in% pkgs)
return(FALSE)
if (x[[2L]] != ">=")
return(TRUE)
current <- as.package_version(installed[pkgs == x[[1L]],
"Version"])
target <- as.package_version(x[[3L]])
eval(parse(text = paste("any(current", x$op, "target)")))
}
else x[[1L]] %in% pkgs
})
xx <- xx[!have]
if (!length(xx))
return(list(character(), character()))
pkgs <- row.names(available)
canget <- miss <- character()
for (i in seq_along(xx)) {
x <- xx[[i]]
if (length(x) == 3L) {
if (!x[[1L]] %in% pkgs) {
miss <- c(miss, x[[1L]])
next
}
if (x[[2L]] != ">=") {
canget <- c(canget, x[[1L]])
next
}
current <- as.package_version(available[pkgs == x[[1L]],
"Version"])
target <- as.package_version(x[[3L]])
res <- eval(parse(text = paste("any(current", x$op,
"target)")))
if (res)
canget <- c(canget, x[[1L]])
else miss <- c(miss, paste0(x[[1L]], " (>= ", x[[3L]],
")"))
}
else if (x[[1L]] %in% pkgs)
canget <- c(canget, x[[1L]])
else miss <- c(miss, x[[1L]])
}
list(canget, miss)
}
|