File: clean_up_dependencies2.R

package info (click to toggle)
gtools 3.4.1-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 384 kB
  • ctags: 5
  • sloc: asm: 127; ansic: 69; makefile: 1
file content (84 lines) | stat: -rw-r--r-- 2,943 bytes parent folder | download | duplicates (4)
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)
}