aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix 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.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu installer timezone)
  #:use-module (gnu installer utils)
  #:use-module (guix i18n)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module (ice-9 match)
  #:use-module (ice-9 receive)
  #:export (locate-children
            timezone->posix-tz
            timezone-has-child?
            zonetab->timezone-tree
            posix-tz->configuration))

(define %not-blank
  (char-set-complement char-set:blank))

(define (posix-tz->timezone tz)
  "Convert given TZ in Posix format like \"Europe/Paris\" into a list like
(\"Europe\" \"Paris\")."
  (string-split tz #\/))

(define (timezone->posix-tz timezone)
  "Convert given TIMEZONE like (\"Europe\" \"Paris\") into a Posix timezone
like \"Europe/Paris\"."
  (string-join timezone "/"))

(define (zonetab->timezones zonetab)
  "Parse ZONETAB file and return the corresponding list of timezones."

  (define (zonetab-line->posix-tz line)
    (let ((tokens (string-tokenize line %not-blank)))
      (match tokens
        ((code coordinates tz _ ...)
         tz))))

  (call-with-input-file zonetab
    (lambda (port)
      (let* ((lines (read-lines port))
             ;; Filter comment lines starting with '#' character.
             (tz-lines (filter (lambda (line)
                                 (not (eq? (string-ref line 0)
                                           #\#)))
                               lines)))
        (map (lambda (line)
               (posix-tz->timezone
                (zonetab-line->posix-tz line)))
             tz-lines)))))

(define (timezones->timezone-tree timezones)
  "Convert the list of timezones, TIMEZONES into a tree under the form:

	(\"America\" (\"North_Dakota\" \"New_Salem\" \"Center\"))

representing America/North_Dakota/New_Salem and America/North_Dakota/Center
timezones."

  (define (remove-first lists)
    "Remove the first element of every sublists in the argument LISTS."
    (map (lambda (list)
           (if (null? list) list (cdr list)))
         lists))

  (let loop ((cur-timezones timezones))
    (match cur-timezones
      (() '())
      (((region . rest-region) . rest-timezones)
       (if (null? rest-region)
           (cons (list region) (loop rest-timezones))
           (receive (same-region other-region)
               (partition (lambda (timezone)
                            (string=? (car timezone) region))
                          cur-timezones)
             (acons region
                    (loop (remove-first same-region))
                    (loop other-region))))))))

(define (locate-children tree path)
  "Return the children of the timezone indicated by PATH in the given
TREE. Raise a condition if the PATH could not be found."
  (let ((extract-proc (cut map car <>)))
    (match path
      (() (sort (extract-proc tree) string<?))
      ((region . rest)
       (or (and=> (assoc-ref tree region)
                  (cut locate-children <> rest))
           (raise
            (condition
             (&message
              (message
               (format #f (G_ "Unable to locate path: ~a.") path))))))))))

(define (timezone-has-child? tree timezone)
  "Return #t if the given TIMEZONE any child in TREE and #f otherwise."
  (not (null? (locate-children tree timezone))))

(define* (zonetab->timezone-tree zonetab)
  "Return the timezone tree corresponding to the given ZONETAB file."
  (timezones->timezone-tree (zonetab->timezones zonetab)))


;;;
;;; Configuration formatter.
;;;

(define (posix-tz->configuration timezone)
  "Return the configuration field for TIMEZONE."
  `((timezone ,timezone)))
>...* gnu/packages/libevent.scm (libuv): Update to 1.12.0. [license]: X11 should actually be EXPAT. Add CC-BY4.0. Marius Bakke 2017-05-02gnu: Avoid circular dependencies by Perl license....* guix/licenses.scm (perl-license): New variable. * gnu/packages/bioinformatics.scm: Change (package-license perl) to perl-license. * gnu/packages/compression.scm: Same. * gnu/packages/databases.scm: Same. * gnu/packages/gd.scm: Same. * gnu/packages/language.scm: Same. * gnu/packages/libevent.scm: Same. * gnu/packages/mail.scm: Same. * gnu/packages/messaging.scm: Same. * gnu/packages/ncurses.scm: Same. * gnu/packages/networking.scm: Same. * gnu/packages/photo.scm: Same. * gnu/packages/tcl.scm: Same. * gnu/packages/tex.scm: Same. * gnu/packages/tls.scm: Same. * gnu/packages/web.scm: Same. * gnu/packages/wm.scm: Same. * gnu/packages/xml.scm: Same. * gnu/packages/xorg.scm: Same. * gnu/packages/zip.scm: Same. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Petter 2017-04-24gnu: libevent: Disable regress tests....* gnu/packages/libevent.scm (libevent)[arguments]: Disable the 'regress' tests. Efraim Flashner 2017-04-17gnu: Fix typos in descriptions....* gnu/packages/admin.scm (di)[description]: Likewise. * gnu/packages/bioinformatics.scm (r-annotate)[description]: Likewise. * gnu/packages/datastructures.scm (sparsehash)[description]: Likewise. * gnu/packages/dns.scm (knot)[description]: Likewise. * gnu/packages/emacs.scm (emacs-idle-highlight)[synopsis, description]: Likewise. * gnu/packages/gnome.scm (libpeas)[description]: Likewise. * gnu/packages/gtk.scm (python2-pygtk)[description]: Likewise. * gnu/packages/kde-frameworks.scm (kactivities)[description]: Fix typo. * gnu/packages/libevent.scm (perl-anyevent)[description]: Likewise. * gnu/packages/machine-learning.scm (ghmm)[description]: Likewise. * gnu/packages/mail.scm (mlmmj)[description]: Likewise. * gnu/packages/maths.scm (vc)[description]: Likewise. * gnu/packages/music.scm (gx-super-fuzz-lv2)[description]: Likewise. * gnu/packages/networking.scm (nload)[description]: Likewise. * gnu/packages/python.scm (python-execnet)[description]: Likewise. * gnu/packages/terminals.scm (tilda)[description]: Likewise. * gnu/packages/python.scm (python-execnet, python-tables) (python2-coverage-test-runner, python2-rope)[description]: Likewise. Tobias Geerinckx-Rice 2017-03-19Merge branch 'master' into core-updatesMark H Weaver 2017-03-19gnu: libevent@2.0: Add fix from upstream....This fix was cherry-picked by Mozilla from upstream libevent-2.1 to its bundled copy of libevent-2.0.21 in mozilla-esr45. * gnu/packages/patches/libevent-2.0-evbuffer-add-use-last-with-datap.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/libevent.scm (libevent-2.0)[source][patches]: Add it. Mark H Weaver 2017-03-09Merge branch 'master' into core-updatesLudovic Courtès 2017-03-02gnu: Add perl-anyevent....* gnu/packages/libevent.scm (perl-anyevent): New variable. Marius Bakke 2017-03-02gnu: Add perl-ev....* gnu/packages/libevent.scm (perl-ev): New variable. Marius Bakke 2017-02-20Merge remote-tracking branch 'origin/master' into core-updatesEfraim Flashner 2017-02-13gnu: libuv: Update to 1.11.0....* gnu/packages/libevent.scm (libuv): Update to 1.11.0. [home-page]: Change to new home. Marius Bakke 2017-02-13gnu: libev: Update to 4.24....* gnu/packages/libevent.scm (libev): Update to 4.24. Marius Bakke 2017-02-02gnu: libevent-2.0: Include CVE IDs in patches....* gnu/packages/patches/libevent-2.0-evdns-fix-remote-stack-overread.patch, gnu/packages/patches/libevent-2.0-evutil-fix-buffer-overflow.patch, gnu/packages/patches/libevent-2.0-evdns-fix-searching-empty-hostnames.patch: Rename to ... * gnu/packages/patches/libevent-2.0-CVE-2016-10195.patch, gnu/packages/patches/libevent-2.0-CVE-2016-10196.patch, gnu/packages/patches/libevent-2.0-CVE-2016-10197.patch: ... new files. * gnu/local.mk (dist_patch_DATA): Adjust accordingly. * gnu/packages/libevent.scm (libevent-2.0)[sources]: Likewise. Leo Famulari 2017-02-01gnu: libevent: Skip tests that fail on 32bit....* gnu/packages/patches/libevent-2.1-skip-failing-test.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/libevent.scm (libevent)[source]: Use it. Marius Bakke 2017-02-01gnu: libevent: Update to 2.1.8 [security fixes]....* gnu/packages/libevent.scm (libevent): Update to 2.1.8. [inputs]: Change 'python-wrapper' to 'python-2'. Move 'which' to ... [native-inputs]: ... here. New field. (libevent-2.0): New variable. * gnu/packages/patches/libevent-2.1-dns-tests.patch, gnu/packages/patches/libevent-2.0-evdns-fix-remote-stack-overread.patch gnu/packages/patches/libevent-2.0-evdns-fix-searching-empty-hostnames.patch gnu/packages/patches/libevent-2.0-evutil-fix-buffer-overflow.patch: New files. * gnu/local.mk (dist_patch_DATA): Add them. * gnu/packages/gnuzilla.scm (icecat)[inputs]: Change 'libevent' to 'libevent-2.0'. Marius Bakke 2016-12-09gnu: libev: Update to 4.23....* gnu/packages/libevent.scm (libev): Update to 4.23. Marius Bakke