blob: b898a45d0dd70cfcefe64223f7801870dfc71375 [file] [log] [blame]
# File src/library/tools/R/md5.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2016 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
md5sum <- function(files) {
files <- path.expand(files)
structure(.Call(C_Rmd5, files), names=files)
}
.installMD5sums <- function(pkgDir, outDir = pkgDir)
{
dot <- getwd()
if (is.null(dot))
stop("current working directory cannot be ascertained")
setwd(pkgDir)
x <- md5sum(dir(".", recursive=TRUE))
setwd(dot)
x <- x[names(x) != "MD5"]
cat(paste(x, names(x), sep=" *"), sep="\n",
file=file.path(outDir, "MD5"))
}
checkMD5sums <- function(package, dir)
{
if(missing(dir)) dir <- find.package(package, quiet = TRUE)
if(!length(dir)) return(NA)
md5file <- file.path(dir, "MD5")
if(!file.exists(md5file)) return(NA)
inlines <- readLines(md5file)
## now split on the first space.
xx <- sub("^([0-9a-fA-F]*)(.*)", "\\1", inlines)
nmxx <- names(xx) <- sub("^[0-9a-fA-F]* [ |*](.*)", "\\1", inlines)
dot <- getwd()
if (is.null(dot))
stop("current working directory cannot be ascertained")
setwd(dir)
x <- md5sum(dir(dir, recursive = TRUE))
setwd(dot)
x <- x[names(x) != "MD5"]
nmx <- names(x)
res <- TRUE
not.here <- (nmxx %notin% nmx)
if(any(not.here)) {
res <- FALSE
if (sum(not.here) > 1L)
cat("files", paste(sQuote(nmxx[not.here]), collapse = ", "),
"are missing\n", sep = " ")
else
cat("file", sQuote(nmxx[not.here]), "is missing\n", sep = " ")
}
nmxx <- nmxx[!not.here]
diff <- xx[nmxx] != x[nmxx]
if(any(diff)) {
res <- FALSE
files <- nmxx[diff]
if(length(files) > 1L)
cat("files", paste(sQuote(files), collapse = ", "),
"have the wrong MD5 checksums\n", sep = " ")
else cat("file", sQuote(files), "has the wrong MD5 checksum\n")
}
res
}