aboutsummaryrefslogtreecommitdiff
path: root/build-aux/mdate-from-git.scm
blob: 9c6ebd6dd9b3c2a81eb5b4920c61b63b65a830fd (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#! /bin/sh
# -*-scheme-*-
export LANG=C LANGUAGE=C LC_TIME=C
export TZ=UTC0
exec guile --no-auto-compile -L $srcdir -C $srcdir -e '(mdate-from-git)' -s "$0" "$@"
!#

;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; This program 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.
;;;
;;; This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

;;;; Commentary:
;;;
;;; Usage: mdate-from-git.scm FILE
;;;
;;; This script is compatible with Automake's `mdate-sh' but uses the timestamp
;;; from Git instead of from the file system.  Also, it can be appended to
;;; mdate-sh.

;;; As a special exception for Guix, it caters for doc/guix.LANG.texi files that
;;; are not stored in Git, by using po/doc/guix-manual.LANG.po for the Git
;;; timestamp.  Test doing something like:
;;;
;;; build-aux/mdate-from-git.scm doc/guix.de.texi
;;;
;;;; Code:

(define-module (mdate-from-git)
  #:use-module (ice-9 match)
  #:use-module (ice-9 popen)
  #:use-module (ice-9 rdelim)
  #:use-module (ice-9 regex)
  #:export (main))

(define (pipe-command command)
  (let* ((port (apply open-pipe* OPEN_READ command))
         (output (read-string port)))
    (close-port port)
    output))

(define (guix.LANG.texi->guix-manual.LANG.po file-name)
  "Translated manuals doc/guix.LANG.texi are not tracked in Git and are
generated from po/doc/guix-manual.LANG.po.  For such an untraced .TEXI file,
return its .PO counterpart."
  (let ((m (string-match "doc/guix.([^.]+).texi" file-name)))
    (if (not m) file-name
        (let ((lang (match:substring m 1)))
          (format #f "po/doc/guix-manual.~a.po" lang)))))


;;;
;;; Entry point.
;;;
(define (main args)
  (match args
    ((script file-name)
     (let* ((command `("git" "ls-files" "--error-unmatch" "--" ,file-name))
            (tracked? (zero? (with-error-to-port (%make-void-port "w")
                               (lambda _
                                 (with-output-to-port (%make-void-port "w")
                                   (lambda _ (apply system* command)))))))
            (file-name (if tracked? file-name
                           (guix.LANG.texi->guix-manual.LANG.po file-name)))
            (command `("git" "log" "--pretty=format:%ct" "-n1" "--" ,file-name))
            (timestamp (with-error-to-port  (%make-void-port "w")
                         (lambda _ (pipe-command command))))
            (source-date-epoch (or (getenv "SOURCE_DATE_EPOCH") "1"))
            (timestamp (if (string-null? timestamp) source-date-epoch
                           timestamp))
            (time (gmtime (string->number timestamp)))
            (d-m-y (strftime "%-d %B %Y" time)))
       (display d-m-y)))
    (_
     (format (current-error-port) "Usage: mdate-from-git.scm FILE\n")
     (exit 2))))
lds. (file-system->spec, spec->file-system): Adjust accordingly. * gnu/build/linux-boot.scm (mount-root-file-system): Take new SKIP-CHECK-IF-CLEAN? and REPAIR keyword arguments. Thread them through to CHECK-FILE-SYSTEM. * doc/guix.texi (File Systems): Document both new <file-system> options. Tobias Geerinckx-Rice 2021-07-18pack: Streamline how files are included in tarballs....Thanks to Guillem Jover <guillem@debian.org> on the OFTC's #debian-dpkg channel for helping with troubleshooting. Letting GNU Tar recursively walk the complete files hierarchy side-steps the risks associated with providing a list of file names: 1. Duplicated files in the archive (recorded as hard links by GNU Tar) 2. Missing parent directories. The above would cause dpkg to malfunction, for example by aborting early and skipping triggers when there were missing parent directories. * guix/scripts/pack.scm (self-contained-tarball/builder): Do not call POPULATE-SINGLE-PROFILE-DIRECTORY, which creates extraneous files such as /root. Instead, call POPULATE-STORE and INSTALL-DATABASE-AND-GC-ROOTS individually to more precisely generate the file system. Replace the list of files by the current directory, "." and streamline the way options are passed. * gnu/system/file-systems.scm (reduce-directories): Remove procedure. * tests/file-systems.scm ("reduce-directories"): Remove test. Maxim Cournoyer 2021-07-03file-systems: Ensure compared file names are both absolute or relative....* gnu/system/file-systems.scm (file-prefix?): Return #f unless both file names are absolute or relative. Reported-by: Ludovic Courtès <ludo@gnu.org> Maxim Cournoyer 2021-06-29pack: Prevent duplicate files in tar archives....Tar translate duplicate files in the archive into hard links. These can cause problems, as not every tool support them; for example dpkg doesn't. * gnu/system/file-systems.scm (reduce-directories): New procedure. (file-prefix?): Lift the restriction on file prefix. The procedure can be useful for comparing relative file names. Adjust doc. (file-name-depth): New procedure, extracted from ... (btrfs-store-subvolume-file-name): ... here. * guix/scripts/pack.scm (self-contained-tarball/builder): Use reduce-directories. * tests/file-systems.scm ("reduce-directories"): New test. Maxim Cournoyer