[Bioc-devel] BiocInstaller fails to load with older R if messages suppressed

Martin Morgan martin.morgan at roswellpark.org
Mon Oct 31 19:54:18 CET 2016


Sorry for a slow reply I posted on the support site. Martin

On 10/31/2016 02:45 PM, Kevin Ushey wrote:
> (Sorry about cross-posting, but I didn't receive a response at
> https://support.bioconductor.org/p/88777/)
>
> ---
>
> BiocInstaller incorrectly detects https support if loaded within a
> 'suppressMessages()' context, and that failure leads to a namespace
> load failure on versions of R without libcurl support. To reproduce,
> try running the following on a version of R without libcurl (e.g. the
> Snow Leopard build of R 3.2.1):
>
>> suppressMessages(library(BiocInstaller))
> Error : .onLoad failed in loadNamespace() for 'BiocInstaller', details:
>   call: url(paste0(.protocol(), "//bioconductor.org/BiocInstaller.dcf"))
>   error: https:// URLs are not supported
> Error: package or namespace load failed for ‘BiocInstaller’
>
> The issue seems to come from the implementation of
> 'BiocInstaller:::.protocol', which attempts to ascertain whether
> `https://` or `http://` should be used. The implementation has:
>
>         con <- file(fl <- tempfile(), "a")
>         on.exit(close(con))
>         sink(con, type = "message")
>         tryCatch({
>             fcon <- file("https://bioconductor.org/index.html")
>             on.exit(close(fcon), add = TRUE)
>             readLines(fcon, 1L)
>         }, error = function(e) {
>             message(conditionMessage(e))
>         })
>         sink(type = "message")
>         flush(con)
>         useHTTPS <- length(readLines(fl)) == 0L
>         PROTOCOL <<- if (useHTTPS)
>             "https:"
>         else "http:"
>
> And that attempt to populate a message sink fails when executed within
> a suppressMessages() context.
>
> Although the above example is artificial, most other examples may not
> be -- it's easy to imagine that the BiocInstaller namespace might be
> implicitly loaded deep within the bowels of some code; for example,
> 'packrat::snapshot()' may query 'BiocInstaller::biocinstallRepos()',
> and a user calling 'packrat::snapshot()' wrapped in
> 'suppressMessages()' will then see the BiocInstaller load error.
>
> Is there any chance the implementation here could be modified to
> instead just set up a local `withCallingHandlers` check, to ensure
> that a parent `withCallingHandlers` usage doesn't interefere? Or
> something similar?
>
> Thanks,
> Kevin
>
> _______________________________________________
> Bioc-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>


This email message may contain legally privileged and/or...{{dropped:2}}



More information about the Bioc-devel mailing list