aboutsummaryrefslogtreecommitdiff
path: root/build-aux/generate-authors.scm
blob: 1dc882ff8aa1853fec6e15585f614227a6b7c433 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 Alex Kost <alezost@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/>.

;;;
;;; Generate AUTHORS file for directory with the Guix git repository.
;;;

(use-modules
 (ice-9 popen)
 (ice-9 rdelim)
 (ice-9 match)
 (srfi srfi-1)
 (guix config)
 (guix utils)
 (guix build utils))

(define %guix-dir
  (make-parameter #f))

(define-syntax-rule (append-maybe init-lst (test add-lst) ...)
  (let* ((lst init-lst)
         (lst (if test
                  (append lst add-lst)
                  lst))
         ...)
    lst))

(define (command-output cmd . args)
  "Execute CMD with ARGS and return its output without trailing newspace."
  (let* ((port (apply open-pipe* OPEN_READ cmd args))
         (output (read-string port)))
    (close-port port)
    (string-trim-right output #\newline)))

(define (git-output . args)
  "Execute git command with ARGS and return its output without trailing
newspace."
  (with-directory-excursion (%guix-dir)
    (apply command-output "git" args)))

(define* (contributors-string #:optional (range "HEAD"))
  "Return a string with names of people contributed to commit RANGE."
  (git-output "shortlog" "--numbered" "--summary" "--email" range))

(define* (tags #:key pattern sort)
  "Return a list of the git repository tags.
PATTERN is passed to '--list' and SORT is passed to '--sort' options of
'git tag' command."
  (let* ((args (append-maybe
                '("tag")
                (pattern (list "--list" pattern))
                (sort    (list "--sort" sort))))
         (output (apply git-output args)))
    (string-split output #\newline)))

(define (version-tags)
  "Return only version tags (v0.8, etc.) sorted from the biggest version
to the smallest one."
  (tags #:pattern "v*"
        #:sort "-version:refname"))

(define (generate-authors-file file)
  "Generate authors FILE."
  (define previous-release-tag
    (find (lambda (tag)
            (version>? %guix-version
                       (substring tag 1))) ; remove leading 'v'
          (version-tags)))

  (define release-range
    (string-append previous-release-tag "..HEAD"))

  (with-output-to-file file
    (lambda ()
      (display "\
GNU Guix consists of Scheme code that implements the deployment model
of the Nix package management tool.  In fact, it currently talks to a
build daemon whose code comes from Nix (see the manual for details.)

Nix was initially written by Eelco Dolstra; other people have been
contributing to it.  See `nix/AUTHORS' for details.\n\n")
      (format #t "Contributors to GNU Guix ~a:\n\n"
              %guix-version)
      (display (contributors-string release-range))
      (newline) (newline)
      (display "Overall contributors:\n\n")
      (display (contributors-string))
      (newline))))

(define (show-help)
  (match (command-line)
    ((me _ ...)
     (format #t "Usage: guile ~a DIRECTORY AUTHORS
Generate AUTHORS file for DIRECTORY with the Guix git repository.\n"
             me))))

(match (command-line)
  ((_ guix-dir authors-file)
   (parameterize ((%guix-dir guix-dir))
     (generate-authors-file authors-file)))
  (_
   (show-help)
   (exit 1)))

;;; generate-authors.scm ends here
ice\n" "alice\n" "id -un > logged-in\n")) (file-get-all-strings "/home/alice/logged-in"))) (test-equal "validate user environment" '("SEATD_SOCK=/run/seatd.sock" "XDG_RUNTIME_DIR=/run/user/1000" "XDG_SEAT=seat0" "XDG_VTNR=1") (begin (marionette-type "env > env\n" marionette) (sleep 1) (define user-env (string-tokenize (file-get-all-strings "/home/alice/env"))) (define (expected-var var) (any (lambda (s) (string-contains var s)) '("SEATD_SOCK" "XDG_RUNTIME_DIR" "XDG_SEAT" "XDG_VTNR"))) (sort (filter expected-var user-env) string<?))) (test-assert "validate SEATD_SOCK" (begin (marionette-type "env > env\n" marionette) (sleep 1) (define (sock-var? var) (any (lambda (s) (string-contains var s)) '("SEATD_SOCK"))) (define (sock-var-sock var) (car (cdr (string-split var #\=)))) (let* ((out (file-get-all-strings "/home/alice/env")) (out (string-tokenize out)) (out (filter sock-var? out)) (socks (map sock-var-sock out)) (socks (map wait-for-unix-socket-m socks))) (and (= 1 (length socks)) (every identity socks))))) (test-equal "seatd.sock ownership" '("root" "seat") `(,(marionette-eval '(passwd:name (getpwuid (stat:uid (stat "/run/seatd.sock")))) marionette) ,(marionette-eval '(group:name (getgrgid (stat:gid (stat "/run/seatd.sock")))) marionette))) (test-assert "greetd is ready" (begin (marionette-type "ps -C greetd -o pid,args --no-headers > ps-greetd\n" marionette) (sleep 1) (define (greetd-daemon? cmd) (string-contains cmd "config")) (define (greetd-cmd-to-pid cmd) (car (string-split cmd #\space))) (define (greetd-pid-to-sock pid) (string-append "/run/greetd-" pid ".sock")) (let* ((out (file-get-all-strings "/home/alice/ps-greetd")) (out (string-split out #\newline)) (out (map string-trim-both out)) (out (filter greetd-daemon? out)) (pids (map greetd-cmd-to-pid out)) (socks (map greetd-pid-to-sock pids)) (socks (map wait-for-unix-socket-m socks))) (every identity socks)))) ;; a bit weak, but tests everything at once actually (test-equal "check /run/user/<uid> mounted and writable" "alice\n" (begin (marionette-type "echo alice > /run/user/1000/test\n" marionette) (file-get-all-strings "/run/user/1000/test"))) (test-equal "check greeter user has correct groups" "greeter input video\n" (begin (marionette-type "id -Gn greeter > /run/user/1000/greeter-groups\n" marionette) (file-get-all-strings "/run/user/1000/greeter-groups"))) (test-assert "screendump" (begin (marionette-control (string-append "screendump " #$output "/tty1.ppm") marionette) (file-exists? "tty1.ppm"))) (test-end)))) (gexp->derivation "minimal-desktop" test)) (define %test-minimal-desktop (system-test (name "minimal-desktop") (description "Test whether we can log in when seatd and greetd is enabled") (value (let* ((os (marionette-operating-system (minimal-operating-system) #:imported-modules '((gnu services herd) (guix combinators)))) (vm (virtual-machine os))) (run-minimal-desktop-test (virtualized-operating-system os '()) #~(list #$vm))))))