[Rd] problem running test on a system without /etc/localtime

Henrik Bengtsson henrik.bengtsson at gmail.com
Wed May 17 05:49:02 CEST 2017


On Tue, May 16, 2017 at 5:35 PM, Kirill Maslinsky <kirill at altlinux.org> wrote:
> Hi all,
>
> A problem with tests while building R.
>
> I'm packaging R for Sisyphus repository and package build environment,
> by design, doesn't have /etc/localtime file present. This causes failure
> with Sys.timeone during test run:
>
> [builder at localhost tests]$ ../bin/R --vanilla < reg-tests-1d.R
>
>> ## PR#17186 - Sys.timezone() on some Debian-derived platforms
>> (S.t <- Sys.timezone())
> Error in normalizePath("/etc/localtime") :
>   (converted from warning) path[1]="/etc/localtime": No such file or
>   directory
>   Calls: Sys.timezone -> normalizePath
>   Execution halted
>
> This is caused by this code:
>
>> Sys.timezone
> function (location = TRUE)
> {
>     tz <- Sys.getenv("TZ", names = FALSE)
>     if (!location || nzchar(tz))
>         return(Sys.getenv("TZ", unset = NA_character_))
>>>  lt <- normalizePath("/etc/localtime")
> [remainder of the code skkipped]
>
> File /etc/loclatime is optional and is not guaranteed to be present on
> any platform. And anyway, it is a good idea to first check that file
> exists before calling normalizePath.

Looking at the code
(https://github.com/wch/r-source/blob/R-3-4-branch/src/library/base/R/datetime.R#L26),
could it be that mustWork = FALSE (instead of the default NA) avoids
the warning causes this check error?

Index: src/library/base/R/datetime.R
===================================================================
--- src/library/base/R/datetime.R (revision 72684)
+++ src/library/base/R/datetime.R (working copy)
@@ -23,7 +23,7 @@
 {
     tz <- Sys.getenv("TZ", names = FALSE)
     if(!location || nzchar(tz)) return(Sys.getenv("TZ", unset = NA_character_))
-    lt <- normalizePath("/etc/localtime") # Linux, macOS, ...
+    lt <- normalizePath("/etc/localtime", mustWork = FALSE) # Linux, macOS, ...
     if (grepl(pat <- "^/usr/share/zoneinfo/", lt)) sub(pat, "", lt)
     else if (lt == "/etc/localtime" && file.exists("/etc/timezone") &&
      dir.exists("/usr/share/zoneinfo") &&

/Henrik

>
> Sure, this can be worked around by setting TZ environment variable, but
> that causes tests to fail in another place:
>
> [builder at localhost tests]$ TZ="GMT" ../bin/R --vanilla < reg-tests-1d.R
>
>> ## format()ing invalid hand-constructed  POSIXlt  objects
>> d <- as.POSIXlt("2016-12-06"); d$zone <- 1
>> tools::assertError(format(d))
> Error: Failed to get error in evaluating format(d)
> Execution halted
>
> It seems that the best solution will be to patch Sys.timezone.
>
> --
> KM
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list