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)))
packages/kde-frameworks.scm, * gnu/packages/kde-plasma.scm, * gnu/packages/language.scm, * gnu/packages/libreoffice.scm, * gnu/packages/linphone.scm, * gnu/packages/lisp.scm, * gnu/packages/llvm.scm, * gnu/packages/machine-learning.scm, * gnu/packages/minetest.scm, * gnu/packages/monitoring.scm, * gnu/packages/nfs.scm, * gnu/packages/ocr.scm, * gnu/packages/opencl.scm, * gnu/packages/pdf.scm, * gnu/packages/python-xyz.scm, * gnu/packages/racket.scm, * gnu/packages/rust.scm, * gnu/packages/syncthing.scm, * gnu/packages/syndication.scm, * gnu/packages/telegram.scm, * gnu/packages/vulkan.scm, * gnu/packages/web-browsers.scm, * gnu/packages/web.scm, * gnu/packages/webkit.scm: Remove some unecessary module imports. Efraim Flashner 2023-02-11gnu: qbe: Update to 1.1....* gnu/packages/c.scm (qbe): Update to 1.1. Signed-off-by: Nicolas Goaziou <mail@nicolasgoaziou.fr> jgart 2023-01-31gnu: c-intro-and-ref: Update to 0.0.0-1.47e5a23....* gnu/packages/c.scm (c-intro-and-ref): Update to commit 47e5a234a7c0. Signed-off-by: Christopher Baines <mail@cbaines.net> Hilton Chain 2023-01-22gnu: libhx: Update to 4.9....* gnu/packages/c.scm (libhx): Update to 4.9. Tobias Geerinckx-Rice 2023-01-15gnu: mimalloc: Update to 2.0.9....* gnu/packages/c.scm (mimalloc): Update to 2.0.9. Tobias Geerinckx-Rice 2022-12-11gnu: libhx: Update to 4.8....* gnu/packages/c.scm (libhx): Update to 4.8. Tobias Geerinckx-Rice 2022-12-11gnu: byacc: Update to 20221106....* gnu/packages/c.scm (byacc): Update to 20221106. Tobias Geerinckx-Rice 2022-11-13gnu: ck: Add support for riscv64-linux....* gnu/packages/c.scm (gnu-triplet->ck-machine target): Add case for riscv64. Efraim Flashner 2022-11-13gnu: mimalloc: Update to 2.0.7....* gnu/packages/c.scm (mimalloc): Update to 2.0.7. Efraim Flashner 2022-11-13gnu: Add c-intro-and-ref....* gnu/packages/c.scm (c-intro-and-ref): New variable. Maxim Cournoyer 2022-10-15gnu: Add tinydir....* gnu/packages/c.scm (tinydir): New variable. Signed-off-by: Liliana Marie Prikler <liliana.prikler@gmail.com> David Elsing 2022-09-28gnu: Add libdispatch....* gnu/packages/c.scm (libdispatch): New variable. Signed-off-by: Liliana Marie Prikler <liliana.prikler@gmail.com> Hilton Chain 2022-09-08gnu: Add mimalloc....* gnu/packages/c.scm (mimalloc): New variable. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Kristian Lein-Mathisen 2022-08-12gnu: packcc: Update to 1.8.0....* gnu/packages/c.scm (packcc): Update to 1.8.0. Efraim Flashner 2022-08-11gnu: pcc: Respect --without-tests....* gnu/packages/c.scm (pcc)[arguments]<#:phases>{check}: Respect the `tests?` argument. Signed-off-by: Mathieu Othacehe <othacehe@gnu.org> ( 2022-08-11gnu: pcc: Fix build....* gnu/packages/c.scm (pcc)[arguments]: Use gexps. <#:phases>{fix-multiple-definitions}: New phase. [native-inputs]: Adjust formatting. Signed-off-by: Mathieu Othacehe <othacehe@gnu.org> (