Apparently the patch file got eaten.  Let me try again with a .txt extension.

 -Ken

> -----Original Message-----
> From: Ken Williams
> Sent: Wednesday, April 11, 2012 10:28 AM
> To: r-devel@r-project.org
> Subject: [patch] giving library() a 'version' argument
>
> I've made a small enhancement to R that would help developers better
> control what versions of code we're using where.
> [...]


CONFIDENTIALITY NOTICE: This e-mail message is for the sole use of the intended 
recipient(s) and may contain confidential and privileged information. Any 
unauthorized review, use, disclosure or distribution of any kind is strictly 
prohibited. If you are not the intended recipient, please contact the sender 
via reply e-mail and destroy all copies of the original message. Thank you.
Index: src/library/base/man/library.Rd
===================================================================
--- src/library/base/man/library.Rd     (revision 58980)
+++ src/library/base/man/library.Rd     (working copy)
@@ -21,7 +21,7 @@
         character.only = FALSE, logical.return = FALSE,
         warn.conflicts = TRUE, quietly = FALSE,
         keep.source = getOption("keep.source.pkgs"),
-        verbose = getOption("verbose"))
+        verbose = getOption("verbose"), version)
 
 require(package, lib.loc = NULL, quietly = FALSE,
         warn.conflicts = TRUE,
@@ -59,6 +59,9 @@
   \item{quietly}{a logical.  If \code{TRUE}, no message confirming
     package loading is printed, and most often, no errors/warnings are
     printed if package loading fails.}
+  \item{version}{the minimum acceptable version of the package to load.
+    If a lesser version is found, the package will not be loaded and an
+    exception will be thrown.}
 }
 \details{
   \code{library(package)} and \code{require(package)} both load the
@@ -189,6 +192,10 @@
 search()                    # "splines", too
 detach("package:splines")
 
+# To require a specific minimum version:
+library(splines, '2.14')
+detach("package:splines")
+
 # if the package name is in a character vector, use
 pkg <- "splines"
 library(pkg, character.only = TRUE)
Index: src/library/base/R/library.R
===================================================================
--- src/library/base/R/library.R        (revision 58980)
+++ src/library/base/R/library.R        (working copy)
@@ -32,7 +32,7 @@
 function(package, help, pos = 2, lib.loc = NULL, character.only = FALSE,
          logical.return = FALSE, warn.conflicts = TRUE,
         quietly = FALSE, keep.source = getOption("keep.source.pkgs"),
-         verbose = getOption("verbose"))
+         verbose = getOption("verbose"), version)
 {
     if (!missing(keep.source))
         warning("'keep.source' is deprecated and will be ignored")
@@ -276,6 +276,11 @@
                stop(gettextf("%s is not a valid installed package",
                               sQuote(package)), domain = NA)
             pkgInfo <- readRDS(pfile)
+            if (!missing(version)) {
+                pver <- pkgInfo$DESCRIPTION["Version"]
+                if (compareVersion(pver, as.character(version)) < 0)
+                    stop("Version ", version, " of '", package, "' required, 
but only ", pver, " is available")
+            }
             testRversion(pkgInfo, package, pkgpath)
             ## avoid any bootstrapping issues by these exemptions
             if(!package %in% c("datasets", "grDevices", "graphics", "methods",
@@ -332,10 +337,18 @@
             stop(gettextf("package %s does not have a NAMESPACE and should be 
re-installed",
                           sQuote(package)), domain = NA)
        }
-       if (verbose && !newpackage)
-            warning(gettextf("package %s already present in search()",
-                             sQuote(package)), domain = NA)
+        if (!newpackage) {
+           if (verbose)
+               warning(gettextf("package %s already present in search()",
+                                sQuote(package)), domain = NA)
+           if (!missing(version)) {
+               pver <- packageVersion(package)
+               if (compareVersion(as.character(pver), as.character(version)) < 
0)
+                   stop("Version ", version, " of '", package,"' required, ",
+                        "but a lesser version ", pver, " is already loaded")
 
+           }
+       }
     }
     else if(!missing(help)) {
        if(!character.only)
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to