[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