Merge branch 'master' into gnome-updates
This commit is contained in:
commit
6655a74326
5
.mailmap
5
.mailmap
|
@ -12,6 +12,7 @@ Ben Woodcroft <donttrustben@gmail.com> <b.woodcroft@uq.edu.au>
|
||||||
Ben Woodcroft <donttrustben@gmail.com> <donttrustben near gmail.com>
|
Ben Woodcroft <donttrustben@gmail.com> <donttrustben near gmail.com>
|
||||||
Claes Wallin (韋嘉誠) <claes.wallin@greatsinodevelopment.com>
|
Claes Wallin (韋嘉誠) <claes.wallin@greatsinodevelopment.com>
|
||||||
Cyprien Nicolas <cyprien@nicolas.tf> <c.nicolas+gitorious@gmail.com>
|
Cyprien Nicolas <cyprien@nicolas.tf> <c.nicolas+gitorious@gmail.com>
|
||||||
|
Danny Milosavljevic <dannym@scratchpost.org> <dannym+a@scratchpost.org>
|
||||||
David Thompson <davet@gnu.org> <dthompson2@worcester.edu>
|
David Thompson <davet@gnu.org> <dthompson2@worcester.edu>
|
||||||
David Thompson <davet@gnu.org> <dthompson@member.fsf.org>
|
David Thompson <davet@gnu.org> <dthompson@member.fsf.org>
|
||||||
David Thompson <davet@gnu.org> <dthompson@vistahigherlearning.com>
|
David Thompson <davet@gnu.org> <dthompson@vistahigherlearning.com>
|
||||||
|
@ -28,10 +29,12 @@ Ludovic Courtès <ludo@gnu.org> <ludovic.courtes@inria.fr>
|
||||||
Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org>
|
Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org>
|
||||||
Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org>
|
Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org>
|
||||||
Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
|
Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
|
||||||
Nils Gillmann <niasterisk@grrlz.net> <ng@niasterisk.space>
|
Nils Gillmann <ng0@libertad.pw> <niasterisk@grrlz.net>
|
||||||
|
Nils Gillmann <ng0@libertad.pw> <ng@niasterisk.space>
|
||||||
Pjotr Prins <pjotr.public01@thebird.nl>
|
Pjotr Prins <pjotr.public01@thebird.nl>
|
||||||
Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl>
|
Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl>
|
||||||
Raimon Grau <raimonster@gmail.com> <raimon@3scale.net>
|
Raimon Grau <raimonster@gmail.com> <raimon@3scale.net>
|
||||||
|
Raymond Nicholson <rain1@openmailbox.org>
|
||||||
Ricardo Wurmus <rekado@elephly.net>
|
Ricardo Wurmus <rekado@elephly.net>
|
||||||
Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de>
|
Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de>
|
||||||
Sou Bunnbu (宋文武) <iyzsong@gmail.com>
|
Sou Bunnbu (宋文武) <iyzsong@gmail.com>
|
||||||
|
|
17
Makefile.am
17
Makefile.am
|
@ -38,6 +38,7 @@ MODULES = \
|
||||||
guix/hash.scm \
|
guix/hash.scm \
|
||||||
guix/pk-crypto.scm \
|
guix/pk-crypto.scm \
|
||||||
guix/pki.scm \
|
guix/pki.scm \
|
||||||
|
guix/combinators.scm \
|
||||||
guix/utils.scm \
|
guix/utils.scm \
|
||||||
guix/sets.scm \
|
guix/sets.scm \
|
||||||
guix/download.scm \
|
guix/download.scm \
|
||||||
|
@ -231,6 +232,7 @@ SCM_TESTS = \
|
||||||
tests/ui.scm \
|
tests/ui.scm \
|
||||||
tests/records.scm \
|
tests/records.scm \
|
||||||
tests/upstream.scm \
|
tests/upstream.scm \
|
||||||
|
tests/combinators.scm \
|
||||||
tests/utils.scm \
|
tests/utils.scm \
|
||||||
tests/build-utils.scm \
|
tests/build-utils.scm \
|
||||||
tests/packages.scm \
|
tests/packages.scm \
|
||||||
|
@ -295,8 +297,11 @@ TESTS = $(SCM_TESTS) $(SH_TESTS)
|
||||||
|
|
||||||
AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" GUILE_AUTO_COMPILE=0
|
AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" GUILE_AUTO_COMPILE=0
|
||||||
|
|
||||||
SCM_LOG_DRIVER = $(top_builddir)/test-env $(GUILE) --no-auto-compile \
|
SCM_LOG_DRIVER = \
|
||||||
-e main $(top_srcdir)/build-aux/test-driver.scm
|
$(top_builddir)/test-env --quiet-stderr \
|
||||||
|
$(GUILE) --no-auto-compile -e main \
|
||||||
|
$(top_srcdir)/build-aux/test-driver.scm
|
||||||
|
|
||||||
AM_SCM_LOG_DRIVER_FLAGS = --brief=yes
|
AM_SCM_LOG_DRIVER_FLAGS = --brief=yes
|
||||||
|
|
||||||
SH_LOG_COMPILER = $(top_builddir)/test-env $(SHELL)
|
SH_LOG_COMPILER = $(top_builddir)/test-env $(SHELL)
|
||||||
|
@ -325,6 +330,13 @@ check-local:
|
||||||
|
|
||||||
endif !CAN_RUN_TESTS
|
endif !CAN_RUN_TESTS
|
||||||
|
|
||||||
|
check-system: $(GOBJECTS)
|
||||||
|
$(AM_V_at)echo "Running system tests..."
|
||||||
|
$(AM_V_at)$(top_builddir)/pre-inst-env \
|
||||||
|
$(GUILE) --no-auto-compile \
|
||||||
|
-e '(@@ (run-system-tests) run-system-tests)' \
|
||||||
|
$(top_srcdir)/build-aux/run-system-tests.scm
|
||||||
|
|
||||||
# Public key used to sign substitutes from hydra.gnu.org.
|
# Public key used to sign substitutes from hydra.gnu.org.
|
||||||
dist_pkgdata_DATA = hydra.gnu.org.pub
|
dist_pkgdata_DATA = hydra.gnu.org.pub
|
||||||
|
|
||||||
|
@ -349,6 +361,7 @@ EXTRA_DIST = \
|
||||||
build-aux/make-binary-tarball.scm \
|
build-aux/make-binary-tarball.scm \
|
||||||
build-aux/generate-authors.scm \
|
build-aux/generate-authors.scm \
|
||||||
build-aux/test-driver.scm \
|
build-aux/test-driver.scm \
|
||||||
|
build-aux/run-system-tests.scm \
|
||||||
srfi/srfi-37.scm.in \
|
srfi/srfi-37.scm.in \
|
||||||
srfi/srfi-64.scm \
|
srfi/srfi-64.scm \
|
||||||
srfi/srfi-64.upstream.scm \
|
srfi/srfi-64.upstream.scm \
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;;
|
||||||
|
;;; 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 (run-system-tests)
|
||||||
|
#:use-module (gnu tests base)
|
||||||
|
#:use-module (guix store)
|
||||||
|
#:use-module (guix monads)
|
||||||
|
#:use-module (guix derivations)
|
||||||
|
#:use-module (guix ui)
|
||||||
|
#:use-module (srfi srfi-1)
|
||||||
|
#:use-module (srfi srfi-34)
|
||||||
|
#:export (run-system-tests))
|
||||||
|
|
||||||
|
(define (built-derivations* drv)
|
||||||
|
(lambda (store)
|
||||||
|
(guard (c ((nix-protocol-error? c)
|
||||||
|
(values #f store)))
|
||||||
|
(values (build-derivations store drv) store))))
|
||||||
|
|
||||||
|
(define (filterm mproc lst) ;XXX: move to (guix monads)
|
||||||
|
(with-monad %store-monad
|
||||||
|
(>>= (foldm %store-monad
|
||||||
|
(lambda (item result)
|
||||||
|
(mlet %store-monad ((keep? (mproc item)))
|
||||||
|
(return (if keep?
|
||||||
|
(cons item result)
|
||||||
|
result))))
|
||||||
|
'()
|
||||||
|
lst)
|
||||||
|
(lift1 reverse %store-monad))))
|
||||||
|
|
||||||
|
(define %system-tests
|
||||||
|
(list %test-basic-os))
|
||||||
|
|
||||||
|
(define (run-system-tests . args)
|
||||||
|
(with-store store
|
||||||
|
(run-with-store store
|
||||||
|
(mlet* %store-monad ((drv (sequence %store-monad %system-tests))
|
||||||
|
(out -> (map derivation->output-path drv)))
|
||||||
|
(mbegin %store-monad
|
||||||
|
(show-what-to-build* drv)
|
||||||
|
(set-build-options* #:keep-going? #t #:keep-failed? #t)
|
||||||
|
(built-derivations* drv)
|
||||||
|
(mlet %store-monad ((valid (filterm (store-lift valid-path?)
|
||||||
|
out))
|
||||||
|
(failed (filterm (store-lift
|
||||||
|
(negate valid-path?))
|
||||||
|
out)))
|
||||||
|
(format #t "TOTAL: ~a\n" (length drv))
|
||||||
|
(for-each (lambda (item)
|
||||||
|
(format #t "PASS: ~a~%" item))
|
||||||
|
valid)
|
||||||
|
(for-each (lambda (item)
|
||||||
|
(format #t "FAIL: ~a~%" item))
|
||||||
|
failed)
|
||||||
|
(exit (null? failed))))))))
|
|
@ -29,12 +29,18 @@
|
||||||
# stdout.
|
# stdout.
|
||||||
unset CDPATH
|
unset CDPATH
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
--quiet-stderr)
|
||||||
|
# Silence the daemon's output, which is often useless, as well as that
|
||||||
|
# of Bash (such as "Terminated" messages when 'guix-daemon' is
|
||||||
|
# killed.)
|
||||||
|
exec 2> /dev/null
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
if [ -x "@abs_top_builddir@/guix-daemon" ]
|
if [ -x "@abs_top_builddir@/guix-daemon" ]
|
||||||
then
|
then
|
||||||
# Silence the daemon's output, which is often useless, as well as that of
|
|
||||||
# Bash (such as "Terminated" messages when 'guix-daemon' is killed.)
|
|
||||||
exec 2> /dev/null
|
|
||||||
|
|
||||||
NIX_STORE_DIR="@GUIX_TEST_ROOT@/store"
|
NIX_STORE_DIR="@GUIX_TEST_ROOT@/store"
|
||||||
|
|
||||||
# Do that because store.scm calls `canonicalize-path' on it.
|
# Do that because store.scm calls `canonicalize-path' on it.
|
||||||
|
|
|
@ -18,7 +18,8 @@ Copyright @copyright{} 2014 Pierre-Antoine Rault@*
|
||||||
Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@*
|
Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@*
|
||||||
Copyright @copyright{} 2015, 2016 Leo Famulari@*
|
Copyright @copyright{} 2015, 2016 Leo Famulari@*
|
||||||
Copyright @copyright{} 2016 Ben Woodcroft@*
|
Copyright @copyright{} 2016 Ben Woodcroft@*
|
||||||
Copyright @copyright{} 2016 Chris Marusich
|
Copyright @copyright{} 2016 Chris Marusich@*
|
||||||
|
Copyright @copyright{} 2016 Efraim Flashner
|
||||||
|
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||||
|
@ -7390,6 +7391,17 @@ Return a service that runs NetworkManager, a network connection manager
|
||||||
attempting to keep network connectivity active when available.
|
attempting to keep network connectivity active when available.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@cindex Connman
|
||||||
|
@deffn {Scheme Procedure} connman-service @
|
||||||
|
[#:connman @var{connman}]
|
||||||
|
Return a service that runs @url{https://01.org/connman,Connman}, a network
|
||||||
|
connection manager.
|
||||||
|
|
||||||
|
This service adds the @var{connman} package to the global profile, providing
|
||||||
|
several the @command{connmanctl} command to interact with the daemon and
|
||||||
|
configure networking."
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} ntp-service [#:ntp @var{ntp}] @
|
@deffn {Scheme Procedure} ntp-service [#:ntp @var{ntp}] @
|
||||||
[#:name-service @var{%ntp-servers}]
|
[#:name-service @var{%ntp-servers}]
|
||||||
Return a service that runs the daemon from @var{ntp}, the
|
Return a service that runs the daemon from @var{ntp}, the
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
(srfi srfi-19)
|
(srfi srfi-19)
|
||||||
(srfi srfi-26)
|
(srfi srfi-26)
|
||||||
(guix)
|
(guix)
|
||||||
|
(guix combinators)
|
||||||
(guix git-download)
|
(guix git-download)
|
||||||
(guix packages)
|
(guix packages)
|
||||||
(guix profiles)
|
(guix profiles)
|
||||||
|
|
|
@ -0,0 +1,206 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;;
|
||||||
|
;;; 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 build marionette)
|
||||||
|
#:use-module (srfi srfi-9)
|
||||||
|
#:use-module (srfi srfi-26)
|
||||||
|
#:use-module (rnrs io ports)
|
||||||
|
#:use-module (ice-9 match)
|
||||||
|
#:export (marionette?
|
||||||
|
make-marionette
|
||||||
|
marionette-eval
|
||||||
|
marionette-control
|
||||||
|
%qwerty-us-keystrokes
|
||||||
|
marionette-type))
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
;;;
|
||||||
|
;;; Instrumentation tools for QEMU virtual machines (VMs). A "marionette" is
|
||||||
|
;;; essentially a VM (a QEMU instance) with its monitor connected to a
|
||||||
|
;;; Unix-domain socket, and with a REPL inside the guest listening on a
|
||||||
|
;;; virtual console, which is itself connected to the host via a Unix-domain
|
||||||
|
;;; socket--these are the marionette's strings, connecting it to the almighty
|
||||||
|
;;; puppeteer.
|
||||||
|
;;;
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(define-record-type <marionette>
|
||||||
|
(marionette command pid monitor repl)
|
||||||
|
marionette?
|
||||||
|
(command marionette-command) ;list of strings
|
||||||
|
(pid marionette-pid) ;integer
|
||||||
|
(monitor marionette-monitor) ;port
|
||||||
|
(repl marionette-repl)) ;port
|
||||||
|
|
||||||
|
(define* (wait-for-monitor-prompt port #:key (quiet? #t))
|
||||||
|
"Read from PORT until we have seen all of QEMU's monitor prompt. When
|
||||||
|
QUIET? is false, the monitor's output is written to the current output port."
|
||||||
|
(define full-prompt
|
||||||
|
(string->list "(qemu) "))
|
||||||
|
|
||||||
|
(let loop ((prompt full-prompt)
|
||||||
|
(matches '())
|
||||||
|
(prefix '()))
|
||||||
|
(match prompt
|
||||||
|
(()
|
||||||
|
;; It's useful to set QUIET? so we don't display the echo of our own
|
||||||
|
;; commands.
|
||||||
|
(unless quiet?
|
||||||
|
(for-each (lambda (line)
|
||||||
|
(format #t "qemu monitor: ~a~%" line))
|
||||||
|
(string-tokenize (list->string (reverse prefix))
|
||||||
|
(char-set-complement (char-set #\newline))))))
|
||||||
|
((chr rest ...)
|
||||||
|
(let ((read (read-char port)))
|
||||||
|
(cond ((eqv? read chr)
|
||||||
|
(loop rest (cons read matches) prefix))
|
||||||
|
((eof-object? read)
|
||||||
|
(error "EOF while waiting for QEMU monitor prompt"
|
||||||
|
(list->string (reverse prefix))))
|
||||||
|
(else
|
||||||
|
(loop full-prompt
|
||||||
|
'()
|
||||||
|
(cons read (append matches prefix))))))))))
|
||||||
|
|
||||||
|
(define* (make-marionette command
|
||||||
|
#:key (socket-directory "/tmp") (timeout 20))
|
||||||
|
"Return a QEMU marionette--i.e., a virtual machine with open connections to the
|
||||||
|
QEMU monitor and to the guest's backdoor REPL."
|
||||||
|
(define (file->sockaddr file)
|
||||||
|
(make-socket-address AF_UNIX
|
||||||
|
(string-append socket-directory "/" file)))
|
||||||
|
|
||||||
|
(define extra-options
|
||||||
|
(list "-nographic"
|
||||||
|
"-monitor" (string-append "unix:" socket-directory "/monitor")
|
||||||
|
"-chardev" (string-append "socket,id=repl,path=" socket-directory
|
||||||
|
"/repl")
|
||||||
|
"-device" "virtio-serial"
|
||||||
|
"-device" "virtconsole,chardev=repl"))
|
||||||
|
|
||||||
|
(let ((monitor (socket AF_UNIX SOCK_STREAM 0))
|
||||||
|
(repl (socket AF_UNIX SOCK_STREAM 0)))
|
||||||
|
(bind monitor (file->sockaddr "monitor"))
|
||||||
|
(listen monitor 1)
|
||||||
|
(bind repl (file->sockaddr "repl"))
|
||||||
|
(listen repl 1)
|
||||||
|
|
||||||
|
(match (primitive-fork)
|
||||||
|
(0
|
||||||
|
(catch #t
|
||||||
|
(lambda ()
|
||||||
|
(close monitor)
|
||||||
|
(close repl)
|
||||||
|
(match command
|
||||||
|
((program . args)
|
||||||
|
(apply execl program program
|
||||||
|
(append args extra-options)))))
|
||||||
|
(lambda (key . args)
|
||||||
|
(print-exception (current-error-port)
|
||||||
|
(stack-ref (make-stack #t) 1)
|
||||||
|
key args)
|
||||||
|
(primitive-exit 1))))
|
||||||
|
(pid
|
||||||
|
(format #t "QEMU runs as PID ~a~%" pid)
|
||||||
|
(sigaction SIGALRM
|
||||||
|
(lambda (signum)
|
||||||
|
(display "time is up!\n") ;FIXME: break
|
||||||
|
#t))
|
||||||
|
(alarm timeout)
|
||||||
|
|
||||||
|
(match (accept monitor)
|
||||||
|
((monitor-conn . _)
|
||||||
|
(display "connected to QEMU's monitor\n")
|
||||||
|
(close-port monitor)
|
||||||
|
(wait-for-monitor-prompt monitor-conn)
|
||||||
|
(display "read QEMU monitor prompt\n")
|
||||||
|
(match (accept repl)
|
||||||
|
((repl-conn . addr)
|
||||||
|
(display "connected to guest REPL\n")
|
||||||
|
(close-port repl)
|
||||||
|
(match (read repl-conn)
|
||||||
|
('ready
|
||||||
|
(alarm 0)
|
||||||
|
(sigaction SIGALRM SIG_DFL)
|
||||||
|
(display "marionette is ready\n")
|
||||||
|
(marionette (append command extra-options) pid
|
||||||
|
monitor-conn repl-conn)))))))))))
|
||||||
|
|
||||||
|
(define (marionette-eval exp marionette)
|
||||||
|
"Evaluate EXP in MARIONETTE's backdoor REPL. Return the result."
|
||||||
|
(match marionette
|
||||||
|
(($ <marionette> command pid monitor repl)
|
||||||
|
(write exp repl)
|
||||||
|
(newline repl)
|
||||||
|
(read repl))))
|
||||||
|
|
||||||
|
(define (marionette-control command marionette)
|
||||||
|
"Run COMMAND in the QEMU monitor of MARIONETTE. COMMAND is a string such as
|
||||||
|
\"sendkey ctrl-alt-f1\" or \"screendump foo.ppm\" (info \"(qemu-doc)
|
||||||
|
pcsys_monitor\")."
|
||||||
|
(match marionette
|
||||||
|
(($ <marionette> _ _ monitor)
|
||||||
|
(display command monitor)
|
||||||
|
(newline monitor)
|
||||||
|
(wait-for-monitor-prompt monitor))))
|
||||||
|
|
||||||
|
(define %qwerty-us-keystrokes
|
||||||
|
;; Maps "special" characters to their keystrokes.
|
||||||
|
'((#\newline . "ret")
|
||||||
|
(#\space . "spc")
|
||||||
|
(#\- . "minus")
|
||||||
|
(#\+ . "shift-equal")
|
||||||
|
(#\* . "shift-8")
|
||||||
|
(#\= . "equal")
|
||||||
|
(#\? . "shift-slash")
|
||||||
|
(#\[ . "bracket_left")
|
||||||
|
(#\] . "bracket_right")
|
||||||
|
(#\( . "shift-9")
|
||||||
|
(#\) . "shift-0")
|
||||||
|
(#\/ . "slash")
|
||||||
|
(#\< . "less")
|
||||||
|
(#\> . "shift-less")
|
||||||
|
(#\. . "dot")
|
||||||
|
(#\, . "comma")
|
||||||
|
(#\; . "semicolon")
|
||||||
|
(#\bs . "backspace")
|
||||||
|
(#\tab . "tab")))
|
||||||
|
|
||||||
|
(define* (string->keystroke-commands str
|
||||||
|
#:optional
|
||||||
|
(keystrokes
|
||||||
|
%qwerty-us-keystrokes))
|
||||||
|
"Return a list of QEMU monitor commands to send the keystrokes corresponding
|
||||||
|
to STR. KEYSTROKES is an alist specifying a mapping from characters to
|
||||||
|
keystrokes."
|
||||||
|
(string-fold-right (lambda (chr result)
|
||||||
|
(cons (string-append "sendkey "
|
||||||
|
(or (assoc-ref keystrokes chr)
|
||||||
|
(string chr)))
|
||||||
|
result))
|
||||||
|
'()
|
||||||
|
str))
|
||||||
|
|
||||||
|
(define* (marionette-type str marionette
|
||||||
|
#:key (keystrokes %qwerty-us-keystrokes))
|
||||||
|
"Type STR on MARIONETTE's keyboard, using the KEYSTROKES alist to map characters
|
||||||
|
to actual keystrokes."
|
||||||
|
(for-each (cut marionette-control <> marionette)
|
||||||
|
(string->keystroke-commands str keystrokes)))
|
||||||
|
|
||||||
|
;;; marionette.scm ends here
|
14
gnu/local.mk
14
gnu/local.mk
|
@ -73,6 +73,7 @@ GNU_SYSTEM_MODULES = \
|
||||||
gnu/packages/compression.scm \
|
gnu/packages/compression.scm \
|
||||||
gnu/packages/conkeror.scm \
|
gnu/packages/conkeror.scm \
|
||||||
gnu/packages/conky.scm \
|
gnu/packages/conky.scm \
|
||||||
|
gnu/packages/connman.scm \
|
||||||
gnu/packages/cook.scm \
|
gnu/packages/cook.scm \
|
||||||
gnu/packages/cpio.scm \
|
gnu/packages/cpio.scm \
|
||||||
gnu/packages/cppi.scm \
|
gnu/packages/cppi.scm \
|
||||||
|
@ -398,7 +399,11 @@ GNU_SYSTEM_MODULES = \
|
||||||
gnu/build/linux-container.scm \
|
gnu/build/linux-container.scm \
|
||||||
gnu/build/linux-initrd.scm \
|
gnu/build/linux-initrd.scm \
|
||||||
gnu/build/linux-modules.scm \
|
gnu/build/linux-modules.scm \
|
||||||
gnu/build/vm.scm
|
gnu/build/marionette.scm \
|
||||||
|
gnu/build/vm.scm \
|
||||||
|
\
|
||||||
|
gnu/tests.scm \
|
||||||
|
gnu/tests/base.scm
|
||||||
|
|
||||||
|
|
||||||
patchdir = $(guilemoduledir)/gnu/packages/patches
|
patchdir = $(guilemoduledir)/gnu/packages/patches
|
||||||
|
@ -503,7 +508,6 @@ dist_patch_DATA = \
|
||||||
gnu/packages/patches/gmp-arm-asm-nothumb.patch \
|
gnu/packages/patches/gmp-arm-asm-nothumb.patch \
|
||||||
gnu/packages/patches/gmp-faulty-test.patch \
|
gnu/packages/patches/gmp-faulty-test.patch \
|
||||||
gnu/packages/patches/gnucash-price-quotes-perl.patch \
|
gnu/packages/patches/gnucash-price-quotes-perl.patch \
|
||||||
gnu/packages/patches/gnupg-simple-query-ignore-status-messages.patch \
|
|
||||||
gnu/packages/patches/gobject-introspection-absolute-shlib-path.patch \
|
gnu/packages/patches/gobject-introspection-absolute-shlib-path.patch \
|
||||||
gnu/packages/patches/gobject-introspection-cc.patch \
|
gnu/packages/patches/gobject-introspection-cc.patch \
|
||||||
gnu/packages/patches/gobject-introspection-girepository.patch \
|
gnu/packages/patches/gobject-introspection-girepository.patch \
|
||||||
|
@ -541,8 +545,6 @@ dist_patch_DATA = \
|
||||||
gnu/packages/patches/icu4c-CVE-2015-1270.patch \
|
gnu/packages/patches/icu4c-CVE-2015-1270.patch \
|
||||||
gnu/packages/patches/icu4c-CVE-2015-4760.patch \
|
gnu/packages/patches/icu4c-CVE-2015-4760.patch \
|
||||||
gnu/packages/patches/ilmbase-fix-tests.patch \
|
gnu/packages/patches/ilmbase-fix-tests.patch \
|
||||||
gnu/packages/patches/imagemagick-test-segv.patch \
|
|
||||||
gnu/packages/patches/imlib2-CVE-2016-4024.patch \
|
|
||||||
gnu/packages/patches/inkscape-drop-wait-for-targets.patch \
|
gnu/packages/patches/inkscape-drop-wait-for-targets.patch \
|
||||||
gnu/packages/patches/irrlicht-mesa-10.patch \
|
gnu/packages/patches/irrlicht-mesa-10.patch \
|
||||||
gnu/packages/patches/jasper-CVE-2007-2721.patch \
|
gnu/packages/patches/jasper-CVE-2007-2721.patch \
|
||||||
|
@ -753,10 +755,6 @@ dist_patch_DATA = \
|
||||||
gnu/packages/patches/ttfautohint-source-date-epoch.patch \
|
gnu/packages/patches/ttfautohint-source-date-epoch.patch \
|
||||||
gnu/packages/patches/tophat-build-with-later-seqan.patch \
|
gnu/packages/patches/tophat-build-with-later-seqan.patch \
|
||||||
gnu/packages/patches/torsocks-dns-test.patch \
|
gnu/packages/patches/torsocks-dns-test.patch \
|
||||||
gnu/packages/patches/tvtime-gcc41.patch \
|
|
||||||
gnu/packages/patches/tvtime-pngoutput.patch \
|
|
||||||
gnu/packages/patches/tvtime-videodev2.patch \
|
|
||||||
gnu/packages/patches/tvtime-xmltv.patch \
|
|
||||||
gnu/packages/patches/unzip-CVE-2014-8139.patch \
|
gnu/packages/patches/unzip-CVE-2014-8139.patch \
|
||||||
gnu/packages/patches/unzip-CVE-2014-8140.patch \
|
gnu/packages/patches/unzip-CVE-2014-8140.patch \
|
||||||
gnu/packages/patches/unzip-CVE-2014-8141.patch \
|
gnu/packages/patches/unzip-CVE-2014-8141.patch \
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix ui)
|
#:use-module (guix ui)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module ((guix build utils)
|
#:use-module ((guix build utils)
|
||||||
#:select ((package-name->name+version
|
#:select ((package-name->name+version
|
||||||
. hyphen-separated-name->name+version)))
|
. hyphen-separated-name->name+version)))
|
||||||
|
|
|
@ -486,9 +486,9 @@ connection alive.")
|
||||||
(define-public isc-dhcp
|
(define-public isc-dhcp
|
||||||
(let* ((bind-major-version "9")
|
(let* ((bind-major-version "9")
|
||||||
(bind-minor-version "9")
|
(bind-minor-version "9")
|
||||||
(bind-patch-version "8")
|
(bind-patch-version "9")
|
||||||
(bind-release-type "-P")
|
(bind-release-type "") ; for patch release, use "-P"
|
||||||
(bind-release-version "4")
|
(bind-release-version "") ; for patch release, e.g. "4"
|
||||||
(bind-version (string-append bind-major-version
|
(bind-version (string-append bind-major-version
|
||||||
"."
|
"."
|
||||||
bind-minor-version
|
bind-minor-version
|
||||||
|
@ -498,14 +498,14 @@ connection alive.")
|
||||||
bind-release-version)))
|
bind-release-version)))
|
||||||
(package
|
(package
|
||||||
(name "isc-dhcp")
|
(name "isc-dhcp")
|
||||||
(version "4.3.3-P1")
|
(version "4.3.4")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "http://ftp.isc.org/isc/dhcp/"
|
(uri (string-append "http://ftp.isc.org/isc/dhcp/"
|
||||||
version "/dhcp-" version ".tar.gz"))
|
version "/dhcp-" version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"08crcsmg4dm2v533aq3883ik8mf4vvvd6r998r4vrgx1zxnqj7n1"))))
|
"0zk0imll6bfyp9p4ndn8h6s4ifijnw5bhixswifr5rnk7pp5l4gm"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
`(#:parallel-build? #f
|
`(#:parallel-build? #f
|
||||||
|
@ -604,7 +604,7 @@ connection alive.")
|
||||||
"/bind-" bind-version ".tar.gz"))
|
"/bind-" bind-version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"1wl9kl0630dc1qjrf7fnp8cscagfm5qgmisi0zhr1p6iwi9bil2y"))))
|
"0w8qqm6p2y6x57j2l0a3278g173wd84dsr4py9z00191f3wra74q"))))
|
||||||
|
|
||||||
;; When cross-compiling, we need the cross Coreutils and sed.
|
;; When cross-compiling, we need the cross Coreutils and sed.
|
||||||
;; Otherwise just use those from %FINAL-INPUTS.
|
;; Otherwise just use those from %FINAL-INPUTS.
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
|
;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
|
||||||
;;; Copyright © 2014, 2015 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
|
;;; Copyright © 2014, 2015 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
|
||||||
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
||||||
|
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -24,7 +25,7 @@
|
||||||
|
|
||||||
(define-module (gnu packages base)
|
(define-module (gnu packages base)
|
||||||
#:use-module ((guix licenses)
|
#:use-module ((guix licenses)
|
||||||
#:select (gpl3+ lgpl2.0+ public-domain))
|
#:select (gpl3+ lgpl2.0+ lgpl3+ public-domain))
|
||||||
#:use-module (gnu packages)
|
#:use-module (gnu packages)
|
||||||
#:use-module (gnu packages acl)
|
#:use-module (gnu packages acl)
|
||||||
#:use-module (gnu packages bash)
|
#:use-module (gnu packages bash)
|
||||||
|
@ -936,6 +937,33 @@ reflect changes made by political bodies to time zone boundaries, UTC offsets,
|
||||||
and daylight-saving rules.")
|
and daylight-saving rules.")
|
||||||
(license public-domain)))
|
(license public-domain)))
|
||||||
|
|
||||||
|
(define-public libiconv
|
||||||
|
(package
|
||||||
|
(name "libiconv")
|
||||||
|
(version "1.14")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (string-append "mirror://gnu/libiconv/libiconv-"
|
||||||
|
version ".tar.gz"))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"04q6lgl3kglmmhw59igq1n7v3rp1rpkypl366cy1k1yn2znlvckj"))
|
||||||
|
(modules '((guix build utils)))
|
||||||
|
(snippet
|
||||||
|
;; Work around "declared gets" error on glibc systems (fixed by
|
||||||
|
;; Gnulib commit 66712c23388e93e5c518ebc8515140fa0c807348.)
|
||||||
|
'(substitute* "srclib/stdio.in.h"
|
||||||
|
(("^#undef gets") "")
|
||||||
|
(("^_GL_WARN_ON_USE \\(gets.*") "")))))
|
||||||
|
(build-system gnu-build-system)
|
||||||
|
(synopsis "Character set conversion library")
|
||||||
|
(description
|
||||||
|
"libiconv provides an implementation of the iconv function for systems
|
||||||
|
that lack it. iconv is used to convert between character encodings in a
|
||||||
|
program. It supports a wide variety of different encodings.")
|
||||||
|
(home-page "http://www.gnu.org/software/libiconv/")
|
||||||
|
(license lgpl3+)))
|
||||||
|
|
||||||
(define-public (canonical-package package)
|
(define-public (canonical-package package)
|
||||||
;; Avoid circular dependency by lazily resolving 'commencement'.
|
;; Avoid circular dependency by lazily resolving 'commencement'.
|
||||||
(let* ((iface (resolve-interface '(gnu packages commencement)))
|
(let* ((iface (resolve-interface '(gnu packages commencement)))
|
||||||
|
|
|
@ -318,3 +318,46 @@ without modification.")
|
||||||
completion for many common commands.")
|
completion for many common commands.")
|
||||||
(home-page "http://bash-completion.alioth.debian.org/")
|
(home-page "http://bash-completion.alioth.debian.org/")
|
||||||
(license gpl2+)))
|
(license gpl2+)))
|
||||||
|
|
||||||
|
(define-public bash-tap
|
||||||
|
(package
|
||||||
|
(name "bash-tap")
|
||||||
|
(version "1.0.2")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (string-append "https://github.com/illusori/bash-tap/"
|
||||||
|
"archive/" version ".tar.gz"))
|
||||||
|
(file-name (string-append name "-" version ".tar.gz"))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"0qs1qi38bl3ns4mpagcawv618dsk2q1lgrbddgvs0wl3ia12cyz5"))))
|
||||||
|
;; There is no compilation process to use this package, however, the bash
|
||||||
|
;; scripts installed by this package start with "#!/bin/bash". To fix
|
||||||
|
;; these lines, we use the patch-shebangs of the GNU build system. The
|
||||||
|
;; project does not use a Makefile.
|
||||||
|
(build-system gnu-build-system)
|
||||||
|
(arguments
|
||||||
|
`(#:tests? #f ; There is no test suite.
|
||||||
|
#:phases
|
||||||
|
(modify-phases %standard-phases
|
||||||
|
;; Because there are no configure scripts or Makefile, we can
|
||||||
|
;; remove these phases.
|
||||||
|
(delete 'configure)
|
||||||
|
(delete 'build)
|
||||||
|
;; The installation involves manually copying the files to a location.
|
||||||
|
;; To make them easily accessible by setting PATH, we add the scripts
|
||||||
|
;; to the "bin" folder.
|
||||||
|
(replace 'install
|
||||||
|
(lambda* (#:key outputs #:allow-other-keys)
|
||||||
|
(let ((bin (string-append (assoc-ref outputs "out") "/bin")))
|
||||||
|
(install-file "bash-tap" bin)
|
||||||
|
(install-file "bash-tap-bootstrap" bin)
|
||||||
|
(install-file "bash-tap-mock" bin)))))))
|
||||||
|
(home-page "http://www.illusori.co.uk/projects/bash-tap/")
|
||||||
|
(synopsis "Bash port of a Test::More/Test::Builder-style TAP-compliant
|
||||||
|
test library")
|
||||||
|
(description "Bash TAP is a TAP-compliant Test::More-style testing library
|
||||||
|
for Bash shell scripts and functions. Along with the Test::More-style testing
|
||||||
|
helpers it provides helper functions for mocking commands and in-process output
|
||||||
|
capturing.")
|
||||||
|
(license expat)))
|
||||||
|
|
|
@ -27,7 +27,8 @@
|
||||||
#:use-module (guix build-system trivial)
|
#:use-module (guix build-system trivial)
|
||||||
#:use-module ((guix store) #:select (add-to-store add-text-to-store))
|
#:use-module ((guix store) #:select (add-to-store add-text-to-store))
|
||||||
#:use-module ((guix derivations) #:select (derivation))
|
#:use-module ((guix derivations) #:select (derivation))
|
||||||
#:use-module (guix utils)
|
#:use-module ((guix utils) #:select (gnu-triplet->nix-system))
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
#:use-module (srfi srfi-26)
|
#:use-module (srfi srfi-26)
|
||||||
#:use-module (ice-9 match)
|
#:use-module (ice-9 match)
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
||||||
;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
|
;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
|
||||||
;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
|
||||||
|
;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -24,10 +25,13 @@
|
||||||
#:use-module (guix download)
|
#:use-module (guix download)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module ((guix licenses) #:select (lgpl2.1+ gpl2 gpl2+ gpl3+))
|
#:use-module ((guix licenses) #:select (lgpl2.1+ gpl2 gpl2+ gpl3+))
|
||||||
|
#:use-module (guix build-system cmake)
|
||||||
#:use-module (guix build-system gnu)
|
#:use-module (guix build-system gnu)
|
||||||
#:use-module (gnu packages)
|
#:use-module (gnu packages)
|
||||||
#:use-module (gnu packages acl)
|
#:use-module (gnu packages acl)
|
||||||
|
#:use-module (gnu packages bison)
|
||||||
#:use-module (gnu packages compression)
|
#:use-module (gnu packages compression)
|
||||||
|
#:use-module (gnu packages flex)
|
||||||
#:use-module (gnu packages gettext)
|
#:use-module (gnu packages gettext)
|
||||||
#:use-module (gnu packages gtk)
|
#:use-module (gnu packages gtk)
|
||||||
#:use-module (gnu packages man)
|
#:use-module (gnu packages man)
|
||||||
|
@ -230,16 +234,20 @@ capacity is user-selectable.")
|
||||||
(define-public libcue
|
(define-public libcue
|
||||||
(package
|
(package
|
||||||
(name "libcue")
|
(name "libcue")
|
||||||
(version "1.4.0")
|
(version "2.1.0")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "https://github.com/lipnitsk/libcue/releases/"
|
(uri (string-append
|
||||||
"download/v" version "/libcue-"
|
"https://github.com/lipnitsk/libcue/archive/v"
|
||||||
version ".tar.bz2"))
|
version ".tar.gz"))
|
||||||
|
(file-name (string-append name "-" version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"17kjd7rjz1bvfn44n3n2bjb7a1ywd0yc0g4sqp5ihf9b5bn7cwlb"))))
|
"1fradl3dx0pyy9rn1a0gak9gzgg40wax61f2s00zks7rwl0xv398"))))
|
||||||
(build-system gnu-build-system)
|
(build-system cmake-build-system)
|
||||||
|
(native-inputs
|
||||||
|
`(("bison" ,bison)
|
||||||
|
("flex" ,flex)))
|
||||||
(home-page "https://github.com/lipnitsk/libcue")
|
(home-page "https://github.com/lipnitsk/libcue")
|
||||||
(synopsis "C library to parse cue sheets")
|
(synopsis "C library to parse cue sheets")
|
||||||
(description "Libcue is a C library to parse so-called @dfn{cue sheets}
|
(description "Libcue is a C library to parse so-called @dfn{cue sheets}
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
||||||
|
;;;
|
||||||
|
;;; 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 packages connman)
|
||||||
|
#:use-module (guix packages)
|
||||||
|
#:use-module (guix download)
|
||||||
|
#:use-module (guix build-system gnu)
|
||||||
|
#:use-module (guix licenses)
|
||||||
|
#:use-module (guix utils)
|
||||||
|
#:use-module (gnu packages)
|
||||||
|
#:use-module (gnu packages admin)
|
||||||
|
#:use-module (gnu packages glib)
|
||||||
|
#:use-module (gnu packages linux)
|
||||||
|
#:use-module (gnu packages pkg-config)
|
||||||
|
#:use-module (gnu packages python)
|
||||||
|
#:use-module (gnu packages readline)
|
||||||
|
#:use-module (gnu packages samba)
|
||||||
|
#:use-module (gnu packages tls)
|
||||||
|
#:use-module (gnu packages vpn))
|
||||||
|
|
||||||
|
(define-public connman
|
||||||
|
(package
|
||||||
|
(name "connman")
|
||||||
|
(version "1.32")
|
||||||
|
(source
|
||||||
|
(origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (string-append "mirror://kernel.org/pub/linux/network/connman/"
|
||||||
|
name "-" version ".tar.xz"))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"0k4kw2j78gwxf0rq79a099qkzl6wi4v5i7rfs4rn0si0fd68d19i"))))
|
||||||
|
(build-system gnu-build-system)
|
||||||
|
(arguments
|
||||||
|
`(#:configure-flags
|
||||||
|
(list "--enable-nmcompat"
|
||||||
|
;; "--enable-polkit"
|
||||||
|
"--enable-openconnect"
|
||||||
|
"--enable-openvpn"
|
||||||
|
"--enable-vpnc"
|
||||||
|
"--enable-pptp"
|
||||||
|
"--enable-l2tp"
|
||||||
|
(string-append
|
||||||
|
"--with-dbusconfdir=" (assoc-ref %outputs "out") "/etc")
|
||||||
|
(string-append
|
||||||
|
"--with-dbusdatadir=" (assoc-ref %outputs "out") "/share"))))
|
||||||
|
(native-inputs
|
||||||
|
`(("pkg-config", pkg-config)
|
||||||
|
("python" ,python-2)))
|
||||||
|
(inputs
|
||||||
|
`(("dbus" ,dbus)
|
||||||
|
("glib" ,glib)
|
||||||
|
("gnutls" ,gnutls)
|
||||||
|
("iptables" ,iptables)
|
||||||
|
;; ("polkit" ,polkit) ; pkg-config cannot find polkit.pc
|
||||||
|
("readline" ,readline)
|
||||||
|
;; These inputs are needed for connman to include the interface to
|
||||||
|
;; these technologies so IF they are installed they can be used.
|
||||||
|
;; TODO: add neard, ofono
|
||||||
|
("openconnect" ,openconnect)
|
||||||
|
("openvpn" ,openvpn)
|
||||||
|
("ppp", ppp)
|
||||||
|
("vpnc" ,vpnc)
|
||||||
|
("wpa-supplicant" ,wpa-supplicant)))
|
||||||
|
(home-page "https://01.org/connman")
|
||||||
|
(synopsis "Connection management daemon")
|
||||||
|
(description "Connman provides a daemon for managing Internet connections.
|
||||||
|
The Connection Manager is designed to be slim and to use as few resources as
|
||||||
|
possible. It is fully modular system that can be extended through plug-ins.
|
||||||
|
The plug-in approach allows for easy adaption and modification for various use
|
||||||
|
cases. Connman implements DNS resolving and caching, DHCP clients for both
|
||||||
|
IPv4 and IPv6, link-local IPv4 address handling and tethering (IP connection
|
||||||
|
sharing) to clients via USB, ethernet, WiFi, cellular and Bluetooth.")
|
||||||
|
(license gpl2)))
|
|
@ -2,7 +2,7 @@
|
||||||
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;; Copyright © 2012, 2014, 2015 Andreas Enge <andreas@enge.fr>
|
;;; Copyright © 2012, 2014, 2015 Andreas Enge <andreas@enge.fr>
|
||||||
;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
|
;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
|
||||||
;;; Copyright © 2014 David Thompson <davet@gnu.org>
|
;;; Copyright © 2014, 2016 David Thompson <davet@gnu.org>
|
||||||
;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
|
;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
|
||||||
;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
|
;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
|
||||||
;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
|
;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
|
||||||
|
@ -863,14 +863,14 @@ similar to BerkeleyDB, LevelDB, etc.")
|
||||||
(define-public redis
|
(define-public redis
|
||||||
(package
|
(package
|
||||||
(name "redis")
|
(name "redis")
|
||||||
(version "3.0.7")
|
(version "3.2.0")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "http://download.redis.io/releases/redis-"
|
(uri (string-append "http://download.redis.io/releases/redis-"
|
||||||
version".tar.gz"))
|
version".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"08vzfdr67gp3lvk770qpax2c5g2sx8hn6p64jn3jddrvxb2939xj"))))
|
"0ql7zp061xr66a1dzpa6a0ijm8zm133dd364va7q5h8avkrim7wq"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
'(#:tests? #f ; tests related to master/slave and replication fail
|
'(#:tests? #f ; tests related to master/slave and replication fail
|
||||||
|
|
|
@ -66,14 +66,14 @@ and BOOTP/TFTP for network booting of diskless machines.")
|
||||||
(define-public bind-utils
|
(define-public bind-utils
|
||||||
(package
|
(package
|
||||||
(name "bind-utils")
|
(name "bind-utils")
|
||||||
(version "9.10.3-P4")
|
(version "9.10.4")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "http://ftp.isc.org/isc/bind9/" version
|
(uri (string-append "http://ftp.isc.org/isc/bind9/" version
|
||||||
"/bind-" version ".tar.gz"))
|
"/bind-" version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0giys46ifypysf799w9v58kbaz1v3fbdzw3s212znifzzfsl9h1a"))))
|
"0mmhzi4483mkak47wj255a36g3v0yilxwfwlbckr1hssinri5m7q"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(inputs
|
(inputs
|
||||||
;; it would be nice to add GeoIP and gssapi once there is package
|
;; it would be nice to add GeoIP and gssapi once there is package
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
|
;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
|
||||||
;;; Copyright © 2016 Albin Söderqvist <albin@fripost.org>
|
;;; Copyright © 2016 Albin Söderqvist <albin@fripost.org>
|
||||||
;;; Copyright © 2016 Kei Yamashita <kei@openmailbox.org>
|
;;; Copyright © 2016 Kei Yamashita <kei@openmailbox.org>
|
||||||
|
;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -1021,14 +1022,14 @@ falling, themeable graphics and sounds, and replays.")
|
||||||
(define-public wesnoth
|
(define-public wesnoth
|
||||||
(package
|
(package
|
||||||
(name "wesnoth")
|
(name "wesnoth")
|
||||||
(version "1.12.4")
|
(version "1.12.5")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "mirror://sourceforge/wesnoth/"
|
(uri (string-append "mirror://sourceforge/wesnoth/"
|
||||||
name "-" version ".tar.bz2"))
|
name "-" version ".tar.bz2"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"19qyylylaljhk45lk2ja0xp7cx9iy4hx07l65zkg20a2v9h50lmz"))))
|
"07d8ms9ayswg2g530p0zwmz3d77zv68l6nmc718iq9sbv90av6jr"))))
|
||||||
(build-system cmake-build-system)
|
(build-system cmake-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
'(#:tests? #f ; no check target
|
'(#:tests? #f ; no check target
|
||||||
|
|
|
@ -208,16 +208,14 @@ compatible to GNU Pth.")
|
||||||
(define-public gnupg
|
(define-public gnupg
|
||||||
(package
|
(package
|
||||||
(name "gnupg")
|
(name "gnupg")
|
||||||
(version "2.1.11")
|
(version "2.1.12")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "mirror://gnupg/gnupg/gnupg-" version
|
(uri (string-append "mirror://gnupg/gnupg/gnupg-" version
|
||||||
".tar.bz2"))
|
".tar.bz2"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"06mn2viiwsyq991arh5i5fhr9jyxq2bi0jkdj7ndfisxihngpc5p"))
|
"01n5py45x0r97l4dzmd803jpbpbcxr1591k3k4s8m9804jfr4d5c"))))
|
||||||
(patches (search-patches
|
|
||||||
"gnupg-simple-query-ignore-status-messages.patch"))))
|
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(native-inputs
|
(native-inputs
|
||||||
`(("pkg-config" ,pkg-config)))
|
`(("pkg-config" ,pkg-config)))
|
||||||
|
|
|
@ -459,7 +459,7 @@ compose, and analyze GIF images.")
|
||||||
(define-public imlib2
|
(define-public imlib2
|
||||||
(package
|
(package
|
||||||
(name "imlib2")
|
(name "imlib2")
|
||||||
(version "1.4.8")
|
(version "1.4.9")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append
|
(uri (string-append
|
||||||
|
@ -467,8 +467,7 @@ compose, and analyze GIF images.")
|
||||||
version ".tar.bz2"))
|
version ".tar.bz2"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0xxhgkd1axlcmf3kp1d7naiygparpg8l3sg3d263rhl2z0gm7aw9"))
|
"08809xxk2555yj6glixzw9a0x3x8cx55imd89kj3r0h152bn8a3x"))))
|
||||||
(patches (search-patches "imlib2-CVE-2016-4024.patch"))))
|
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(native-inputs
|
(native-inputs
|
||||||
`(("pkgconfig" ,pkg-config)))
|
`(("pkgconfig" ,pkg-config)))
|
||||||
|
|
|
@ -40,15 +40,14 @@
|
||||||
(define-public imagemagick
|
(define-public imagemagick
|
||||||
(package
|
(package
|
||||||
(name "imagemagick")
|
(name "imagemagick")
|
||||||
(version "6.9.2-1")
|
(version "6.9.3-10")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "mirror://imagemagick/ImageMagick-"
|
(uri (string-append "mirror://imagemagick/ImageMagick-"
|
||||||
version ".tar.xz"))
|
version ".tar.xz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"159afhqrj22jlz745ccbgnkdiwvn8pjcc96jic0iv9ms7gqxwln5"))
|
"0sik2jl1cywnpr5xm28mjhs1l8kxry65f3v2kqzp0cczhwf04gz3"))))
|
||||||
(patches (search-patches "imagemagick-test-segv.patch"))))
|
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
`(#:configure-flags '("--with-frozenpaths")
|
`(#:configure-flags '("--with-frozenpaths")
|
||||||
|
|
|
@ -897,7 +897,7 @@ decompression and random access decompression have been fully implemented.")
|
||||||
(description
|
(description
|
||||||
"QDox is a high speed, small footprint parser for extracting
|
"QDox is a high speed, small footprint parser for extracting
|
||||||
class/interface/method definitions from source files complete with JavaDoc
|
class/interface/method definitions from source files complete with JavaDoc
|
||||||
@code{@tags}. It is designed to be used by active code generators or
|
@code{@@tags}. It is designed to be used by active code generators or
|
||||||
documentation tools.")
|
documentation tools.")
|
||||||
(license license:asl2.0)))
|
(license license:asl2.0)))
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
(define-public jemalloc
|
(define-public jemalloc
|
||||||
(package
|
(package
|
||||||
(name "jemalloc")
|
(name "jemalloc")
|
||||||
(version "3.6.0")
|
(version "4.1.0")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append
|
(uri (string-append
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
name "-" version ".tar.bz2"))
|
name "-" version ".tar.bz2"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"1zl4vxxjvhg72bdl53sl0idz9wp18c6yzjdmqcnwm09wvmcj2v71"))))
|
"13pc6gcs5d6ws63jv83vslrb1vlqdnf1dg43awkb9bbj9xqnvl7s"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
;; XXX FIXME: Use gcc-4.8 on i686 to work around
|
;; XXX FIXME: Use gcc-4.8 on i686 to work around
|
||||||
;; <http://bugs.gnu.org/20856>.
|
;; <http://bugs.gnu.org/20856>.
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
|
;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
|
||||||
;;; Copyright © 2016 Raymond Nicholson <rain1@openmailbox.org>
|
;;; Copyright © 2016 Raymond Nicholson <rain1@openmailbox.org>
|
||||||
;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
|
;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
|
||||||
|
;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -63,6 +64,7 @@
|
||||||
#:use-module (gnu packages readline)
|
#:use-module (gnu packages readline)
|
||||||
#:use-module (gnu packages calendar)
|
#:use-module (gnu packages calendar)
|
||||||
#:use-module (gnu packages tls)
|
#:use-module (gnu packages tls)
|
||||||
|
#:use-module (gnu packages freedesktop)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix download)
|
#:use-module (guix download)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
@ -222,7 +224,7 @@ for SYSTEM and optionally VARIANT, or #f if there is no such configuration."
|
||||||
(search-path %load-path file)))
|
(search-path %load-path file)))
|
||||||
|
|
||||||
(define-public linux-libre
|
(define-public linux-libre
|
||||||
(let* ((version "4.5.2")
|
(let* ((version "4.5.3")
|
||||||
(build-phase
|
(build-phase
|
||||||
'(lambda* (#:key system inputs #:allow-other-keys #:rest args)
|
'(lambda* (#:key system inputs #:allow-other-keys #:rest args)
|
||||||
;; Avoid introducing timestamps
|
;; Avoid introducing timestamps
|
||||||
|
@ -300,7 +302,7 @@ for SYSTEM and optionally VARIANT, or #f if there is no such configuration."
|
||||||
(uri (linux-libre-urls version))
|
(uri (linux-libre-urls version))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0mw8n5pms33k3m3aamlryahrcbhfnqbzvkglgw3j4dhaja3hwr7n"))))
|
"1zb1qvbzkzih8fdfcvaxcgbhm5kckl6n8d312pbd478svx6fqi2s"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(supported-systems '("x86_64-linux" "i686-linux"))
|
(supported-systems '("x86_64-linux" "i686-linux"))
|
||||||
(native-inputs `(("perl" ,perl)
|
(native-inputs `(("perl" ,perl)
|
||||||
|
@ -337,13 +339,13 @@ It has been modified to remove all non-free binary blobs.")
|
||||||
(define-public linux-libre-4.4
|
(define-public linux-libre-4.4
|
||||||
(package
|
(package
|
||||||
(inherit linux-libre)
|
(inherit linux-libre)
|
||||||
(version "4.4.8")
|
(version "4.4.9")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (linux-libre-urls version))
|
(uri (linux-libre-urls version))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0zyhdy01gjglgmlrmpqa1sdnm0z91mzwspbksj6zvcamczb8ml53"))))
|
"04zwmqp5ib19jmbv2b1zzxdp4zhjkmx408mjky92dkyj33j43iki"))))
|
||||||
(native-inputs
|
(native-inputs
|
||||||
(let ((conf (kernel-config (or (%current-target-system)
|
(let ((conf (kernel-config (or (%current-target-system)
|
||||||
(%current-system))
|
(%current-system))
|
||||||
|
@ -354,13 +356,13 @@ It has been modified to remove all non-free binary blobs.")
|
||||||
(define-public linux-libre-4.1
|
(define-public linux-libre-4.1
|
||||||
(package
|
(package
|
||||||
(inherit linux-libre)
|
(inherit linux-libre)
|
||||||
(version "4.1.22")
|
(version "4.1.23")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (linux-libre-urls version))
|
(uri (linux-libre-urls version))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0bn6qba7q4i3yn3zx2p56gawnb2gczrf4vyrjggirj4d60gvng7y"))))
|
"0f9ilyr05jmc3416sjy3n42zwch2h7mwg9wazaawjwc7905n8yy0"))))
|
||||||
(native-inputs
|
(native-inputs
|
||||||
(let ((conf (kernel-config (or (%current-target-system)
|
(let ((conf (kernel-config (or (%current-target-system)
|
||||||
(%current-system))
|
(%current-system))
|
||||||
|
@ -2591,3 +2593,53 @@ where they are less likely to cause damage to the spinning disc. Requires a
|
||||||
drive that supports the ATA/ATAPI-7 IDLE IMMEDIATE command with unload
|
drive that supports the ATA/ATAPI-7 IDLE IMMEDIATE command with unload
|
||||||
feature, and a laptop with an accelerometer. It has no effect on SSDs.")
|
feature, and a laptop with an accelerometer. It has no effect on SSDs.")
|
||||||
(license license:gpl2)))
|
(license license:gpl2)))
|
||||||
|
|
||||||
|
(define-public thinkfan
|
||||||
|
(package
|
||||||
|
(name "thinkfan")
|
||||||
|
(version "0.9.3")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (string-append "mirror://sourceforge/thinkfan/"
|
||||||
|
version "/thinkfan-" version ".tar.gz"))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"0nz4c48f0i0dljpk5y33c188dnnwg8gz82s4grfl8l64jr4n675n"))
|
||||||
|
(modules '((guix build utils)))
|
||||||
|
;; Fix erroneous man page location in Makefile leading to
|
||||||
|
;; a compilation failure.
|
||||||
|
(snippet
|
||||||
|
'(substitute* "CMakeLists.txt"
|
||||||
|
(("thinkfan\\.1") "src/thinkfan.1")))))
|
||||||
|
(build-system cmake-build-system)
|
||||||
|
(arguments
|
||||||
|
`(#:modules ((guix build cmake-build-system)
|
||||||
|
(guix build utils)
|
||||||
|
(srfi srfi-26))
|
||||||
|
#:tests? #f ;no test target
|
||||||
|
#:configure-flags
|
||||||
|
;; Enable reading temperatures from hard disks via S.M.A.R.T.
|
||||||
|
`("-DUSE_ATASMART:BOOL=ON")
|
||||||
|
#:phases
|
||||||
|
(modify-phases %standard-phases
|
||||||
|
;; Install scripts for various foreign init systems.
|
||||||
|
(add-after 'install 'install-rc-scripts
|
||||||
|
(lambda* (#:key outputs #:allow-other-keys)
|
||||||
|
(for-each (cute install-file <>
|
||||||
|
(string-append (assoc-ref outputs "out")
|
||||||
|
"/share/thinkfan"))
|
||||||
|
(find-files (string-append "../thinkfan-" ,version
|
||||||
|
"/rcscripts")
|
||||||
|
".*"))
|
||||||
|
#t)))))
|
||||||
|
(inputs
|
||||||
|
`(("libatasmart" ,libatasmart)))
|
||||||
|
(home-page "http://thinkfan.sourceforge.net/")
|
||||||
|
(synopsis "Simple fan control program")
|
||||||
|
(description
|
||||||
|
"Thinkfan is a simple fan control program. It reads temperatures,
|
||||||
|
checks them against configured limits and switches to appropriate (also
|
||||||
|
pre-configured) fan level. It requires a working @code{thinkpad_acpi} or any
|
||||||
|
other @code{hwmon} driver that enables temperature reading and fan control
|
||||||
|
from userspace.")
|
||||||
|
(license license:gpl3+)))
|
||||||
|
|
|
@ -177,14 +177,14 @@ aliasing facilities to work just as they would on normal mail.")
|
||||||
(define-public mutt
|
(define-public mutt
|
||||||
(package
|
(package
|
||||||
(name "mutt")
|
(name "mutt")
|
||||||
(version "1.6.0")
|
(version "1.6.1")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "ftp://ftp.mutt.org/pub/mutt/mutt-"
|
(uri (string-append "ftp://ftp.mutt.org/pub/mutt/mutt-"
|
||||||
version ".tar.gz"))
|
version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"06bc2drbgalkk68rzg7hq2v5m5qgjxff5357wg0419dpi8ivdbr9"))
|
"087dz1y9qhl4ikhsnnb4xmyvs82w6kx480w8zj130wdiqvn6rclq"))
|
||||||
(patches (search-patches "mutt-store-references.patch"))))
|
(patches (search-patches "mutt-store-references.patch"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(inputs
|
(inputs
|
||||||
|
@ -622,14 +622,14 @@ which can add many functionalities to the base client.")
|
||||||
(define-public msmtp
|
(define-public msmtp
|
||||||
(package
|
(package
|
||||||
(name "msmtp")
|
(name "msmtp")
|
||||||
(version "1.6.3")
|
(version "1.6.4")
|
||||||
(source
|
(source
|
||||||
(origin
|
(origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append
|
(uri (string-append
|
||||||
"mirror://sourceforge/msmtp/msmtp-" version ".tar.xz"))
|
"mirror://sourceforge/msmtp/msmtp-" version ".tar.xz"))
|
||||||
(sha256 (base32
|
(sha256 (base32
|
||||||
"0mbkflxv2swjz4185inis83v6pxcblpmapwjhgpc6wh7kh3bx0pr"))))
|
"1kfihblm769s4hv8iah5mqynqd6hfwlyz5rcg2v423a4llic0jcv"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(inputs
|
(inputs
|
||||||
`(("libidn" ,libidn)
|
`(("libidn" ,libidn)
|
||||||
|
|
|
@ -45,8 +45,10 @@
|
||||||
#:use-module (gnu packages check)
|
#:use-module (gnu packages check)
|
||||||
#:use-module (gnu packages compression)
|
#:use-module (gnu packages compression)
|
||||||
#:use-module (gnu packages curl)
|
#:use-module (gnu packages curl)
|
||||||
|
#:use-module (gnu packages cyrus-sasl)
|
||||||
#:use-module (gnu packages docbook)
|
#:use-module (gnu packages docbook)
|
||||||
#:use-module (gnu packages doxygen)
|
#:use-module (gnu packages doxygen)
|
||||||
|
#:use-module (gnu packages file)
|
||||||
#:use-module (gnu packages flex)
|
#:use-module (gnu packages flex)
|
||||||
#:use-module (gnu packages fltk)
|
#:use-module (gnu packages fltk)
|
||||||
#:use-module (gnu packages fonts)
|
#:use-module (gnu packages fonts)
|
||||||
|
@ -84,6 +86,7 @@
|
||||||
#:use-module (gnu packages tcl)
|
#:use-module (gnu packages tcl)
|
||||||
#:use-module (gnu packages texinfo)
|
#:use-module (gnu packages texinfo)
|
||||||
#:use-module (gnu packages texlive)
|
#:use-module (gnu packages texlive)
|
||||||
|
#:use-module (gnu packages tls)
|
||||||
#:use-module (gnu packages video)
|
#:use-module (gnu packages video)
|
||||||
#:use-module (gnu packages web)
|
#:use-module (gnu packages web)
|
||||||
#:use-module (gnu packages wxwidgets)
|
#:use-module (gnu packages wxwidgets)
|
||||||
|
@ -1541,3 +1544,44 @@ for improved Amiga ProTracker 2/3 compatibility.")
|
||||||
(home-page "http://milkytracker.org/")
|
(home-page "http://milkytracker.org/")
|
||||||
;; 'src/milkyplay' is under Modified BSD, the rest is under GPL3 or later.
|
;; 'src/milkyplay' is under Modified BSD, the rest is under GPL3 or later.
|
||||||
(license (list license:bsd-3 license:gpl3+))))
|
(license (list license:bsd-3 license:gpl3+))))
|
||||||
|
|
||||||
|
(define-public moc
|
||||||
|
(package
|
||||||
|
(name "moc")
|
||||||
|
(version "2.5.1")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (string-append "http://ftp.daper.net/pub/soft/"
|
||||||
|
name "/stable/"
|
||||||
|
name "-" version ".tar.bz2"))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"1wn4za08z64bhsgfhr9c0crfyvy8c3b6a337wx7gz19am5srqh8v"))))
|
||||||
|
(build-system gnu-build-system)
|
||||||
|
(inputs
|
||||||
|
`(("alsa-lib" ,alsa-lib)
|
||||||
|
("curl" ,curl)
|
||||||
|
("faad2" ,faad2)
|
||||||
|
("ffmpeg" ,ffmpeg)
|
||||||
|
("file" ,file)
|
||||||
|
("jack" ,jack-1)
|
||||||
|
("libid3tag" ,libid3tag)
|
||||||
|
("libltdl" ,libltdl)
|
||||||
|
("libmodplug" ,libmodplug)
|
||||||
|
("libmpcdec" ,libmpcdec)
|
||||||
|
("libmad" ,libmad)
|
||||||
|
("ncurses" ,ncurses)
|
||||||
|
("openssl" ,openssl)
|
||||||
|
("sasl" ,cyrus-sasl)
|
||||||
|
("speex" ,speex)
|
||||||
|
("taglib" ,taglib)
|
||||||
|
("wavpack" ,wavpack)
|
||||||
|
("zlib" ,zlib)))
|
||||||
|
(native-inputs
|
||||||
|
`(("pkg-config" ,pkg-config)))
|
||||||
|
(synopsis "Console audio player designed to be powerful and easy to use")
|
||||||
|
(description
|
||||||
|
"Music on Console is a console audio player that supports many file
|
||||||
|
formats, including most audio formats recognized by FFMpeg.")
|
||||||
|
(home-page "http://moc.daper.net")
|
||||||
|
(license license:gpl2+)))
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
(define-public ntp
|
(define-public ntp
|
||||||
(package
|
(package
|
||||||
(name "ntp")
|
(name "ntp")
|
||||||
(version "4.2.8p6")
|
(version "4.2.8p7")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append
|
(uri (string-append
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
"/ntp-" version ".tar.gz"))
|
"/ntp-" version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0j509gd0snj8dq15rhfv2v4wisfaabya1gmgqslk1kisawf0wgaq"))
|
"1p100856h17nb0kpnppy70nja57hbcc95h7shhxvw6mhl030rll1"))
|
||||||
(modules '((guix build utils)))
|
(modules '((guix build utils)))
|
||||||
(snippet
|
(snippet
|
||||||
'(begin
|
'(begin
|
||||||
|
|
|
@ -1,142 +0,0 @@
|
||||||
Copied from upstream:
|
|
||||||
http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=commitdiff;h=acac103ba5772ae738ce5409d17feab80596cde6
|
|
||||||
|
|
||||||
Fixes: https://debbugs.gnu.org/22558
|
|
||||||
Upstream bug: https://bugs.gnupg.org/gnupg/issue2229
|
|
||||||
|
|
||||||
From acac103ba5772ae738ce5409d17feab80596cde6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Neal H. Walfield" <neal@g10code.com>
|
|
||||||
Date: Fri, 12 Feb 2016 22:12:21 +0100
|
|
||||||
Subject: [PATCH] common: Change simple_query to ignore status messages.
|
|
||||||
|
|
||||||
* common/simple-pwquery.c (simple_query): Ignore status messages.
|
|
||||||
|
|
||||||
--
|
|
||||||
Signed-off-by: Neal H. Walfield <neal@g10code.com>
|
|
||||||
GnuPG-bug-id: 2229
|
|
||||||
---
|
|
||||||
common/simple-pwquery.c | 95 ++++++++++++++++++++++++++++++++++---------------
|
|
||||||
1 file changed, 67 insertions(+), 28 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/common/simple-pwquery.c b/common/simple-pwquery.c
|
|
||||||
index 90d04c0..b2d666c 100644
|
|
||||||
--- a/common/simple-pwquery.c
|
|
||||||
+++ b/common/simple-pwquery.c
|
|
||||||
@@ -618,6 +618,7 @@ simple_query (const char *query)
|
|
||||||
int fd = -1;
|
|
||||||
int nread;
|
|
||||||
char response[500];
|
|
||||||
+ int have = 0;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = agent_open (&fd);
|
|
||||||
@@ -628,40 +629,78 @@ simple_query (const char *query)
|
|
||||||
if (rc)
|
|
||||||
goto leave;
|
|
||||||
|
|
||||||
- /* get response */
|
|
||||||
- nread = readline (fd, response, 499);
|
|
||||||
- if (nread < 0)
|
|
||||||
- {
|
|
||||||
- rc = -nread;
|
|
||||||
- goto leave;
|
|
||||||
- }
|
|
||||||
- if (nread < 3)
|
|
||||||
+ while (1)
|
|
||||||
{
|
|
||||||
- rc = SPWQ_PROTOCOL_ERROR;
|
|
||||||
- goto leave;
|
|
||||||
- }
|
|
||||||
+ if (! have || ! strchr (response, '\n'))
|
|
||||||
+ /* get response */
|
|
||||||
+ {
|
|
||||||
+ nread = readline (fd, &response[have],
|
|
||||||
+ sizeof (response) - 1 /* NUL */ - have);
|
|
||||||
+ if (nread < 0)
|
|
||||||
+ {
|
|
||||||
+ rc = -nread;
|
|
||||||
+ goto leave;
|
|
||||||
+ }
|
|
||||||
+ have += nread;
|
|
||||||
+ if (have < 3)
|
|
||||||
+ {
|
|
||||||
+ rc = SPWQ_PROTOCOL_ERROR;
|
|
||||||
+ goto leave;
|
|
||||||
+ }
|
|
||||||
+ response[have] = 0;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- if (response[0] == 'O' && response[1] == 'K')
|
|
||||||
- /* OK, do nothing. */;
|
|
||||||
- else if ((nread > 7 && !memcmp (response, "ERR 111", 7)
|
|
||||||
- && (response[7] == ' ' || response[7] == '\n') )
|
|
||||||
- || ((nread > 4 && !memcmp (response, "ERR ", 4)
|
|
||||||
- && (strtoul (response+4, NULL, 0) & 0xffff) == 99)) )
|
|
||||||
- {
|
|
||||||
- /* 111 is the old Assuan code for canceled which might still
|
|
||||||
- be in use by old installations. 99 is GPG_ERR_CANCELED as
|
|
||||||
- used by modern gpg-agents; 0xffff is used to mask out the
|
|
||||||
- error source. */
|
|
||||||
+ if (response[0] == 'O' && response[1] == 'K')
|
|
||||||
+ /* OK, do nothing. */;
|
|
||||||
+ else if ((nread > 7 && !memcmp (response, "ERR 111", 7)
|
|
||||||
+ && (response[7] == ' ' || response[7] == '\n') )
|
|
||||||
+ || ((nread > 4 && !memcmp (response, "ERR ", 4)
|
|
||||||
+ && (strtoul (response+4, NULL, 0) & 0xffff) == 99)) )
|
|
||||||
+ {
|
|
||||||
+ /* 111 is the old Assuan code for canceled which might still
|
|
||||||
+ be in use by old installations. 99 is GPG_ERR_CANCELED as
|
|
||||||
+ used by modern gpg-agents; 0xffff is used to mask out the
|
|
||||||
+ error source. */
|
|
||||||
#ifdef SPWQ_USE_LOGGING
|
|
||||||
- log_info (_("canceled by user\n") );
|
|
||||||
+ log_info (_("canceled by user\n") );
|
|
||||||
#endif
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
+ }
|
|
||||||
+ else if (response[0] == 'S' && response[1] == ' ')
|
|
||||||
+ {
|
|
||||||
+ char *nextline;
|
|
||||||
+ int consumed;
|
|
||||||
+
|
|
||||||
+ nextline = strchr (response, '\n');
|
|
||||||
+ if (! nextline)
|
|
||||||
+ /* Point to the NUL. */
|
|
||||||
+ nextline = &response[have];
|
|
||||||
+ else
|
|
||||||
+ /* Move past the \n. */
|
|
||||||
+ nextline ++;
|
|
||||||
+
|
|
||||||
+ consumed = (size_t) nextline - (size_t) response;
|
|
||||||
+
|
|
||||||
+ /* Skip any additional newlines. */
|
|
||||||
+ while (consumed < have && response[consumed] == '\n')
|
|
||||||
+ consumed ++;
|
|
||||||
+
|
|
||||||
+ have -= consumed;
|
|
||||||
+
|
|
||||||
+ if (have)
|
|
||||||
+ memmove (response, &response[consumed], have + 1);
|
|
||||||
+
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
#ifdef SPWQ_USE_LOGGING
|
|
||||||
- log_error (_("problem with the agent\n"));
|
|
||||||
+ log_error (_("problem with the agent (unexpected response \"%s\"\n"),
|
|
||||||
+ response);
|
|
||||||
#endif
|
|
||||||
- rc = SPWQ_ERR_RESPONSE;
|
|
||||||
+ rc = SPWQ_ERR_RESPONSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
|
|
||||||
leave:
|
|
||||||
--
|
|
||||||
2.6.3
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
This patch works around a segmentation fault in 'Magick++/tests/color' when
|
|
||||||
running 'Magick++/tests/tests.tap'. Here we get an exception early on, which
|
|
||||||
is supposedly harmless:
|
|
||||||
|
|
||||||
Caught exception: color: UnableToOpenConfigureFile `colors.xml' @ warning/configure.c/GetConfigureOptions/706
|
|
||||||
|
|
||||||
However, when the stack unwinders run, 'UnregisterDOTImage' gets called even
|
|
||||||
though 'RegisterDOTImage' hadn't been called yet; thus, 'graphic_context' in
|
|
||||||
coders/dot.c is NULL, leading to the segfault.
|
|
||||||
|
|
||||||
--- ImageMagick-6.9.2-1/coders/dot.c 2015-09-16 17:32:42.900323334 +0200
|
|
||||||
+++ ImageMagick-6.9.2-1/coders/dot.c 2015-09-16 17:32:48.312367636 +0200
|
|
||||||
@@ -240,6 +240,7 @@ ModuleExport void UnregisterDOTImage(voi
|
|
||||||
(void) UnregisterMagickInfo("GV");
|
|
||||||
(void) UnregisterMagickInfo("DOT");
|
|
||||||
#if defined(MAGICKCORE_GVC_DELEGATE)
|
|
||||||
+ if (graphic_context != NULL)
|
|
||||||
gvFreeContext(graphic_context);
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
Fix CVE-2016-4024 (integer overflow in lib/image.h).
|
|
||||||
|
|
||||||
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-4024
|
|
||||||
|
|
||||||
Upstream source:
|
|
||||||
https://git.enlightenment.org/legacy/imlib2.git/commit/?id=7eba2e4c8ac0e20838947f10f29d0efe1add8227
|
|
||||||
|
|
||||||
From 7eba2e4c8ac0e20838947f10f29d0efe1add8227 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Yuriy M. Kaminskiy" <yumkam@gmail.com>
|
|
||||||
Date: Wed, 6 Apr 2016 03:34:01 +0300
|
|
||||||
Subject: Fix integer overflow resulting in insufficient heap allocation
|
|
||||||
|
|
||||||
IMAGE_DIMENSIONS_OK ensures that image width and height are less then
|
|
||||||
46340, so that maximum number of pixels is ~2**31.
|
|
||||||
|
|
||||||
Unfortunately, there are a lot of code that allocates image data with
|
|
||||||
something like
|
|
||||||
|
|
||||||
malloc(w * h * sizeof(DATA32));
|
|
||||||
|
|
||||||
Obviously, on 32-bit machines this results in integer overflow,
|
|
||||||
insufficient heap allocation, with [massive] out-of-bounds heap
|
|
||||||
overwrite.
|
|
||||||
Either X_MAX should be reduced to 32767, or (w)*(h) should be checked to
|
|
||||||
not exceed ULONG_MAX/sizeof(DATA32).
|
|
||||||
|
|
||||||
Security implications:
|
|
||||||
*) for 32-bit machines: insufficient heap allocation and heap overwrite
|
|
||||||
in many image loaders, with escalation potential to remote code
|
|
||||||
execution;
|
|
||||||
*) for 64-bit machines: it seems, no impact.
|
|
||||||
---
|
|
||||||
src/lib/image.h | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/lib/image.h b/src/lib/image.h
|
|
||||||
index e9eb678..5fae6ed 100644
|
|
||||||
--- a/src/lib/image.h
|
|
||||||
+++ b/src/lib/image.h
|
|
||||||
@@ -188,7 +188,8 @@ void __imlib_SaveImage(ImlibImage * im, const char *file,
|
|
||||||
|
|
||||||
/* The maximum pixmap dimension is 65535. */
|
|
||||||
/* However, for now, use 46340 (46340^2 < 2^31) to avoid buffer overflow issues. */
|
|
||||||
-#define X_MAX_DIM 46340
|
|
||||||
+/* Reduced further to 32767, so that (w * h * sizeof(DATA32)) won't exceed ULONG_MAX */
|
|
||||||
+#define X_MAX_DIM 32767
|
|
||||||
|
|
||||||
#define IMAGE_DIMENSIONS_OK(w, h) \
|
|
||||||
( ((w) > 0) && ((h) > 0) && ((w) < X_MAX_DIM) && ((h) < X_MAX_DIM) )
|
|
||||||
--
|
|
||||||
cgit v0.12
|
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
Source: https://projects.archlinux.org/svntogit/community.git/tree/trunk/tvtime-1.0.2-gcc41.patch?h=packages/tvtime
|
|
||||||
|
|
||||||
--- tvtime-1.0.1/plugins/greedyh.asm 2005-08-14 18:16:43.000000000 +0200
|
|
||||||
+++ tvtime-1.0.1-gcc41/plugins/greedyh.asm 2005-11-28 17:53:09.210774544 +0100
|
|
||||||
@@ -18,7 +18,7 @@
|
|
||||||
|
|
||||||
#include "x86-64_macros.inc"
|
|
||||||
|
|
||||||
-void DScalerFilterGreedyH::FUNCT_NAME(TDeinterlaceInfo* pInfo)
|
|
||||||
+void FUNCT_NAME(TDeinterlaceInfo* pInfo)
|
|
||||||
{
|
|
||||||
int64_t i;
|
|
||||||
bool InfoIsOdd = (pInfo->PictureHistory[0]->Flags & PICTURE_INTERLACED_ODD) ? 1 : 0;
|
|
||||||
diff -Naur tvtime-1.0.1/plugins/tomsmocomp/TomsMoCompAll2.inc tvtime-1.0.1-gcc41/plugins/tomsmocomp/TomsMoCompAll2.inc
|
|
||||||
--- tvtime-1.0.1/plugins/tomsmocomp/TomsMoCompAll2.inc 2004-10-20 17:31:05.000000000 +0200
|
|
||||||
+++ tvtime-1.0.1-gcc41/plugins/tomsmocomp/TomsMoCompAll2.inc 2005-11-28 17:53:33.251119856 +0100
|
|
||||||
@@ -5,9 +5,9 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_STRANGE_BOB
|
|
||||||
-#define SEARCH_EFFORT_FUNC(n) DScalerFilterTomsMoComp::SEFUNC(n##_SB)
|
|
||||||
+#define SEARCH_EFFORT_FUNC(n) SEFUNC(n##_SB)
|
|
||||||
#else
|
|
||||||
-#define SEARCH_EFFORT_FUNC(n) DScalerFilterTomsMoComp::SEFUNC(n)
|
|
||||||
+#define SEARCH_EFFORT_FUNC(n) SEFUNC(n)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int SEARCH_EFFORT_FUNC(0) // we don't try at all ;-)
|
|
||||||
diff -Naur tvtime-1.0.1/plugins/tomsmocomp.cpp tvtime-1.0.1-gcc41/plugins/tomsmocomp.cpp
|
|
||||||
--- tvtime-1.0.1/plugins/tomsmocomp.cpp 2004-10-20 19:38:04.000000000 +0200
|
|
||||||
+++ tvtime-1.0.1-gcc41/plugins/tomsmocomp.cpp 2005-11-28 17:52:53.862107896 +0100
|
|
||||||
@@ -31,7 +31,7 @@
|
|
||||||
|
|
||||||
#define IS_MMX
|
|
||||||
#define SSE_TYPE MMX
|
|
||||||
-#define FUNCT_NAME DScalerFilterTomsMoComp::filterDScaler_MMX
|
|
||||||
+#define FUNCT_NAME filterDScaler_MMX
|
|
||||||
#include "tomsmocomp/TomsMoCompAll.inc"
|
|
||||||
#undef IS_MMX
|
|
||||||
#undef SSE_TYPE
|
|
||||||
@@ -39,7 +39,7 @@
|
|
||||||
|
|
||||||
#define IS_3DNOW
|
|
||||||
#define SSE_TYPE 3DNOW
|
|
||||||
-#define FUNCT_NAME DScalerFilterTomsMoComp::filterDScaler_3DNOW
|
|
||||||
+#define FUNCT_NAME filterDScaler_3DNOW
|
|
||||||
#include "tomsmocomp/TomsMoCompAll.inc"
|
|
||||||
#undef IS_3DNOW
|
|
||||||
#undef SSE_TYPE
|
|
||||||
@@ -47,7 +47,7 @@
|
|
||||||
|
|
||||||
#define IS_SSE
|
|
||||||
#define SSE_TYPE SSE
|
|
||||||
-#define FUNCT_NAME DScalerFilterTomsMoComp::filterDScaler_SSE
|
|
||||||
+#define FUNCT_NAME filterDScaler_SSE
|
|
||||||
#include "tomsmocomp/TomsMoCompAll.inc"
|
|
||||||
#undef IS_SSE
|
|
||||||
#undef SSE_TYPE
|
|
|
@ -1,15 +0,0 @@
|
||||||
Source: https://sources.debian.net/src/tvtime/1.0.2-14/debian/patches/libpng.diff
|
|
||||||
|
|
||||||
From: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
|
|
||||||
Date: Mon, 14 May 2012 19:01:31 +0900
|
|
||||||
Prepares the package for libpng 1.5. Closes: #650582.
|
|
||||||
|
|
||||||
--- tvtime-1.0.2.orig/src/pngoutput.c
|
|
||||||
+++ tvtime-1.0.2/src/pngoutput.c
|
|
||||||
@@ -18,5 +18,6 @@
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
+#include <zlib.h>
|
|
||||||
#include <png.h>
|
|
||||||
#include "pngoutput.h"
|
|
|
@ -1,15 +0,0 @@
|
||||||
Fix compilation error: non-existing header file.
|
|
||||||
|
|
||||||
This is an excerpt from the debian patch:
|
|
||||||
http://http.debian.net/debian/pool/main/t/tvtime/tvtime_1.0.2-14.diff.gz
|
|
||||||
|
|
||||||
--- tvtime-1.0.2.orig/src/videodev2.h
|
|
||||||
+++ tvtime-1.0.2/src/videodev2.h
|
|
||||||
@@ -16,7 +16,6 @@
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
#include <linux/time.h> /* need struct timeval */
|
|
||||||
#endif
|
|
||||||
-#include <linux/compiler.h> /* need __user */
|
|
||||||
|
|
||||||
/* for kernel versions 2.4.26 and below: */
|
|
||||||
#ifndef __user
|
|
|
@ -1,28 +0,0 @@
|
||||||
Fix compilation error: conflicting types for 'locale_t'.
|
|
||||||
|
|
||||||
This is an excerpt from the debian patch ...
|
|
||||||
http://http.debian.net/debian/pool/main/t/tvtime/tvtime_1.0.2-14.diff.gz
|
|
||||||
|
|
||||||
--- tvtime-1.0.2.orig/src/xmltv.c
|
|
||||||
+++ tvtime-1.0.2/src/xmltv.c
|
|
||||||
@@ -118,9 +118,9 @@
|
|
||||||
typedef struct {
|
|
||||||
const char *code;
|
|
||||||
const char *name;
|
|
||||||
-} locale_t;
|
|
||||||
+} tvtime_locale_t;
|
|
||||||
|
|
||||||
-static locale_t locale_table[] = {
|
|
||||||
+static tvtime_locale_t locale_table[] = {
|
|
||||||
{"AA", "Afar"}, {"AB", "Abkhazian"}, {"AF", "Afrikaans"},
|
|
||||||
{"AM", "Amharic"}, {"AR", "Arabic"}, {"AS", "Assamese"},
|
|
||||||
{"AY", "Aymara"}, {"AZ", "Azerbaijani"}, {"BA", "Bashkir"},
|
|
||||||
@@ -168,7 +168,7 @@
|
|
||||||
{"XH", "Xhosa"}, {"YO", "Yoruba"}, {"ZH", "Chinese"},
|
|
||||||
{"ZU", "Zulu"} };
|
|
||||||
|
|
||||||
-const int num_locales = sizeof( locale_table ) / sizeof( locale_t );
|
|
||||||
+const int num_locales = sizeof( locale_table ) / sizeof( tvtime_locale_t );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Timezone parsing code based loosely on the algorithm in
|
|
|
@ -4,6 +4,7 @@
|
||||||
;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
|
;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
|
||||||
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
||||||
;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
|
;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
|
||||||
|
;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -98,7 +99,7 @@ be output in text, PostScript, PDF or HTML.")
|
||||||
(define-public r
|
(define-public r
|
||||||
(package
|
(package
|
||||||
(name "r")
|
(name "r")
|
||||||
(version "3.2.5")
|
(version "3.3.0")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "mirror://cran/src/base/R-"
|
(uri (string-append "mirror://cran/src/base/R-"
|
||||||
|
@ -106,7 +107,7 @@ be output in text, PostScript, PDF or HTML.")
|
||||||
version ".tar.gz"))
|
version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"1dc0iybjk9kr1nghz3fpir6mb9hb9rnrz9bgh00w5pg5vir5cx30"))))
|
"1r0i0cqs3p0vrpiwq0zg5kbrmja9rmaijyzf9f23v6d5n5ab2mlj"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
`(#:make-flags
|
`(#:make-flags
|
||||||
|
@ -120,10 +121,14 @@ be output in text, PostScript, PDF or HTML.")
|
||||||
;; Set default pager to "cat", because otherwise it is "false",
|
;; Set default pager to "cat", because otherwise it is "false",
|
||||||
;; making "help()" print nothing at all.
|
;; making "help()" print nothing at all.
|
||||||
(lambda _ (setenv "PAGER" "cat") #t))
|
(lambda _ (setenv "PAGER" "cat") #t))
|
||||||
(add-before
|
(add-before 'check 'set-timezone
|
||||||
'check 'set-timezone
|
|
||||||
;; Some tests require the timezone to be set.
|
;; Some tests require the timezone to be set.
|
||||||
(lambda _ (setenv "TZ" "UTC") #t))
|
(lambda* (#:key inputs #:allow-other-keys)
|
||||||
|
(setenv "TZ" "UTC")
|
||||||
|
(setenv "TZDIR"
|
||||||
|
(string-append (assoc-ref inputs "tzdata")
|
||||||
|
"/share/zoneinfo"))
|
||||||
|
#t))
|
||||||
(add-after 'build 'make-info
|
(add-after 'build 'make-info
|
||||||
(lambda _ (zero? (system* "make" "info"))))
|
(lambda _ (zero? (system* "make" "info"))))
|
||||||
(add-after 'build 'install-info
|
(add-after 'build 'install-info
|
||||||
|
@ -160,6 +165,8 @@ be output in text, PostScript, PDF or HTML.")
|
||||||
("xz" ,xz)))
|
("xz" ,xz)))
|
||||||
(inputs
|
(inputs
|
||||||
`(("cairo" ,cairo)
|
`(("cairo" ,cairo)
|
||||||
|
("curl" ,curl)
|
||||||
|
("tzdata" ,tzdata)
|
||||||
("gfortran" ,gfortran)
|
("gfortran" ,gfortran)
|
||||||
("icu4c" ,icu4c)
|
("icu4c" ,icu4c)
|
||||||
("libjpeg" ,libjpeg)
|
("libjpeg" ,libjpeg)
|
||||||
|
@ -252,6 +259,24 @@ purposes for which more comprehensive (and widely tested) libraries such as
|
||||||
OpenSSL should be used.")
|
OpenSSL should be used.")
|
||||||
(license license:gpl2+)))
|
(license license:gpl2+)))
|
||||||
|
|
||||||
|
(define-public r-estimability
|
||||||
|
(package
|
||||||
|
(name "r-estimability")
|
||||||
|
(version "1.1-1")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (cran-uri "estimability" version))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"049adh8i0ad0m0qln2ylqdxcs5v2q9zfignn2a50r5f93ip2ay6w"))))
|
||||||
|
(build-system r-build-system)
|
||||||
|
(home-page "http://cran.r-project.org/web/packages/estimability")
|
||||||
|
(synopsis "Tools for assessing estimability of linear predictions")
|
||||||
|
(description "Provides tools for determining estimability of linear
|
||||||
|
functions of regression coefficients, and 'epredict' methods that handle
|
||||||
|
non-estimable cases correctly.")
|
||||||
|
(license license:gpl2+)))
|
||||||
|
|
||||||
(define-public r-gtable
|
(define-public r-gtable
|
||||||
(package
|
(package
|
||||||
(name "r-gtable")
|
(name "r-gtable")
|
||||||
|
@ -1239,6 +1264,27 @@ inference for statistical models.")
|
||||||
`(("python2-setuptools" ,python2-setuptools)
|
`(("python2-setuptools" ,python2-setuptools)
|
||||||
,@(package-native-inputs stats))))))
|
,@(package-native-inputs stats))))))
|
||||||
|
|
||||||
|
(define-public r-coda
|
||||||
|
(package
|
||||||
|
(name "r-coda")
|
||||||
|
(version "0.18-1")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (cran-uri "coda" version))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"03sc780734zj2kqcm8lkyvf76fql0jbfhkblpn8l58zmb6cqi958"))))
|
||||||
|
(build-system r-build-system)
|
||||||
|
(propagated-inputs
|
||||||
|
`(("r-lattice" ,r-lattice)))
|
||||||
|
(home-page "http://cran.r-project.org/web/packages/coda")
|
||||||
|
(synopsis "This is a package for Output Analysis and Diagnostics for MCMC")
|
||||||
|
(description "This package provides functions for summarizing and plotting
|
||||||
|
the output from Markov Chain Monte Carlo (MCMC) simulations, as well as
|
||||||
|
diagnostic tests of convergence to the equilibrium distribution of the Markov
|
||||||
|
chain.")
|
||||||
|
(license license:gpl2+)))
|
||||||
|
|
||||||
(define-public r-xml2
|
(define-public r-xml2
|
||||||
(package
|
(package
|
||||||
(name "r-xml2")
|
(name "r-xml2")
|
||||||
|
@ -2393,6 +2439,25 @@ things. RSP is ideal for self-contained scientific reports and R package
|
||||||
vignettes.")
|
vignettes.")
|
||||||
(license license:lgpl2.1+)))
|
(license license:lgpl2.1+)))
|
||||||
|
|
||||||
|
(define-public r-mvtnorm
|
||||||
|
(package
|
||||||
|
(name "r-mvtnorm")
|
||||||
|
(version "1.0-5")
|
||||||
|
(source (origin
|
||||||
|
(method url-fetch)
|
||||||
|
(uri (cran-uri "mvtnorm" version))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"1pc1mi2h063gh4a40009xk5j6pf5bm4274i5kycln38dixsry3yh"))))
|
||||||
|
(build-system r-build-system)
|
||||||
|
(inputs
|
||||||
|
`(("gfortran" ,gfortran)))
|
||||||
|
(home-page "http://mvtnorm.R-forge.R-project.org")
|
||||||
|
(synopsis "Package for multivariate normal and t-distributions")
|
||||||
|
(description "This package can compute multivariate normal and
|
||||||
|
t-probabilities, quantiles, random deviates and densities.")
|
||||||
|
(license license:gpl2)))
|
||||||
|
|
||||||
(define-public r-matrixstats
|
(define-public r-matrixstats
|
||||||
(package
|
(package
|
||||||
(name "r-matrixstats")
|
(name "r-matrixstats")
|
||||||
|
|
|
@ -321,15 +321,16 @@ required structures.")
|
||||||
(define-public libressl
|
(define-public libressl
|
||||||
(package
|
(package
|
||||||
(name "libressl")
|
(name "libressl")
|
||||||
(version "2.3.3")
|
(version "2.3.4")
|
||||||
(source
|
(source
|
||||||
(origin
|
(origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append
|
(uri (string-append
|
||||||
"http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-"
|
"http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-"
|
||||||
version ".tar.gz"))
|
version ".tar.gz"))
|
||||||
(sha256 (base32
|
(sha256
|
||||||
"1a8anm8nsfyxds03csk738m2cmzjbsb867my1rz5ij3w31k32wvn"))))
|
(base32
|
||||||
|
"1ag65pbvdikqj5y1w780jicl3ngi9ld2332ki6794y0gcar3a4bs"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(native-search-paths
|
(native-search-paths
|
||||||
;; FIXME: These two variables must designate a single file or directory
|
;; FIXME: These two variables must designate a single file or directory
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -22,30 +22,29 @@
|
||||||
#:use-module (guix build-system gnu)
|
#:use-module (guix build-system gnu)
|
||||||
#:use-module ((guix licenses) #:prefix license:)
|
#:use-module ((guix licenses) #:prefix license:)
|
||||||
#:use-module (gnu packages)
|
#:use-module (gnu packages)
|
||||||
#:use-module (gnu packages xorg)
|
|
||||||
#:use-module (gnu packages image)
|
|
||||||
#:use-module (gnu packages compression)
|
#:use-module (gnu packages compression)
|
||||||
|
#:use-module (gnu packages fontutils)
|
||||||
|
#:use-module (gnu packages image)
|
||||||
|
#:use-module (gnu packages linux)
|
||||||
#:use-module (gnu packages xml)
|
#:use-module (gnu packages xml)
|
||||||
#:use-module (gnu packages fontutils))
|
#:use-module (gnu packages xorg))
|
||||||
|
|
||||||
(define-public tvtime
|
(define-public tvtime
|
||||||
(package
|
(package
|
||||||
(name "tvtime")
|
(name "tvtime")
|
||||||
(version "1.0.2")
|
(version "1.0.10")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "mirror://sourceforge/tvtime/tvtime-"
|
(uri (string-append
|
||||||
version ".tar.gz"))
|
"http://linuxtv.org/downloads/tvtime/tvtime-"
|
||||||
|
version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"08q5gzbyz0lxb730rz6d6amkzimlc7nanv6n50j2bpw4n2xa9wmf"))
|
"1mk6dni82n8jv5wsrrpqzcwrg9ccx9vijb5sbm7gqm2y0h40q5y9"))))
|
||||||
(patches (search-patches "tvtime-videodev2.patch"
|
|
||||||
"tvtime-pngoutput.patch"
|
|
||||||
"tvtime-xmltv.patch"
|
|
||||||
"tvtime-gcc41.patch"))))
|
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(inputs
|
(inputs
|
||||||
`(("libx11" ,libx11)
|
`(("alsa-lib" ,alsa-lib)
|
||||||
|
("libx11" ,libx11)
|
||||||
("libxext" ,libxext)
|
("libxext" ,libxext)
|
||||||
("libxt" ,libxt)
|
("libxt" ,libxt)
|
||||||
("libxtst" ,libxtst)
|
("libxtst" ,libxtst)
|
||||||
|
|
|
@ -605,14 +605,14 @@ control to Git repositories.")
|
||||||
(define-public mercurial
|
(define-public mercurial
|
||||||
(package
|
(package
|
||||||
(name "mercurial")
|
(name "mercurial")
|
||||||
(version "3.7.3")
|
(version "3.8.1")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "https://www.mercurial-scm.org/"
|
(uri (string-append "https://www.mercurial-scm.org/"
|
||||||
"release/mercurial-" version ".tar.gz"))
|
"release/mercurial-" version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0c2vkad9piqkggyk8y310rf619qgdfcwswnk3nv21mg2fhnw96f0"))))
|
"156m6269xdqq7mpw01c6b065k29xnb8b9lyzn1b0nlz5il2izkps"))))
|
||||||
(build-system python-build-system)
|
(build-system python-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
`(;; Restrict to Python 2, as Python 3 would require
|
`(;; Restrict to Python 2, as Python 3 would require
|
||||||
|
|
|
@ -109,14 +109,14 @@ and its related documentation.")
|
||||||
(define-public nginx
|
(define-public nginx
|
||||||
(package
|
(package
|
||||||
(name "nginx")
|
(name "nginx")
|
||||||
(version "1.8.1")
|
(version "1.10.0")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "http://nginx.org/download/nginx-"
|
(uri (string-append "http://nginx.org/download/nginx-"
|
||||||
version ".tar.gz"))
|
version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"1dwpyw4pvhj68vxramqxm8f79pqz9lrm8mvifbn49h3615ikqjwg"))))
|
"0kdyqa5xaxvhz6y75ixs05mzygk3kszzdq5h0gnlrg35vp1lgmlf"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(inputs `(("pcre" ,pcre)
|
(inputs `(("pcre" ,pcre)
|
||||||
("openssl" ,openssl)
|
("openssl" ,openssl)
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
|
;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
|
||||||
;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
|
;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
|
||||||
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
||||||
|
;;; Copyright © 2016 Al McElrath <hello@yrns.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
#:use-module (gnu packages base)
|
#:use-module (gnu packages base)
|
||||||
#:use-module (gnu packages pkg-config)
|
#:use-module (gnu packages pkg-config)
|
||||||
#:use-module (gnu packages perl)
|
#:use-module (gnu packages perl)
|
||||||
|
#:use-module (gnu packages pulseaudio)
|
||||||
#:use-module (gnu packages xorg)
|
#:use-module (gnu packages xorg)
|
||||||
#:use-module (gnu packages xdisorg)
|
#:use-module (gnu packages xdisorg)
|
||||||
#:use-module (gnu packages qt)
|
#:use-module (gnu packages qt)
|
||||||
|
@ -108,14 +110,14 @@ the leaves of a full binary tree.")
|
||||||
(define-public i3status
|
(define-public i3status
|
||||||
(package
|
(package
|
||||||
(name "i3status")
|
(name "i3status")
|
||||||
(version "2.9")
|
(version "2.10")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "http://i3wm.org/i3status/i3status-"
|
(uri (string-append "https://i3wm.org/i3status/i3status-"
|
||||||
version ".tar.bz2"))
|
version ".tar.bz2"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"1qwxbrga2fi5wf742hh9ajwa8b2kpzkjjnhjlz4wlpv21i80kss2"))))
|
"1497dsvb32z9xljmxz95dnyvsbayn188ilm3l4ys8m5h25vd1xfs"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
(arguments
|
(arguments
|
||||||
`(#:make-flags (list "CC=gcc" (string-append "PREFIX=" %output))
|
`(#:make-flags (list "CC=gcc" (string-append "PREFIX=" %output))
|
||||||
|
@ -128,10 +130,13 @@ the leaves of a full binary tree.")
|
||||||
("libconfuse" ,libconfuse)
|
("libconfuse" ,libconfuse)
|
||||||
("libyajl" ,libyajl)
|
("libyajl" ,libyajl)
|
||||||
("alsa-lib" ,alsa-lib)
|
("alsa-lib" ,alsa-lib)
|
||||||
("wireless-tools" ,wireless-tools)
|
("pulseaudio" ,pulseaudio)
|
||||||
|
("libnl" ,libnl)
|
||||||
("libcap" ,libcap)
|
("libcap" ,libcap)
|
||||||
("asciidoc" ,asciidoc)))
|
("asciidoc" ,asciidoc)))
|
||||||
(home-page "http://i3wm.org/i3status/")
|
(native-inputs
|
||||||
|
`(("pkg-config" ,pkg-config)))
|
||||||
|
(home-page "https://i3wm.org/i3status/")
|
||||||
(synopsis "Status bar for i3bar, dzen2, xmobar or similar programs")
|
(synopsis "Status bar for i3bar, dzen2, xmobar or similar programs")
|
||||||
(description "i3status is a small program for generating a status bar for
|
(description "i3status is a small program for generating a status bar for
|
||||||
i3bar, dzen2, xmobar or similar programs. It is designed to be very efficient
|
i3bar, dzen2, xmobar or similar programs. It is designed to be very efficient
|
||||||
|
@ -148,7 +153,7 @@ commands would.")
|
||||||
(version "4.12")
|
(version "4.12")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "http://i3wm.org/downloads/i3-"
|
(uri (string-append "https://i3wm.org/downloads/i3-"
|
||||||
version ".tar.bz2"))
|
version ".tar.bz2"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
|
@ -182,7 +187,7 @@ commands would.")
|
||||||
`(("which" ,which)
|
`(("which" ,which)
|
||||||
("perl" ,perl)
|
("perl" ,perl)
|
||||||
("pkg-config" ,pkg-config)))
|
("pkg-config" ,pkg-config)))
|
||||||
(home-page "http://i3wm.org/")
|
(home-page "https://i3wm.org/")
|
||||||
(synopsis "Improved tiling window manager")
|
(synopsis "Improved tiling window manager")
|
||||||
(description "A tiling window manager, completely written
|
(description "A tiling window manager, completely written
|
||||||
from scratch. i3 is primarily targeted at advanced users and
|
from scratch. i3 is primarily targeted at advanced users and
|
||||||
|
|
|
@ -17,12 +17,27 @@
|
||||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
(define-module (gnu services herd)
|
(define-module (gnu services herd)
|
||||||
#:use-module (guix ui)
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix utils)
|
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
#:use-module (srfi srfi-11)
|
#:use-module (srfi srfi-11)
|
||||||
|
#:use-module (srfi srfi-34)
|
||||||
|
#:use-module (srfi srfi-35)
|
||||||
#:use-module (ice-9 match)
|
#:use-module (ice-9 match)
|
||||||
#:export (current-services
|
#:export (shepherd-error?
|
||||||
|
service-not-found-error?
|
||||||
|
service-not-found-error-service
|
||||||
|
action-not-found-error?
|
||||||
|
action-not-found-error-service
|
||||||
|
action-not-found-error-action
|
||||||
|
action-exception-error?
|
||||||
|
action-exception-error-service
|
||||||
|
action-exception-error-action
|
||||||
|
action-exception-error-key
|
||||||
|
action-exception-error-arguments
|
||||||
|
unknown-shepherd-error?
|
||||||
|
unknown-shepherd-error-sexp
|
||||||
|
|
||||||
|
current-services
|
||||||
unload-services
|
unload-services
|
||||||
unload-service
|
unload-service
|
||||||
load-services
|
load-services
|
||||||
|
@ -61,31 +76,54 @@ return the socket."
|
||||||
(let ((connection (open-connection)))
|
(let ((connection (open-connection)))
|
||||||
body ...))
|
body ...))
|
||||||
|
|
||||||
(define (report-action-error error)
|
(define-condition-type &shepherd-error &error
|
||||||
"Report ERROR, an sexp received by a shepherd client in reply to COMMAND, a
|
shepherd-error?)
|
||||||
command object."
|
|
||||||
|
(define-condition-type &service-not-found-error &shepherd-error
|
||||||
|
service-not-found-error?
|
||||||
|
(service service-not-found-error-service))
|
||||||
|
|
||||||
|
(define-condition-type &action-not-found-error &shepherd-error
|
||||||
|
action-not-found-error?
|
||||||
|
(service action-not-found-error-service)
|
||||||
|
(action action-not-found-error-action))
|
||||||
|
|
||||||
|
(define-condition-type &action-exception-error &shepherd-error
|
||||||
|
action-exception-error?
|
||||||
|
(service action-exception-error-service)
|
||||||
|
(action action-exception-error-action)
|
||||||
|
(key action-exception-error-key)
|
||||||
|
(args action-exception-error-arguments))
|
||||||
|
|
||||||
|
(define-condition-type &unknown-shepherd-error &shepherd-error
|
||||||
|
unknown-shepherd-error?
|
||||||
|
(sexp unknown-shepherd-error-sexp))
|
||||||
|
|
||||||
|
(define (raise-shepherd-error error)
|
||||||
|
"Raise an error condition corresponding to ERROR, an sexp received by a
|
||||||
|
shepherd client in reply to COMMAND, a command object. Return #t if ERROR
|
||||||
|
does not denote an error."
|
||||||
(match error
|
(match error
|
||||||
(('error ('version 0 x ...) 'service-not-found service)
|
(('error ('version 0 x ...) 'service-not-found service)
|
||||||
(report-error (_ "service '~a' could not be found~%")
|
(raise (condition (&service-not-found-error
|
||||||
service))
|
(service service)))))
|
||||||
(('error ('version 0 x ...) 'action-not-found action service)
|
(('error ('version 0 x ...) 'action-not-found action service)
|
||||||
(report-error (_ "service '~a' does not have an action '~a'~%")
|
(raise (condition (&action-not-found-error
|
||||||
service action))
|
(service service)
|
||||||
|
(action action)))))
|
||||||
(('error ('version 0 x ...) 'action-exception action service
|
(('error ('version 0 x ...) 'action-exception action service
|
||||||
key (args ...))
|
key (args ...))
|
||||||
(report-error (_ "exception caught while executing '~a' \
|
(raise (condition (&action-exception-error
|
||||||
on service '~a':~%")
|
(service service)
|
||||||
action service)
|
(action action)
|
||||||
(print-exception (current-error-port) #f key args))
|
(key key) (args args)))))
|
||||||
(('error . _)
|
(('error . _)
|
||||||
(report-error (_ "something went wrong: ~s~%")
|
(raise (condition (&unknown-shepherd-error (sexp error)))))
|
||||||
error))
|
|
||||||
(#f ;not an error
|
(#f ;not an error
|
||||||
#t)))
|
#t)))
|
||||||
|
|
||||||
(define (display-message message)
|
(define (display-message message)
|
||||||
;; TRANSLATORS: Nothing to translate here.
|
(format (current-error-port) "shepherd: ~a~%" message))
|
||||||
(info (_ "shepherd: ~a~%") message))
|
|
||||||
|
|
||||||
(define* (invoke-action service action arguments cont)
|
(define* (invoke-action service action arguments cont)
|
||||||
"Invoke ACTION on SERVICE with ARGUMENTS. On success, call CONT with the
|
"Invoke ACTION on SERVICE with ARGUMENTS. On success, call CONT with the
|
||||||
|
@ -107,10 +145,10 @@ result. Otherwise return #f."
|
||||||
(('reply ('version 0 x ...) ('result y) ('error error)
|
(('reply ('version 0 x ...) ('result y) ('error error)
|
||||||
('messages messages))
|
('messages messages))
|
||||||
(for-each display-message messages)
|
(for-each display-message messages)
|
||||||
(report-action-error error)
|
(raise-shepherd-error error)
|
||||||
#f)
|
#f)
|
||||||
(x
|
(x
|
||||||
(warning (_ "invalid shepherd reply~%"))
|
;; invalid reply
|
||||||
#f))))
|
#f))))
|
||||||
|
|
||||||
(define-syntax-rule (with-shepherd-action service (action args ...)
|
(define-syntax-rule (with-shepherd-action service (action args ...)
|
||||||
|
@ -129,7 +167,8 @@ of pairs."
|
||||||
|
|
||||||
(define (current-services)
|
(define (current-services)
|
||||||
"Return two lists: the list of currently running services, and the list of
|
"Return two lists: the list of currently running services, and the list of
|
||||||
currently stopped services."
|
currently stopped services. Return #f and #f if the list of services could
|
||||||
|
not be obtained."
|
||||||
(with-shepherd-action 'root ('status) services
|
(with-shepherd-action 'root ('status) services
|
||||||
(match services
|
(match services
|
||||||
((('service ('version 0 _ ...) _ ...) ...)
|
((('service ('version 0 _ ...) _ ...) ...)
|
||||||
|
@ -144,7 +183,6 @@ currently stopped services."
|
||||||
'()
|
'()
|
||||||
services))
|
services))
|
||||||
(x
|
(x
|
||||||
(warning (_ "failed to obtain list of shepherd services~%"))
|
|
||||||
(values #f #f)))))
|
(values #f #f)))))
|
||||||
|
|
||||||
(define (unload-service service)
|
(define (unload-service service)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
|
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
|
||||||
|
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
#:use-module (gnu system shadow)
|
#:use-module (gnu system shadow)
|
||||||
#:use-module (gnu system pam)
|
#:use-module (gnu system pam)
|
||||||
#:use-module (gnu packages admin)
|
#:use-module (gnu packages admin)
|
||||||
|
#:use-module (gnu packages connman)
|
||||||
#:use-module (gnu packages linux)
|
#:use-module (gnu packages linux)
|
||||||
#:use-module (gnu packages tor)
|
#:use-module (gnu packages tor)
|
||||||
#:use-module (gnu packages messaging)
|
#:use-module (gnu packages messaging)
|
||||||
|
@ -45,7 +47,8 @@
|
||||||
tor-service
|
tor-service
|
||||||
bitlbee-service
|
bitlbee-service
|
||||||
wicd-service
|
wicd-service
|
||||||
network-manager-service))
|
network-manager-service
|
||||||
|
connman-service))
|
||||||
|
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;;
|
;;;
|
||||||
|
@ -652,4 +655,48 @@ and @command{wicd-curses} user interfaces."
|
||||||
that attempting to keep active network connectivity when available."
|
that attempting to keep active network connectivity when available."
|
||||||
(service network-manager-service-type network-manager))
|
(service network-manager-service-type network-manager))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Connman
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define %connman-activation
|
||||||
|
;; Activation gexp for Connman.
|
||||||
|
#~(begin
|
||||||
|
(use-modules (guix build utils))
|
||||||
|
(mkdir-p "/var/lib/connman/")
|
||||||
|
(mkdir-p "/var/lib/connman-vpn/")))
|
||||||
|
|
||||||
|
(define (connman-shepherd-service connman)
|
||||||
|
"Return a shepherd service for Connman"
|
||||||
|
(list (shepherd-service
|
||||||
|
(documentation "Run Connman")
|
||||||
|
(provision '(networking))
|
||||||
|
(requirement '(user-processes dbus-system loopback))
|
||||||
|
(start #~(make-forkexec-constructor
|
||||||
|
(list (string-append #$connman
|
||||||
|
"/sbin/connmand")
|
||||||
|
"-n" "-r")))
|
||||||
|
(stop #~(make-kill-destructor)))))
|
||||||
|
|
||||||
|
(define connman-service-type
|
||||||
|
(service-type (name 'connman)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension shepherd-root-service-type
|
||||||
|
connman-shepherd-service)
|
||||||
|
(service-extension dbus-root-service-type list)
|
||||||
|
(service-extension activation-service-type
|
||||||
|
(const %connman-activation))
|
||||||
|
;; Add connman to the system profile.
|
||||||
|
(service-extension profile-service-type list)))))
|
||||||
|
|
||||||
|
(define* (connman-service #:key (connman connman))
|
||||||
|
"Return a service that runs @url{https://01.org/connman,Connman}, a network
|
||||||
|
connection manager.
|
||||||
|
|
||||||
|
This service adds the @var{connman} package to the global profile, providing
|
||||||
|
several the @command{connmanctl} command to interact with the daemon and
|
||||||
|
configure networking."
|
||||||
|
(service connman-service-type connman))
|
||||||
|
|
||||||
;;; networking.scm ends here
|
;;; networking.scm ends here
|
||||||
|
|
|
@ -82,6 +82,8 @@
|
||||||
operating-system-file-systems
|
operating-system-file-systems
|
||||||
operating-system-store-file-system
|
operating-system-store-file-system
|
||||||
operating-system-activation-script
|
operating-system-activation-script
|
||||||
|
operating-system-user-accounts
|
||||||
|
operating-system-shepherd-service-names
|
||||||
|
|
||||||
operating-system-derivation
|
operating-system-derivation
|
||||||
operating-system-profile
|
operating-system-profile
|
||||||
|
@ -578,6 +580,22 @@ hardware-related operations as necessary when booting a Linux container."
|
||||||
;; BOOT is the script as a monadic value.
|
;; BOOT is the script as a monadic value.
|
||||||
(service-parameters boot)))
|
(service-parameters boot)))
|
||||||
|
|
||||||
|
(define (operating-system-user-accounts os)
|
||||||
|
"Return the list of user accounts of OS."
|
||||||
|
(let* ((services (operating-system-services os))
|
||||||
|
(account (fold-services services
|
||||||
|
#:target-type account-service-type)))
|
||||||
|
(filter user-account?
|
||||||
|
(service-parameters account))))
|
||||||
|
|
||||||
|
(define (operating-system-shepherd-service-names os)
|
||||||
|
"Return the list of Shepherd service names for OS."
|
||||||
|
(append-map shepherd-service-provision
|
||||||
|
(service-parameters
|
||||||
|
(fold-services (operating-system-services os)
|
||||||
|
#:target-type
|
||||||
|
shepherd-root-service-type))))
|
||||||
|
|
||||||
(define* (operating-system-derivation os #:key container?)
|
(define* (operating-system-derivation os #:key container?)
|
||||||
"Return a derivation that builds OS."
|
"Return a derivation that builds OS."
|
||||||
(let* ((services (operating-system-services os #:container? container?))
|
(let* ((services (operating-system-services os #:container? container?))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -166,9 +167,9 @@ fi
|
||||||
# Adjust the prompt depending on whether we're in 'guix environment'.
|
# Adjust the prompt depending on whether we're in 'guix environment'.
|
||||||
if [ -n \"$GUIX_ENVIRONMENT\" ]
|
if [ -n \"$GUIX_ENVIRONMENT\" ]
|
||||||
then
|
then
|
||||||
export PS1='\\u@\\h \\w [env]\\$ '
|
PS1='\\u@\\h \\w [env]\\$ '
|
||||||
else
|
else
|
||||||
export PS1='\\u@\\h \\w\\$ '
|
PS1='\\u@\\h \\w\\$ '
|
||||||
fi
|
fi
|
||||||
alias ls='ls -p --color'
|
alias ls='ls -p --color'
|
||||||
alias ll='ls -l'\n"))
|
alias ll='ls -l'\n"))
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
|
|
||||||
#:export (expression->derivation-in-linux-vm
|
#:export (expression->derivation-in-linux-vm
|
||||||
qemu-image
|
qemu-image
|
||||||
|
virtualized-operating-system
|
||||||
system-qemu-image
|
system-qemu-image
|
||||||
|
|
||||||
system-qemu-image/shared-store
|
system-qemu-image/shared-store
|
||||||
|
@ -468,7 +469,7 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
|
||||||
" -no-reboot -net nic,model=virtio \
|
" -no-reboot -net nic,model=virtio \
|
||||||
" #$@(map virtfs-option shared-fs) " \
|
" #$@(map virtfs-option shared-fs) " \
|
||||||
-net user \
|
-net user \
|
||||||
-serial stdio -vga std \
|
-vga std \
|
||||||
-drive file=" #$image
|
-drive file=" #$image
|
||||||
",if=virtio,cache=writeback,werror=report,readonly \
|
",if=virtio,cache=writeback,werror=report,readonly \
|
||||||
-m 256"))
|
-m 256"))
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;;
|
||||||
|
;;; 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 tests)
|
||||||
|
#:use-module (guix gexp)
|
||||||
|
#:use-module (gnu system)
|
||||||
|
#:use-module (gnu services)
|
||||||
|
#:use-module (gnu services shepherd)
|
||||||
|
#:export (backdoor-service-type
|
||||||
|
marionette-operating-system))
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
;;;
|
||||||
|
;;; This module provides the infrastructure to run operating system tests.
|
||||||
|
;;; The most important part of that is tools to instrument the OS under test,
|
||||||
|
;;; essentially allowing to run in a virtual machine controlled by the host
|
||||||
|
;;; system--hence the name "marionette".
|
||||||
|
;;;
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(define (marionette-shepherd-service imported-modules)
|
||||||
|
"Return the Shepherd service for the marionette REPL"
|
||||||
|
(define device
|
||||||
|
"/dev/hvc0")
|
||||||
|
|
||||||
|
(list (shepherd-service
|
||||||
|
(provision '(marionette))
|
||||||
|
(requirement '(udev)) ;so that DEVICE is available
|
||||||
|
(modules '((ice-9 match)
|
||||||
|
(srfi srfi-9 gnu)
|
||||||
|
(guix build syscalls)
|
||||||
|
(rnrs bytevectors)))
|
||||||
|
(imported-modules `((guix build syscalls)
|
||||||
|
,@imported-modules))
|
||||||
|
(start
|
||||||
|
#~(lambda ()
|
||||||
|
(define (clear-echo termios)
|
||||||
|
(set-field termios (termios-local-flags)
|
||||||
|
(logand (lognot (local-flags ECHO))
|
||||||
|
(termios-local-flags termios))))
|
||||||
|
|
||||||
|
(define (self-quoting? x)
|
||||||
|
(letrec-syntax ((one-of (syntax-rules ()
|
||||||
|
((_) #f)
|
||||||
|
((_ pred rest ...)
|
||||||
|
(or (pred x)
|
||||||
|
(one-of rest ...))))))
|
||||||
|
(one-of symbol? string? pair? null? vector?
|
||||||
|
bytevector? number? boolean?)))
|
||||||
|
|
||||||
|
(match (primitive-fork)
|
||||||
|
(0
|
||||||
|
(dynamic-wind
|
||||||
|
(const #t)
|
||||||
|
(lambda ()
|
||||||
|
(let* ((repl (open-file #$device "r+0"))
|
||||||
|
(termios (tcgetattr (fileno repl)))
|
||||||
|
(console (open-file "/dev/console" "r+0")))
|
||||||
|
;; Don't echo input back.
|
||||||
|
(tcsetattr (fileno repl) (tcsetattr-action TCSANOW)
|
||||||
|
(clear-echo termios))
|
||||||
|
|
||||||
|
;; Redirect output to the console.
|
||||||
|
(close-fdes 1)
|
||||||
|
(close-fdes 2)
|
||||||
|
(dup2 (fileno console) 1)
|
||||||
|
(dup2 (fileno console) 2)
|
||||||
|
(close-port console)
|
||||||
|
|
||||||
|
(display 'ready repl)
|
||||||
|
(let loop ()
|
||||||
|
(newline repl)
|
||||||
|
|
||||||
|
(match (read repl)
|
||||||
|
((? eof-object?)
|
||||||
|
(primitive-exit 0))
|
||||||
|
(expr
|
||||||
|
(catch #t
|
||||||
|
(lambda ()
|
||||||
|
(let ((result (primitive-eval expr)))
|
||||||
|
(write (if (self-quoting? result)
|
||||||
|
result
|
||||||
|
(object->string result))
|
||||||
|
repl)))
|
||||||
|
(lambda (key . args)
|
||||||
|
(print-exception (current-error-port)
|
||||||
|
(stack-ref (make-stack #t) 1)
|
||||||
|
key args)
|
||||||
|
(write #f repl)))))
|
||||||
|
(loop))))
|
||||||
|
(lambda ()
|
||||||
|
(primitive-exit 1))))
|
||||||
|
(pid
|
||||||
|
pid))))
|
||||||
|
(stop #~(make-kill-destructor)))))
|
||||||
|
|
||||||
|
(define marionette-service-type
|
||||||
|
;; This is the type of the "marionette" service, allowing a guest system to
|
||||||
|
;; be manipulated from the host. This marionette REPL is essentially a
|
||||||
|
;; universal marionette.
|
||||||
|
(service-type (name 'marionette-repl)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension shepherd-root-service-type
|
||||||
|
marionette-shepherd-service)))))
|
||||||
|
|
||||||
|
(define* (marionette-operating-system os
|
||||||
|
#:key (imported-modules '()))
|
||||||
|
"Return a marionetteed variant of OS such that OS can be used as a marionette
|
||||||
|
in a virtual machine--i.e., controlled from the host system."
|
||||||
|
(operating-system
|
||||||
|
(inherit os)
|
||||||
|
(services (cons (service marionette-service-type imported-modules)
|
||||||
|
(operating-system-user-services os)))))
|
||||||
|
|
||||||
|
;;; tests.scm ends here
|
|
@ -0,0 +1,168 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;;
|
||||||
|
;;; 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 tests base)
|
||||||
|
#:use-module (gnu tests)
|
||||||
|
#:use-module (gnu system)
|
||||||
|
#:use-module (gnu system grub)
|
||||||
|
#:use-module (gnu system file-systems)
|
||||||
|
#:use-module (gnu system shadow)
|
||||||
|
#:use-module (gnu system vm)
|
||||||
|
#:use-module (gnu services)
|
||||||
|
#:use-module (gnu services shepherd)
|
||||||
|
#:use-module (guix gexp)
|
||||||
|
#:use-module (guix store)
|
||||||
|
#:use-module (guix monads)
|
||||||
|
#:use-module (guix packages)
|
||||||
|
#:use-module (srfi srfi-1)
|
||||||
|
#:export (%test-basic-os))
|
||||||
|
|
||||||
|
(define %simple-os
|
||||||
|
(operating-system
|
||||||
|
(host-name "komputilo")
|
||||||
|
(timezone "Europe/Berlin")
|
||||||
|
(locale "en_US.UTF-8")
|
||||||
|
|
||||||
|
(bootloader (grub-configuration (device "/dev/sdX")))
|
||||||
|
(file-systems (cons (file-system
|
||||||
|
(device "my-root")
|
||||||
|
(title 'label)
|
||||||
|
(mount-point "/")
|
||||||
|
(type "ext4"))
|
||||||
|
%base-file-systems))
|
||||||
|
(firmware '())
|
||||||
|
|
||||||
|
(users (cons (user-account
|
||||||
|
(name "alice")
|
||||||
|
(comment "Bob's sister")
|
||||||
|
(group "users")
|
||||||
|
(supplementary-groups '("wheel" "audio" "video"))
|
||||||
|
(home-directory "/home/alice"))
|
||||||
|
%base-user-accounts))))
|
||||||
|
|
||||||
|
|
||||||
|
(define %test-basic-os
|
||||||
|
;; Monadic derivation that instruments %SIMPLE-OS, runs it in a VM, and runs
|
||||||
|
;; a series of basic functionality tests.
|
||||||
|
(mlet* %store-monad ((os -> (marionette-operating-system
|
||||||
|
%simple-os
|
||||||
|
#:imported-modules '((gnu services herd)
|
||||||
|
(guix combinators))))
|
||||||
|
(run (system-qemu-image/shared-store-script
|
||||||
|
os #:graphic? #f)))
|
||||||
|
(define test
|
||||||
|
#~(begin
|
||||||
|
(use-modules (gnu build marionette)
|
||||||
|
(srfi srfi-1)
|
||||||
|
(srfi srfi-26)
|
||||||
|
(srfi srfi-64)
|
||||||
|
(ice-9 match))
|
||||||
|
|
||||||
|
(define marionette
|
||||||
|
(make-marionette (list #$run)))
|
||||||
|
|
||||||
|
(mkdir #$output)
|
||||||
|
(chdir #$output)
|
||||||
|
|
||||||
|
(test-begin "basic")
|
||||||
|
|
||||||
|
(test-assert "uname"
|
||||||
|
(match (marionette-eval '(uname) marionette)
|
||||||
|
(#("Linux" "komputilo" version _ "x86_64")
|
||||||
|
(string-prefix? #$(package-version
|
||||||
|
(operating-system-kernel os))
|
||||||
|
version))))
|
||||||
|
|
||||||
|
(test-assert "shell and user commands"
|
||||||
|
;; Is everything in $PATH?
|
||||||
|
(zero? (marionette-eval '(system "
|
||||||
|
. /etc/profile
|
||||||
|
set -e -x
|
||||||
|
guix --version
|
||||||
|
ls --version
|
||||||
|
grep --version
|
||||||
|
info --version")
|
||||||
|
marionette)))
|
||||||
|
|
||||||
|
(test-assert "accounts"
|
||||||
|
(let ((users (marionette-eval '(begin
|
||||||
|
(use-modules (ice-9 match))
|
||||||
|
(let loop ((result '()))
|
||||||
|
(match (getpw)
|
||||||
|
(#f (reverse result))
|
||||||
|
(x (loop (cons x result))))))
|
||||||
|
marionette)))
|
||||||
|
(lset= string=?
|
||||||
|
(map passwd:name users)
|
||||||
|
(list
|
||||||
|
#$@(map user-account-name
|
||||||
|
(operating-system-user-accounts os))))))
|
||||||
|
|
||||||
|
(test-assert "shepherd services"
|
||||||
|
(let ((services (marionette-eval '(begin
|
||||||
|
(use-modules (gnu services herd))
|
||||||
|
(call-with-values current-services
|
||||||
|
append))
|
||||||
|
marionette)))
|
||||||
|
(lset= eq?
|
||||||
|
(pk 'services services)
|
||||||
|
'(root #$@(operating-system-shepherd-service-names
|
||||||
|
(virtualized-operating-system os '()))))))
|
||||||
|
|
||||||
|
(test-equal "login on tty1"
|
||||||
|
"root\n"
|
||||||
|
(begin
|
||||||
|
(marionette-control "sendkey ctrl-alt-f1" marionette)
|
||||||
|
;; Wait for the 'term-tty1' service to be running
|
||||||
|
(marionette-eval
|
||||||
|
'(begin
|
||||||
|
(use-modules (gnu services herd))
|
||||||
|
|
||||||
|
(let loop ((i 0))
|
||||||
|
(when (> i 10)
|
||||||
|
(error "terminal service not running" (current-services)))
|
||||||
|
(unless (memq 'term-tty1 (current-services))
|
||||||
|
(sleep 1)
|
||||||
|
(loop (+ i 1)))))
|
||||||
|
marionette)
|
||||||
|
|
||||||
|
;; Now we can type.
|
||||||
|
(marionette-type "root\n\nid -un > logged-in\n" marionette)
|
||||||
|
|
||||||
|
;; It can take a while before the shell commands are executed.
|
||||||
|
(let loop ((i 0))
|
||||||
|
(unless (or (file-exists? "/root/logged-in") (> i 15))
|
||||||
|
(sleep 1)
|
||||||
|
(loop (+ i 1))))
|
||||||
|
(marionette-eval '(use-modules (rnrs io ports)) marionette)
|
||||||
|
(marionette-eval '(call-with-input-file "/root/logged-in"
|
||||||
|
get-string-all)
|
||||||
|
marionette)))
|
||||||
|
|
||||||
|
(test-assert "screendump"
|
||||||
|
(begin
|
||||||
|
(marionette-control (string-append "screendump " #$output
|
||||||
|
"/tty1.ppm")
|
||||||
|
marionette)
|
||||||
|
(file-exists? "tty1.ppm")))
|
||||||
|
|
||||||
|
(test-end)
|
||||||
|
(exit (= (test-runner-fail-count (test-runner-current)) 0))))
|
||||||
|
|
||||||
|
(gexp->derivation "basic" test
|
||||||
|
#:modules '((gnu build marionette)))))
|
|
@ -19,6 +19,7 @@
|
||||||
(define-module (guix build-system gnu)
|
(define-module (guix build-system gnu)
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix derivations)
|
#:use-module (guix derivations)
|
||||||
#:use-module (guix search-paths)
|
#:use-module (guix search-paths)
|
||||||
#:use-module (guix build-system)
|
#:use-module (guix build-system)
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
(define-module (guix build-system python)
|
(define-module (guix build-system python)
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix derivations)
|
#:use-module (guix derivations)
|
||||||
#:use-module (guix search-paths)
|
#:use-module (guix search-paths)
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
processes
|
processes
|
||||||
mkdtemp!
|
mkdtemp!
|
||||||
pivot-root
|
pivot-root
|
||||||
|
fcntl-flock
|
||||||
|
|
||||||
CLONE_CHILD_CLEARTID
|
CLONE_CHILD_CLEARTID
|
||||||
CLONE_CHILD_SETTID
|
CLONE_CHILD_SETTID
|
||||||
|
@ -637,6 +638,81 @@ system to PUT-OLD."
|
||||||
(list new-root put-old (strerror err))
|
(list new-root put-old (strerror err))
|
||||||
(list err)))))))
|
(list err)))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Advisory file locking.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define-c-struct %struct-flock ;<fcntl.h>
|
||||||
|
sizeof-flock
|
||||||
|
list
|
||||||
|
read-flock
|
||||||
|
write-flock!
|
||||||
|
(type short)
|
||||||
|
(whence short)
|
||||||
|
(start size_t)
|
||||||
|
(length size_t)
|
||||||
|
(pid int))
|
||||||
|
|
||||||
|
(define F_SETLKW
|
||||||
|
;; On Linux-based systems, this is usually 7, but not always
|
||||||
|
;; (exceptions include SPARC.) On GNU/Hurd, it's 9.
|
||||||
|
(cond ((string-contains %host-type "sparc") 9) ; sparc-*-linux-gnu
|
||||||
|
((string-contains %host-type "linux") 7) ; *-linux-gnu
|
||||||
|
(else 9))) ; *-gnu*
|
||||||
|
|
||||||
|
(define F_SETLK
|
||||||
|
;; Likewise: GNU/Hurd and SPARC use 8, while the others typically use 6.
|
||||||
|
(cond ((string-contains %host-type "sparc") 8) ; sparc-*-linux-gnu
|
||||||
|
((string-contains %host-type "linux") 6) ; *-linux-gnu
|
||||||
|
(else 8))) ; *-gnu*
|
||||||
|
|
||||||
|
(define F_xxLCK
|
||||||
|
;; The F_RDLCK, F_WRLCK, and F_UNLCK constants.
|
||||||
|
(cond ((string-contains %host-type "sparc") #(1 2 3)) ; sparc-*-linux-gnu
|
||||||
|
((string-contains %host-type "hppa") #(1 2 3)) ; hppa-*-linux-gnu
|
||||||
|
((string-contains %host-type "linux") #(0 1 2)) ; *-linux-gnu
|
||||||
|
(else #(1 2 3)))) ; *-gnu*
|
||||||
|
|
||||||
|
(define fcntl-flock
|
||||||
|
(let ((proc (syscall->procedure int "fcntl" `(,int ,int *))))
|
||||||
|
(lambda* (fd-or-port operation #:key (wait? #t))
|
||||||
|
"Perform locking OPERATION on the file beneath FD-OR-PORT. OPERATION
|
||||||
|
must be a symbol, one of 'read-lock, 'write-lock, or 'unlock. When WAIT? is
|
||||||
|
true, block until the lock is acquired; otherwise, thrown an 'flock-error'
|
||||||
|
exception if it's already taken."
|
||||||
|
(define (operation->int op)
|
||||||
|
(case op
|
||||||
|
((read-lock) (vector-ref F_xxLCK 0))
|
||||||
|
((write-lock) (vector-ref F_xxLCK 1))
|
||||||
|
((unlock) (vector-ref F_xxLCK 2))
|
||||||
|
(else (error "invalid fcntl-flock operation" op))))
|
||||||
|
|
||||||
|
(define fd
|
||||||
|
(if (port? fd-or-port)
|
||||||
|
(fileno fd-or-port)
|
||||||
|
fd-or-port))
|
||||||
|
|
||||||
|
(define bv
|
||||||
|
(make-bytevector sizeof-flock))
|
||||||
|
|
||||||
|
(write-flock! bv 0
|
||||||
|
(operation->int operation) SEEK_SET
|
||||||
|
0 0 ;whole file
|
||||||
|
0)
|
||||||
|
|
||||||
|
;; XXX: 'fcntl' is a vararg function, but here we happily use the
|
||||||
|
;; standard ABI; crossing fingers.
|
||||||
|
(let ((ret (proc fd
|
||||||
|
(if wait?
|
||||||
|
F_SETLKW ; lock & wait
|
||||||
|
F_SETLK) ; non-blocking attempt
|
||||||
|
(bytevector->pointer bv)))
|
||||||
|
(err (errno)))
|
||||||
|
(unless (zero? ret)
|
||||||
|
;; Presumably we got EAGAIN or so.
|
||||||
|
(throw 'flock-error err))))))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; Network interfaces.
|
;;; Network interfaces.
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
|
||||||
|
;;;
|
||||||
|
;;; 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 (guix combinators)
|
||||||
|
#:use-module (ice-9 match)
|
||||||
|
#:use-module (ice-9 vlist)
|
||||||
|
#:export (memoize
|
||||||
|
fold2
|
||||||
|
fold-tree
|
||||||
|
fold-tree-leaves
|
||||||
|
compile-time-value))
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
;;;
|
||||||
|
;;; This module provides useful combinators that complement SRFI-1 and
|
||||||
|
;;; friends.
|
||||||
|
;;;
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(define (memoize proc)
|
||||||
|
"Return a memoizing version of PROC."
|
||||||
|
(let ((cache (make-hash-table)))
|
||||||
|
(lambda args
|
||||||
|
(let ((results (hash-ref cache args)))
|
||||||
|
(if results
|
||||||
|
(apply values results)
|
||||||
|
(let ((results (call-with-values (lambda ()
|
||||||
|
(apply proc args))
|
||||||
|
list)))
|
||||||
|
(hash-set! cache args results)
|
||||||
|
(apply values results)))))))
|
||||||
|
|
||||||
|
(define fold2
|
||||||
|
(case-lambda
|
||||||
|
((proc seed1 seed2 lst)
|
||||||
|
"Like `fold', but with a single list and two seeds."
|
||||||
|
(let loop ((result1 seed1)
|
||||||
|
(result2 seed2)
|
||||||
|
(lst lst))
|
||||||
|
(if (null? lst)
|
||||||
|
(values result1 result2)
|
||||||
|
(call-with-values
|
||||||
|
(lambda () (proc (car lst) result1 result2))
|
||||||
|
(lambda (result1 result2)
|
||||||
|
(loop result1 result2 (cdr lst)))))))
|
||||||
|
((proc seed1 seed2 lst1 lst2)
|
||||||
|
"Like `fold', but with a two lists and two seeds."
|
||||||
|
(let loop ((result1 seed1)
|
||||||
|
(result2 seed2)
|
||||||
|
(lst1 lst1)
|
||||||
|
(lst2 lst2))
|
||||||
|
(if (or (null? lst1) (null? lst2))
|
||||||
|
(values result1 result2)
|
||||||
|
(call-with-values
|
||||||
|
(lambda () (proc (car lst1) (car lst2) result1 result2))
|
||||||
|
(lambda (result1 result2)
|
||||||
|
(fold2 proc result1 result2 (cdr lst1) (cdr lst2)))))))))
|
||||||
|
|
||||||
|
(define (fold-tree proc init children roots)
|
||||||
|
"Call (PROC NODE RESULT) for each node in the tree that is reachable from
|
||||||
|
ROOTS, using INIT as the initial value of RESULT. The order in which nodes
|
||||||
|
are traversed is not specified, however, each node is visited only once, based
|
||||||
|
on an eq? check. Children of a node to be visited are generated by
|
||||||
|
calling (CHILDREN NODE), the result of which should be a list of nodes that
|
||||||
|
are connected to NODE in the tree, or '() or #f if NODE is a leaf node."
|
||||||
|
(let loop ((result init)
|
||||||
|
(seen vlist-null)
|
||||||
|
(lst roots))
|
||||||
|
(match lst
|
||||||
|
(() result)
|
||||||
|
((head . tail)
|
||||||
|
(if (not (vhash-assq head seen))
|
||||||
|
(loop (proc head result)
|
||||||
|
(vhash-consq head #t seen)
|
||||||
|
(match (children head)
|
||||||
|
((or () #f) tail)
|
||||||
|
(children (append tail children))))
|
||||||
|
(loop result seen tail))))))
|
||||||
|
|
||||||
|
(define (fold-tree-leaves proc init children roots)
|
||||||
|
"Like fold-tree, but call (PROC NODE RESULT) only for leaf nodes."
|
||||||
|
(fold-tree
|
||||||
|
(lambda (node result)
|
||||||
|
(match (children node)
|
||||||
|
((or () #f) (proc node result))
|
||||||
|
(else result)))
|
||||||
|
init children roots))
|
||||||
|
|
||||||
|
(define-syntax compile-time-value ;not quite at home
|
||||||
|
(syntax-rules ()
|
||||||
|
"Evaluate the given expression at compile time. The expression must
|
||||||
|
evaluate to a simple datum."
|
||||||
|
((_ exp)
|
||||||
|
(let-syntax ((v (lambda (s)
|
||||||
|
(let ((val exp))
|
||||||
|
(syntax-case s ()
|
||||||
|
(_ #`'#,(datum->syntax s val)))))))
|
||||||
|
v))))
|
||||||
|
|
||||||
|
;;; combinators.scm ends here
|
|
@ -30,6 +30,7 @@
|
||||||
#:use-module (ice-9 vlist)
|
#:use-module (ice-9 vlist)
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module (guix hash)
|
#:use-module (guix hash)
|
||||||
#:use-module (guix base32)
|
#:use-module (guix base32)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
|
;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
|
@ -30,6 +30,7 @@
|
||||||
#:use-module (guix http-client)
|
#:use-module (guix http-client)
|
||||||
#:use-module (guix ftp-client)
|
#:use-module (guix ftp-client)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix records)
|
#:use-module (guix records)
|
||||||
#:use-module (guix upstream)
|
#:use-module (guix upstream)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
|
|
|
@ -35,8 +35,8 @@
|
||||||
#:use-module (guix base32)
|
#:use-module (guix base32)
|
||||||
#:use-module (guix upstream)
|
#:use-module (guix upstream)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module ((guix utils) #:select (call-with-temporary-output-file
|
#:use-module ((guix combinators) #:select (memoize))
|
||||||
memoize))
|
#:use-module ((guix utils) #:select (call-with-temporary-output-file))
|
||||||
#:export (elpa->guix-package
|
#:export (elpa->guix-package
|
||||||
%elpa-updater))
|
%elpa-updater))
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
|
;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
|
@ -18,8 +18,8 @@
|
||||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
(define-module (guix nar)
|
(define-module (guix nar)
|
||||||
#:use-module (guix utils)
|
|
||||||
#:use-module (guix serialization)
|
#:use-module (guix serialization)
|
||||||
|
#:use-module (guix build syscalls)
|
||||||
#:use-module ((guix build utils)
|
#:use-module ((guix build utils)
|
||||||
#:select (delete-file-recursively with-directory-excursion))
|
#:select (delete-file-recursively with-directory-excursion))
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
(define-module (guix scripts archive)
|
(define-module (guix scripts archive)
|
||||||
#:use-module (guix config)
|
#:use-module (guix config)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module ((guix build utils) #:select (mkdir-p))
|
#:use-module ((guix build utils) #:select (mkdir-p))
|
||||||
#:use-module ((guix serialization) #:select (restore-file))
|
#:use-module ((guix serialization) #:select (restore-file))
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#:use-module (guix derivations)
|
#:use-module (guix derivations)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix grafts)
|
#:use-module (guix grafts)
|
||||||
|
#:use-module (guix combinators)
|
||||||
|
|
||||||
;; Use the procedure that destructures "NAME-VERSION" forms.
|
;; Use the procedure that destructures "NAME-VERSION" forms.
|
||||||
#:use-module ((guix utils) #:hide (package-name->name+version))
|
#:use-module ((guix utils) #:hide (package-name->name+version))
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix profiles)
|
#:use-module (guix profiles)
|
||||||
#:use-module (guix search-paths)
|
#:use-module (guix search-paths)
|
||||||
#:use-module (guix utils)
|
|
||||||
#:use-module (guix build utils)
|
#:use-module (guix build utils)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module ((guix gexp) #:select (lower-inputs))
|
#:use-module ((guix gexp) #:select (lower-inputs))
|
||||||
|
@ -499,12 +498,13 @@ Otherwise, return the derivation for the Bash package."
|
||||||
|
|
||||||
;; The '--' token is used to separate the command to run from the rest of
|
;; The '--' token is used to separate the command to run from the rest of
|
||||||
;; the operands.
|
;; the operands.
|
||||||
(let-values (((args command) (split args "--")))
|
(let-values (((args command) (break (cut string=? "--" <>) args)))
|
||||||
(let ((opts (parse-command-line args %options (list %default-options)
|
(let ((opts (parse-command-line args %options (list %default-options)
|
||||||
#:argument-handler handle-argument)))
|
#:argument-handler handle-argument)))
|
||||||
(if (null? command)
|
(match command
|
||||||
opts
|
(() opts)
|
||||||
(alist-cons 'exec command opts)))))
|
(("--") opts)
|
||||||
|
(("--" command ...) (alist-cons 'exec command opts))))))
|
||||||
|
|
||||||
(define (assert-container-features)
|
(define (assert-container-features)
|
||||||
"Check if containers can be created and exit with an informative error
|
"Check if containers can be created and exit with an informative error
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#:use-module (guix graph)
|
#:use-module (guix graph)
|
||||||
#:use-module (guix grafts)
|
#:use-module (guix grafts)
|
||||||
#:use-module (guix scripts)
|
#:use-module (guix scripts)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#:use-module (guix records)
|
#:use-module (guix records)
|
||||||
#:use-module (guix ui)
|
#:use-module (guix ui)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix scripts)
|
#:use-module (guix scripts)
|
||||||
#:use-module (guix gnu-maintenance)
|
#:use-module (guix gnu-maintenance)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#:use-module (guix scripts)
|
#:use-module (guix scripts)
|
||||||
#:use-module (guix store)
|
#:use-module (guix store)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix grafts)
|
#:use-module (guix grafts)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix derivations)
|
#:use-module (guix derivations)
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#:use-module (guix ui)
|
#:use-module (guix ui)
|
||||||
#:use-module ((guix store) #:hide (close-connection))
|
#:use-module ((guix store) #:hide (close-connection))
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix config)
|
#:use-module (guix config)
|
||||||
#:use-module (guix records)
|
#:use-module (guix records)
|
||||||
#:use-module (guix serialization)
|
#:use-module (guix serialization)
|
||||||
|
|
|
@ -236,6 +236,72 @@ BODY..., and restore them."
|
||||||
(with-monad %store-monad
|
(with-monad %store-monad
|
||||||
(return #f)))))
|
(return #f)))))
|
||||||
|
|
||||||
|
(define-syntax-rule (with-shepherd-error-handling body ...)
|
||||||
|
(warn-on-system-error
|
||||||
|
(guard (c ((shepherd-error? c)
|
||||||
|
(report-shepherd-error c)))
|
||||||
|
body ...)))
|
||||||
|
|
||||||
|
(define (report-shepherd-error error)
|
||||||
|
"Report ERROR, a '&shepherd-error' error condition object."
|
||||||
|
(cond ((service-not-found-error? error)
|
||||||
|
(report-error (_ "service '~a' could not be found~%")
|
||||||
|
(service-not-found-error-service error)))
|
||||||
|
((action-not-found-error? error)
|
||||||
|
(report-error (_ "service '~a' does not have an action '~a'~%")
|
||||||
|
(action-not-found-error-service error)
|
||||||
|
(action-not-found-error-action error)))
|
||||||
|
((action-exception-error? error)
|
||||||
|
(report-error (_ "exception caught while executing '~a' \
|
||||||
|
on service '~a':~%")
|
||||||
|
(action-exception-error-action error)
|
||||||
|
(action-exception-error-service error))
|
||||||
|
(print-exception (current-error-port) #f
|
||||||
|
(action-exception-error-key error)
|
||||||
|
(action-exception-error-arguments error)))
|
||||||
|
((unknown-shepherd-error? error)
|
||||||
|
(report-error (_ "something went wrong: ~s~%")
|
||||||
|
(unknown-shepherd-error-sexp error)))
|
||||||
|
((shepherd-error? error)
|
||||||
|
(report-error (_ "shepherd error~%")))
|
||||||
|
((not error) ;not an error
|
||||||
|
#t)))
|
||||||
|
|
||||||
|
(define (call-with-service-upgrade-info new-services mproc)
|
||||||
|
"Call MPROC, a monadic procedure in %STORE-MONAD, passing it the list of
|
||||||
|
names of services to load (upgrade), and the list of names of services to
|
||||||
|
unload."
|
||||||
|
(define (essential? service)
|
||||||
|
(memq service '(root shepherd)))
|
||||||
|
|
||||||
|
(define new-service-names
|
||||||
|
(map (compose first shepherd-service-provision)
|
||||||
|
new-services))
|
||||||
|
|
||||||
|
(let-values (((running stopped) (current-services)))
|
||||||
|
(if (and running stopped)
|
||||||
|
(let* ((to-load
|
||||||
|
;; Only load services that are either new or currently stopped.
|
||||||
|
(remove (lambda (service)
|
||||||
|
(memq (first (shepherd-service-provision service))
|
||||||
|
running))
|
||||||
|
new-services))
|
||||||
|
(to-unload
|
||||||
|
;; Unload services that are (1) no longer required, or (2) are
|
||||||
|
;; in TO-LOAD.
|
||||||
|
(remove essential?
|
||||||
|
(append (remove (lambda (service)
|
||||||
|
(memq service new-service-names))
|
||||||
|
(append running stopped))
|
||||||
|
(filter (lambda (service)
|
||||||
|
(memq service stopped))
|
||||||
|
(map shepherd-service-canonical-name
|
||||||
|
to-load))))))
|
||||||
|
(mproc to-load to-unload))
|
||||||
|
(with-monad %store-monad
|
||||||
|
(warning (_ "failed to obtain list of shepherd services~%"))
|
||||||
|
(return #f)))))
|
||||||
|
|
||||||
(define (upgrade-shepherd-services os)
|
(define (upgrade-shepherd-services os)
|
||||||
"Upgrade the Shepherd (PID 1) by unloading obsolete services and loading new
|
"Upgrade the Shepherd (PID 1) by unloading obsolete services and loading new
|
||||||
services specified in OS and not currently running.
|
services specified in OS and not currently running.
|
||||||
|
@ -243,59 +309,35 @@ services specified in OS and not currently running.
|
||||||
This is currently very conservative in that it does not stop or unload any
|
This is currently very conservative in that it does not stop or unload any
|
||||||
running service. Unloading or stopping the wrong service ('udev', say) could
|
running service. Unloading or stopping the wrong service ('udev', say) could
|
||||||
bring the system down."
|
bring the system down."
|
||||||
(define (essential? service)
|
|
||||||
(memq service '(root shepherd)))
|
|
||||||
|
|
||||||
(define new-services
|
(define new-services
|
||||||
(service-parameters
|
(service-parameters
|
||||||
(fold-services (operating-system-services os)
|
(fold-services (operating-system-services os)
|
||||||
#:target-type shepherd-root-service-type)))
|
#:target-type shepherd-root-service-type)))
|
||||||
|
|
||||||
(define new-service-names
|
;; Arrange to simply emit a warning if the service upgrade fails.
|
||||||
(map (compose first shepherd-service-provision)
|
(with-shepherd-error-handling
|
||||||
new-services))
|
(call-with-service-upgrade-info new-services
|
||||||
|
(lambda (to-load to-unload)
|
||||||
|
(for-each (lambda (unload)
|
||||||
|
(info (_ "unloading service '~a'...~%") unload)
|
||||||
|
(unload-service unload))
|
||||||
|
to-unload)
|
||||||
|
|
||||||
;; Arrange to simply emit a warning if we cannot connect to the shepherd.
|
(with-monad %store-monad
|
||||||
(warn-on-system-error
|
(munless (null? to-load)
|
||||||
(let-values (((running stopped) (current-services)))
|
(let ((to-load-names (map shepherd-service-canonical-name to-load))
|
||||||
(define to-load
|
(to-start (filter shepherd-service-auto-start? to-load)))
|
||||||
;; Only load services that are either new or currently stopped.
|
(info (_ "loading new services:~{ ~a~}...~%") to-load-names)
|
||||||
(remove (lambda (service)
|
(mlet %store-monad ((files (mapm %store-monad shepherd-service-file
|
||||||
(memq (first (shepherd-service-provision service))
|
to-load)))
|
||||||
running))
|
;; Here we assume that FILES are exactly those that were computed
|
||||||
new-services))
|
;; as part of the derivation that built OS, which is normally the
|
||||||
(define to-unload
|
;; case.
|
||||||
;; Unload services that are (1) no longer required, or (2) are in
|
(load-services (map derivation->output-path files))
|
||||||
;; TO-LOAD.
|
|
||||||
(remove essential?
|
|
||||||
(append (remove (lambda (service)
|
|
||||||
(memq service new-service-names))
|
|
||||||
(append running stopped))
|
|
||||||
(filter (lambda (service)
|
|
||||||
(memq service stopped))
|
|
||||||
(map shepherd-service-canonical-name
|
|
||||||
to-load)))))
|
|
||||||
|
|
||||||
(for-each (lambda (unload)
|
(for-each start-service
|
||||||
(info (_ "unloading service '~a'...~%") unload)
|
(map shepherd-service-canonical-name to-start))
|
||||||
(unload-service unload))
|
(return #t)))))))))
|
||||||
to-unload)
|
|
||||||
|
|
||||||
(with-monad %store-monad
|
|
||||||
(munless (null? to-load)
|
|
||||||
(let ((to-load-names (map shepherd-service-canonical-name to-load))
|
|
||||||
(to-start (filter shepherd-service-auto-start? to-load)))
|
|
||||||
(info (_ "loading new services:~{ ~a~}...~%") to-load-names)
|
|
||||||
(mlet %store-monad ((files (mapm %store-monad shepherd-service-file
|
|
||||||
to-load)))
|
|
||||||
;; Here we assume that FILES are exactly those that were computed
|
|
||||||
;; as part of the derivation that built OS, which is normally the
|
|
||||||
;; case.
|
|
||||||
(load-services (map derivation->output-path files))
|
|
||||||
|
|
||||||
(for-each start-service
|
|
||||||
(map shepherd-service-canonical-name to-start))
|
|
||||||
(return #t))))))))
|
|
||||||
|
|
||||||
(define* (switch-to-system os
|
(define* (switch-to-system os
|
||||||
#:optional (profile %system-profile))
|
#:optional (profile %system-profile))
|
||||||
|
@ -839,4 +881,8 @@ argument list and OPTS is the option alist."
|
||||||
(parameterize ((%graft? (assoc-ref opts 'graft?)))
|
(parameterize ((%graft? (assoc-ref opts 'graft?)))
|
||||||
(process-command command args opts)))))
|
(process-command command args opts)))))
|
||||||
|
|
||||||
|
;;; Local Variables:
|
||||||
|
;;; eval: (put 'call-with-service-upgrade-info 'scheme-indent-function 1)
|
||||||
|
;;; End:
|
||||||
|
|
||||||
;;; system.scm ends here
|
;;; system.scm ends here
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
(define-module (guix serialization)
|
(define-module (guix serialization)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix combinators)
|
||||||
#:use-module (rnrs bytevectors)
|
#:use-module (rnrs bytevectors)
|
||||||
#:use-module (rnrs io ports)
|
#:use-module (rnrs io ports)
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
(define-module (guix store)
|
(define-module (guix store)
|
||||||
#:use-module (guix utils)
|
#:use-module (guix utils)
|
||||||
#:use-module (guix config)
|
#:use-module (guix config)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix serialization)
|
#:use-module (guix serialization)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:autoload (guix base32) (bytevector->base32-string)
|
#:autoload (guix base32) (bytevector->base32-string)
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix profiles)
|
#:use-module (guix profiles)
|
||||||
#:use-module (guix derivations)
|
#:use-module (guix derivations)
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module (guix build-system)
|
#:use-module (guix build-system)
|
||||||
#:use-module (guix serialization)
|
#:use-module (guix serialization)
|
||||||
#:use-module ((guix build utils) #:select (mkdir-p))
|
#:use-module ((guix build utils) #:select (mkdir-p))
|
||||||
|
|
191
guix/utils.scm
191
guix/utils.scm
|
@ -32,8 +32,9 @@
|
||||||
#:use-module (rnrs bytevectors)
|
#:use-module (rnrs bytevectors)
|
||||||
#:use-module (rnrs io ports)
|
#:use-module (rnrs io ports)
|
||||||
#:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!))
|
#:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!))
|
||||||
|
#:use-module (guix combinators)
|
||||||
#:use-module ((guix build utils) #:select (dump-port))
|
#:use-module ((guix build utils) #:select (dump-port))
|
||||||
#:use-module ((guix build syscalls) #:select (errno mkdtemp!))
|
#:use-module ((guix build syscalls) #:select (mkdtemp!))
|
||||||
#:use-module (ice-9 vlist)
|
#:use-module (ice-9 vlist)
|
||||||
#:use-module (ice-9 format)
|
#:use-module (ice-9 format)
|
||||||
#:autoload (ice-9 popen) (open-pipe*)
|
#:autoload (ice-9 popen) (open-pipe*)
|
||||||
|
@ -46,9 +47,6 @@
|
||||||
#:export (bytevector->base16-string
|
#:export (bytevector->base16-string
|
||||||
base16-string->bytevector
|
base16-string->bytevector
|
||||||
|
|
||||||
compile-time-value
|
|
||||||
fcntl-flock
|
|
||||||
memoize
|
|
||||||
strip-keyword-arguments
|
strip-keyword-arguments
|
||||||
default-keyword-arguments
|
default-keyword-arguments
|
||||||
substitute-keyword-arguments
|
substitute-keyword-arguments
|
||||||
|
@ -82,10 +80,6 @@
|
||||||
call-with-temporary-output-file
|
call-with-temporary-output-file
|
||||||
call-with-temporary-directory
|
call-with-temporary-directory
|
||||||
with-atomic-file-output
|
with-atomic-file-output
|
||||||
fold2
|
|
||||||
fold-tree
|
|
||||||
fold-tree-leaves
|
|
||||||
split
|
|
||||||
cache-directory
|
cache-directory
|
||||||
readlink*
|
readlink*
|
||||||
edit-expression
|
edit-expression
|
||||||
|
@ -98,22 +92,6 @@
|
||||||
call-with-compressed-output-port
|
call-with-compressed-output-port
|
||||||
canonical-newline-port))
|
canonical-newline-port))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
|
||||||
;;; Compile-time computations.
|
|
||||||
;;;
|
|
||||||
|
|
||||||
(define-syntax compile-time-value
|
|
||||||
(syntax-rules ()
|
|
||||||
"Evaluate the given expression at compile time. The expression must
|
|
||||||
evaluate to a simple datum."
|
|
||||||
((_ exp)
|
|
||||||
(let-syntax ((v (lambda (s)
|
|
||||||
(let ((val exp))
|
|
||||||
(syntax-case s ()
|
|
||||||
(_ #`'#,(datum->syntax s val)))))))
|
|
||||||
v))))
|
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; Base 16.
|
;;; Base 16.
|
||||||
|
@ -361,94 +339,9 @@ This procedure returns #t on success."
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; Advisory file locking.
|
;;; Keyword arguments.
|
||||||
;;;
|
;;;
|
||||||
|
|
||||||
(define %struct-flock
|
|
||||||
;; 'struct flock' from <fcntl.h>.
|
|
||||||
(list short ; l_type
|
|
||||||
short ; l_whence
|
|
||||||
size_t ; l_start
|
|
||||||
size_t ; l_len
|
|
||||||
int)) ; l_pid
|
|
||||||
|
|
||||||
(define F_SETLKW
|
|
||||||
;; On Linux-based systems, this is usually 7, but not always
|
|
||||||
;; (exceptions include SPARC.) On GNU/Hurd, it's 9.
|
|
||||||
(compile-time-value
|
|
||||||
(cond ((string-contains %host-type "sparc") 9) ; sparc-*-linux-gnu
|
|
||||||
((string-contains %host-type "linux") 7) ; *-linux-gnu
|
|
||||||
(else 9)))) ; *-gnu*
|
|
||||||
|
|
||||||
(define F_SETLK
|
|
||||||
;; Likewise: GNU/Hurd and SPARC use 8, while the others typically use 6.
|
|
||||||
(compile-time-value
|
|
||||||
(cond ((string-contains %host-type "sparc") 8) ; sparc-*-linux-gnu
|
|
||||||
((string-contains %host-type "linux") 6) ; *-linux-gnu
|
|
||||||
(else 8)))) ; *-gnu*
|
|
||||||
|
|
||||||
(define F_xxLCK
|
|
||||||
;; The F_RDLCK, F_WRLCK, and F_UNLCK constants.
|
|
||||||
(compile-time-value
|
|
||||||
(cond ((string-contains %host-type "sparc") #(1 2 3)) ; sparc-*-linux-gnu
|
|
||||||
((string-contains %host-type "hppa") #(1 2 3)) ; hppa-*-linux-gnu
|
|
||||||
((string-contains %host-type "linux") #(0 1 2)) ; *-linux-gnu
|
|
||||||
(else #(1 2 3))))) ; *-gnu*
|
|
||||||
|
|
||||||
(define fcntl-flock
|
|
||||||
(let* ((ptr (dynamic-func "fcntl" (dynamic-link)))
|
|
||||||
(proc (pointer->procedure int ptr `(,int ,int *))))
|
|
||||||
(lambda* (fd-or-port operation #:key (wait? #t))
|
|
||||||
"Perform locking OPERATION on the file beneath FD-OR-PORT. OPERATION
|
|
||||||
must be a symbol, one of 'read-lock, 'write-lock, or 'unlock. When WAIT? is
|
|
||||||
true, block until the lock is acquired; otherwise, thrown an 'flock-error'
|
|
||||||
exception if it's already taken."
|
|
||||||
(define (operation->int op)
|
|
||||||
(case op
|
|
||||||
((read-lock) (vector-ref F_xxLCK 0))
|
|
||||||
((write-lock) (vector-ref F_xxLCK 1))
|
|
||||||
((unlock) (vector-ref F_xxLCK 2))
|
|
||||||
(else (error "invalid fcntl-flock operation" op))))
|
|
||||||
|
|
||||||
(define fd
|
|
||||||
(if (port? fd-or-port)
|
|
||||||
(fileno fd-or-port)
|
|
||||||
fd-or-port))
|
|
||||||
|
|
||||||
;; XXX: 'fcntl' is a vararg function, but here we happily use the
|
|
||||||
;; standard ABI; crossing fingers.
|
|
||||||
(let ((err (proc fd
|
|
||||||
(if wait?
|
|
||||||
F_SETLKW ; lock & wait
|
|
||||||
F_SETLK) ; non-blocking attempt
|
|
||||||
(make-c-struct %struct-flock
|
|
||||||
(list (operation->int operation)
|
|
||||||
SEEK_SET
|
|
||||||
0 0 ; whole file
|
|
||||||
0)))))
|
|
||||||
(or (zero? err)
|
|
||||||
|
|
||||||
;; Presumably we got EAGAIN or so.
|
|
||||||
(throw 'flock-error (errno)))))))
|
|
||||||
|
|
||||||
|
|
||||||
;;;
|
|
||||||
;;; Miscellaneous.
|
|
||||||
;;;
|
|
||||||
|
|
||||||
(define (memoize proc)
|
|
||||||
"Return a memoizing version of PROC."
|
|
||||||
(let ((cache (make-hash-table)))
|
|
||||||
(lambda args
|
|
||||||
(let ((results (hash-ref cache args)))
|
|
||||||
(if results
|
|
||||||
(apply values results)
|
|
||||||
(let ((results (call-with-values (lambda ()
|
|
||||||
(apply proc args))
|
|
||||||
list)))
|
|
||||||
(hash-set! cache args results)
|
|
||||||
(apply values results)))))))
|
|
||||||
|
|
||||||
(define (strip-keyword-arguments keywords args)
|
(define (strip-keyword-arguments keywords args)
|
||||||
"Remove all of the keyword arguments listed in KEYWORDS from ARGS."
|
"Remove all of the keyword arguments listed in KEYWORDS from ARGS."
|
||||||
(let loop ((args args)
|
(let loop ((args args)
|
||||||
|
@ -534,6 +427,11 @@ For instance:
|
||||||
(#f
|
(#f
|
||||||
(loop rest kw/values (cons* value kw result))))))))
|
(loop rest kw/values (cons* value kw result))))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; System strings.
|
||||||
|
;;;
|
||||||
|
|
||||||
(define* (nix-system->gnu-triplet
|
(define* (nix-system->gnu-triplet
|
||||||
#:optional (system (%current-system)) (vendor "unknown"))
|
#:optional (system (%current-system)) (vendor "unknown"))
|
||||||
"Return a guess of the GNU triplet corresponding to Nix system
|
"Return a guess of the GNU triplet corresponding to Nix system
|
||||||
|
@ -732,79 +630,6 @@ output port, and PROC's result is returned."
|
||||||
(lambda (key . args)
|
(lambda (key . args)
|
||||||
(false-if-exception (delete-file template))))))
|
(false-if-exception (delete-file template))))))
|
||||||
|
|
||||||
(define fold2
|
|
||||||
(case-lambda
|
|
||||||
((proc seed1 seed2 lst)
|
|
||||||
"Like `fold', but with a single list and two seeds."
|
|
||||||
(let loop ((result1 seed1)
|
|
||||||
(result2 seed2)
|
|
||||||
(lst lst))
|
|
||||||
(if (null? lst)
|
|
||||||
(values result1 result2)
|
|
||||||
(call-with-values
|
|
||||||
(lambda () (proc (car lst) result1 result2))
|
|
||||||
(lambda (result1 result2)
|
|
||||||
(loop result1 result2 (cdr lst)))))))
|
|
||||||
((proc seed1 seed2 lst1 lst2)
|
|
||||||
"Like `fold', but with a two lists and two seeds."
|
|
||||||
(let loop ((result1 seed1)
|
|
||||||
(result2 seed2)
|
|
||||||
(lst1 lst1)
|
|
||||||
(lst2 lst2))
|
|
||||||
(if (or (null? lst1) (null? lst2))
|
|
||||||
(values result1 result2)
|
|
||||||
(call-with-values
|
|
||||||
(lambda () (proc (car lst1) (car lst2) result1 result2))
|
|
||||||
(lambda (result1 result2)
|
|
||||||
(fold2 proc result1 result2 (cdr lst1) (cdr lst2)))))))))
|
|
||||||
|
|
||||||
(define (fold-tree proc init children roots)
|
|
||||||
"Call (PROC NODE RESULT) for each node in the tree that is reachable from
|
|
||||||
ROOTS, using INIT as the initial value of RESULT. The order in which nodes
|
|
||||||
are traversed is not specified, however, each node is visited only once, based
|
|
||||||
on an eq? check. Children of a node to be visited are generated by
|
|
||||||
calling (CHILDREN NODE), the result of which should be a list of nodes that
|
|
||||||
are connected to NODE in the tree, or '() or #f if NODE is a leaf node."
|
|
||||||
(let loop ((result init)
|
|
||||||
(seen vlist-null)
|
|
||||||
(lst roots))
|
|
||||||
(match lst
|
|
||||||
(() result)
|
|
||||||
((head . tail)
|
|
||||||
(if (not (vhash-assq head seen))
|
|
||||||
(loop (proc head result)
|
|
||||||
(vhash-consq head #t seen)
|
|
||||||
(match (children head)
|
|
||||||
((or () #f) tail)
|
|
||||||
(children (append tail children))))
|
|
||||||
(loop result seen tail))))))
|
|
||||||
|
|
||||||
(define (fold-tree-leaves proc init children roots)
|
|
||||||
"Like fold-tree, but call (PROC NODE RESULT) only for leaf nodes."
|
|
||||||
(fold-tree
|
|
||||||
(lambda (node result)
|
|
||||||
(match (children node)
|
|
||||||
((or () #f) (proc node result))
|
|
||||||
(else result)))
|
|
||||||
init children roots))
|
|
||||||
|
|
||||||
(define (split lst e)
|
|
||||||
"Return two values, a list containing the elements of the list LST that
|
|
||||||
appear before the first occurence of the object E and a list containing the
|
|
||||||
elements after E."
|
|
||||||
(define (same? x)
|
|
||||||
(equal? e x))
|
|
||||||
|
|
||||||
(let loop ((rest lst)
|
|
||||||
(acc '()))
|
|
||||||
(match rest
|
|
||||||
(()
|
|
||||||
(values lst '()))
|
|
||||||
(((? same?) . tail)
|
|
||||||
(values (reverse acc) tail))
|
|
||||||
((head . tail)
|
|
||||||
(loop tail (cons head acc))))))
|
|
||||||
|
|
||||||
(define (cache-directory)
|
(define (cache-directory)
|
||||||
"Return the cache directory for Guix, by default ~/.cache/guix."
|
"Return the cache directory for Guix, by default ~/.cache/guix."
|
||||||
(or (getenv "XDG_CONFIG_HOME")
|
(or (getenv "XDG_CONFIG_HOME")
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
|
||||||
|
;;;
|
||||||
|
;;; 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 (test-combinators)
|
||||||
|
#:use-module (guix combinators)
|
||||||
|
#:use-module (srfi srfi-1)
|
||||||
|
#:use-module (srfi srfi-64)
|
||||||
|
#:use-module (ice-9 vlist))
|
||||||
|
|
||||||
|
(test-begin "combinators")
|
||||||
|
|
||||||
|
(test-equal "fold2, 1 list"
|
||||||
|
(list (reverse (iota 5))
|
||||||
|
(map - (reverse (iota 5))))
|
||||||
|
(call-with-values
|
||||||
|
(lambda ()
|
||||||
|
(fold2 (lambda (i r1 r2)
|
||||||
|
(values (cons i r1)
|
||||||
|
(cons (- i) r2)))
|
||||||
|
'() '()
|
||||||
|
(iota 5)))
|
||||||
|
list))
|
||||||
|
|
||||||
|
(test-equal "fold2, 2 lists"
|
||||||
|
(list (reverse '((a . 0) (b . 1) (c . 2) (d . 3)))
|
||||||
|
(reverse '((a . 0) (b . -1) (c . -2) (d . -3))))
|
||||||
|
(call-with-values
|
||||||
|
(lambda ()
|
||||||
|
(fold2 (lambda (k v r1 r2)
|
||||||
|
(values (alist-cons k v r1)
|
||||||
|
(alist-cons k (- v) r2)))
|
||||||
|
'() '()
|
||||||
|
'(a b c d)
|
||||||
|
'(0 1 2 3)))
|
||||||
|
list))
|
||||||
|
|
||||||
|
(let* ((tree (alist->vhash
|
||||||
|
'((0 2 3) (1 3 4) (2) (3 5 6) (4 6) (5) (6))
|
||||||
|
hashq))
|
||||||
|
(add-one (lambda (_ r) (1+ r)))
|
||||||
|
(tree-lookup (lambda (n) (cdr (vhash-assq n tree)))))
|
||||||
|
(test-equal "fold-tree, single root"
|
||||||
|
5 (fold-tree add-one 0 tree-lookup '(0)))
|
||||||
|
(test-equal "fold-tree, two roots"
|
||||||
|
7 (fold-tree add-one 0 tree-lookup '(0 1)))
|
||||||
|
(test-equal "fold-tree, sum"
|
||||||
|
16 (fold-tree + 0 tree-lookup '(0)))
|
||||||
|
(test-equal "fold-tree, internal"
|
||||||
|
18 (fold-tree + 0 tree-lookup '(3 4)))
|
||||||
|
(test-equal "fold-tree, cons"
|
||||||
|
'(1 3 4 5 6)
|
||||||
|
(sort (fold-tree cons '() tree-lookup '(1)) <))
|
||||||
|
(test-equal "fold-tree, overlapping paths"
|
||||||
|
'(1 3 4 5 6)
|
||||||
|
(sort (fold-tree cons '() tree-lookup '(1 4)) <))
|
||||||
|
(test-equal "fold-tree, cons, two roots"
|
||||||
|
'(0 2 3 4 5 6)
|
||||||
|
(sort (fold-tree cons '() tree-lookup '(0 4)) <))
|
||||||
|
(test-equal "fold-tree-leaves, single root"
|
||||||
|
2 (fold-tree-leaves add-one 0 tree-lookup '(1)))
|
||||||
|
(test-equal "fold-tree-leaves, single root, sum"
|
||||||
|
11 (fold-tree-leaves + 0 tree-lookup '(1)))
|
||||||
|
(test-equal "fold-tree-leaves, two roots"
|
||||||
|
3 (fold-tree-leaves add-one 0 tree-lookup '(0 1)))
|
||||||
|
(test-equal "fold-tree-leaves, two roots, sum"
|
||||||
|
13 (fold-tree-leaves + 0 tree-lookup '(0 1))))
|
||||||
|
|
||||||
|
(test-end)
|
||||||
|
|
|
@ -29,6 +29,10 @@
|
||||||
;; Test the (guix build syscalls) module, although there's not much that can
|
;; Test the (guix build syscalls) module, although there's not much that can
|
||||||
;; actually be tested without being root.
|
;; actually be tested without being root.
|
||||||
|
|
||||||
|
(define temp-file
|
||||||
|
(string-append "t-utils-" (number->string (getpid))))
|
||||||
|
|
||||||
|
|
||||||
(test-begin "syscalls")
|
(test-begin "syscalls")
|
||||||
|
|
||||||
(test-equal "mount, ENOENT"
|
(test-equal "mount, ENOENT"
|
||||||
|
@ -172,6 +176,88 @@
|
||||||
(status:exit-val status))))
|
(status:exit-val status))))
|
||||||
(eq? #t result))))))))
|
(eq? #t result))))))))
|
||||||
|
|
||||||
|
(false-if-exception (delete-file temp-file))
|
||||||
|
(test-equal "fcntl-flock wait"
|
||||||
|
42 ; the child's exit status
|
||||||
|
(let ((file (open-file temp-file "w0b")))
|
||||||
|
;; Acquire an exclusive lock.
|
||||||
|
(fcntl-flock file 'write-lock)
|
||||||
|
(match (primitive-fork)
|
||||||
|
(0
|
||||||
|
(dynamic-wind
|
||||||
|
(const #t)
|
||||||
|
(lambda ()
|
||||||
|
;; Reopen FILE read-only so we can have a read lock.
|
||||||
|
(let ((file (open-file temp-file "r0b")))
|
||||||
|
;; Wait until we can acquire the lock.
|
||||||
|
(fcntl-flock file 'read-lock)
|
||||||
|
(primitive-exit (read file)))
|
||||||
|
(primitive-exit 1))
|
||||||
|
(lambda ()
|
||||||
|
(primitive-exit 2))))
|
||||||
|
(pid
|
||||||
|
;; Write garbage and wait.
|
||||||
|
(display "hello, world!" file)
|
||||||
|
(force-output file)
|
||||||
|
(sleep 1)
|
||||||
|
|
||||||
|
;; Write the real answer.
|
||||||
|
(seek file 0 SEEK_SET)
|
||||||
|
(truncate-file file 0)
|
||||||
|
(write 42 file)
|
||||||
|
(force-output file)
|
||||||
|
|
||||||
|
;; Unlock, which should let the child continue.
|
||||||
|
(fcntl-flock file 'unlock)
|
||||||
|
|
||||||
|
(match (waitpid pid)
|
||||||
|
((_ . status)
|
||||||
|
(let ((result (status:exit-val status)))
|
||||||
|
(close-port file)
|
||||||
|
result)))))))
|
||||||
|
|
||||||
|
(test-equal "fcntl-flock non-blocking"
|
||||||
|
EAGAIN ; the child's exit status
|
||||||
|
(match (pipe)
|
||||||
|
((input . output)
|
||||||
|
(match (primitive-fork)
|
||||||
|
(0
|
||||||
|
(dynamic-wind
|
||||||
|
(const #t)
|
||||||
|
(lambda ()
|
||||||
|
(close-port output)
|
||||||
|
|
||||||
|
;; Wait for the green light.
|
||||||
|
(read-char input)
|
||||||
|
|
||||||
|
;; Open FILE read-only so we can have a read lock.
|
||||||
|
(let ((file (open-file temp-file "w0")))
|
||||||
|
(catch 'flock-error
|
||||||
|
(lambda ()
|
||||||
|
;; This attempt should throw EAGAIN.
|
||||||
|
(fcntl-flock file 'write-lock #:wait? #f))
|
||||||
|
(lambda (key errno)
|
||||||
|
(primitive-exit (pk 'errno errno)))))
|
||||||
|
(primitive-exit -1))
|
||||||
|
(lambda ()
|
||||||
|
(primitive-exit -2))))
|
||||||
|
(pid
|
||||||
|
(close-port input)
|
||||||
|
(let ((file (open-file temp-file "w0")))
|
||||||
|
;; Acquire an exclusive lock.
|
||||||
|
(fcntl-flock file 'write-lock)
|
||||||
|
|
||||||
|
;; Tell the child to continue.
|
||||||
|
(write 'green-light output)
|
||||||
|
(force-output output)
|
||||||
|
|
||||||
|
(match (waitpid pid)
|
||||||
|
((_ . status)
|
||||||
|
(let ((result (status:exit-val status)))
|
||||||
|
(fcntl-flock file 'unlock)
|
||||||
|
(close-port file)
|
||||||
|
result)))))))))
|
||||||
|
|
||||||
(test-assert "all-network-interface-names"
|
(test-assert "all-network-interface-names"
|
||||||
(match (all-network-interface-names)
|
(match (all-network-interface-names)
|
||||||
(((? string? names) ..1)
|
(((? string? names) ..1)
|
||||||
|
@ -303,3 +389,5 @@
|
||||||
0))
|
0))
|
||||||
|
|
||||||
(test-end)
|
(test-end)
|
||||||
|
|
||||||
|
(false-if-exception (delete-file temp-file))
|
||||||
|
|
152
tests/utils.scm
152
tests/utils.scm
|
@ -97,45 +97,6 @@
|
||||||
(string-replace-substring "/nix/store/chbouib" "/nix/" "/gnu/")
|
(string-replace-substring "/nix/store/chbouib" "/nix/" "/gnu/")
|
||||||
(string-replace-substring "" "foo" "bar")))
|
(string-replace-substring "" "foo" "bar")))
|
||||||
|
|
||||||
(test-equal "fold2, 1 list"
|
|
||||||
(list (reverse (iota 5))
|
|
||||||
(map - (reverse (iota 5))))
|
|
||||||
(call-with-values
|
|
||||||
(lambda ()
|
|
||||||
(fold2 (lambda (i r1 r2)
|
|
||||||
(values (cons i r1)
|
|
||||||
(cons (- i) r2)))
|
|
||||||
'() '()
|
|
||||||
(iota 5)))
|
|
||||||
list))
|
|
||||||
|
|
||||||
(test-equal "fold2, 2 lists"
|
|
||||||
(list (reverse '((a . 0) (b . 1) (c . 2) (d . 3)))
|
|
||||||
(reverse '((a . 0) (b . -1) (c . -2) (d . -3))))
|
|
||||||
(call-with-values
|
|
||||||
(lambda ()
|
|
||||||
(fold2 (lambda (k v r1 r2)
|
|
||||||
(values (alist-cons k v r1)
|
|
||||||
(alist-cons k (- v) r2)))
|
|
||||||
'() '()
|
|
||||||
'(a b c d)
|
|
||||||
'(0 1 2 3)))
|
|
||||||
list))
|
|
||||||
|
|
||||||
(test-equal "split, element is in list"
|
|
||||||
'((foo) (baz))
|
|
||||||
(call-with-values
|
|
||||||
(lambda ()
|
|
||||||
(split '(foo bar baz) 'bar))
|
|
||||||
list))
|
|
||||||
|
|
||||||
(test-equal "split, element is not in list"
|
|
||||||
'((foo bar baz) ())
|
|
||||||
(call-with-values
|
|
||||||
(lambda ()
|
|
||||||
(split '(foo bar baz) 'quux))
|
|
||||||
list))
|
|
||||||
|
|
||||||
(test-equal "strip-keyword-arguments"
|
(test-equal "strip-keyword-arguments"
|
||||||
'(a #:b b #:c c)
|
'(a #:b b #:c c)
|
||||||
(strip-keyword-arguments '(#:foo #:bar #:baz)
|
(strip-keyword-arguments '(#:foo #:bar #:baz)
|
||||||
|
@ -150,37 +111,6 @@
|
||||||
(ensure-keyword-arguments '(#:foo 2) '(#:bar 3))
|
(ensure-keyword-arguments '(#:foo 2) '(#:bar 3))
|
||||||
(ensure-keyword-arguments '(#:foo 2) '(#:bar 3 #:foo 42))))
|
(ensure-keyword-arguments '(#:foo 2) '(#:bar 3 #:foo 42))))
|
||||||
|
|
||||||
(let* ((tree (alist->vhash
|
|
||||||
'((0 2 3) (1 3 4) (2) (3 5 6) (4 6) (5) (6))
|
|
||||||
hashq))
|
|
||||||
(add-one (lambda (_ r) (1+ r)))
|
|
||||||
(tree-lookup (lambda (n) (cdr (vhash-assq n tree)))))
|
|
||||||
(test-equal "fold-tree, single root"
|
|
||||||
5 (fold-tree add-one 0 tree-lookup '(0)))
|
|
||||||
(test-equal "fold-tree, two roots"
|
|
||||||
7 (fold-tree add-one 0 tree-lookup '(0 1)))
|
|
||||||
(test-equal "fold-tree, sum"
|
|
||||||
16 (fold-tree + 0 tree-lookup '(0)))
|
|
||||||
(test-equal "fold-tree, internal"
|
|
||||||
18 (fold-tree + 0 tree-lookup '(3 4)))
|
|
||||||
(test-equal "fold-tree, cons"
|
|
||||||
'(1 3 4 5 6)
|
|
||||||
(sort (fold-tree cons '() tree-lookup '(1)) <))
|
|
||||||
(test-equal "fold-tree, overlapping paths"
|
|
||||||
'(1 3 4 5 6)
|
|
||||||
(sort (fold-tree cons '() tree-lookup '(1 4)) <))
|
|
||||||
(test-equal "fold-tree, cons, two roots"
|
|
||||||
'(0 2 3 4 5 6)
|
|
||||||
(sort (fold-tree cons '() tree-lookup '(0 4)) <))
|
|
||||||
(test-equal "fold-tree-leaves, single root"
|
|
||||||
2 (fold-tree-leaves add-one 0 tree-lookup '(1)))
|
|
||||||
(test-equal "fold-tree-leaves, single root, sum"
|
|
||||||
11 (fold-tree-leaves + 0 tree-lookup '(1)))
|
|
||||||
(test-equal "fold-tree-leaves, two roots"
|
|
||||||
3 (fold-tree-leaves add-one 0 tree-lookup '(0 1)))
|
|
||||||
(test-equal "fold-tree-leaves, two roots, sum"
|
|
||||||
13 (fold-tree-leaves + 0 tree-lookup '(0 1))))
|
|
||||||
|
|
||||||
(test-assert "filtered-port, file"
|
(test-assert "filtered-port, file"
|
||||||
(let* ((file (search-path %load-path "guix.scm"))
|
(let* ((file (search-path %load-path "guix.scm"))
|
||||||
(input (open-file file "r0b")))
|
(input (open-file file "r0b")))
|
||||||
|
@ -238,88 +168,6 @@
|
||||||
(call-with-decompressed-port 'xz (open-file temp-file "r0b")
|
(call-with-decompressed-port 'xz (open-file temp-file "r0b")
|
||||||
get-bytevector-all))))
|
get-bytevector-all))))
|
||||||
|
|
||||||
(false-if-exception (delete-file temp-file))
|
|
||||||
(test-equal "fcntl-flock wait"
|
|
||||||
42 ; the child's exit status
|
|
||||||
(let ((file (open-file temp-file "w0b")))
|
|
||||||
;; Acquire an exclusive lock.
|
|
||||||
(fcntl-flock file 'write-lock)
|
|
||||||
(match (primitive-fork)
|
|
||||||
(0
|
|
||||||
(dynamic-wind
|
|
||||||
(const #t)
|
|
||||||
(lambda ()
|
|
||||||
;; Reopen FILE read-only so we can have a read lock.
|
|
||||||
(let ((file (open-file temp-file "r0b")))
|
|
||||||
;; Wait until we can acquire the lock.
|
|
||||||
(fcntl-flock file 'read-lock)
|
|
||||||
(primitive-exit (read file)))
|
|
||||||
(primitive-exit 1))
|
|
||||||
(lambda ()
|
|
||||||
(primitive-exit 2))))
|
|
||||||
(pid
|
|
||||||
;; Write garbage and wait.
|
|
||||||
(display "hello, world!" file)
|
|
||||||
(force-output file)
|
|
||||||
(sleep 1)
|
|
||||||
|
|
||||||
;; Write the real answer.
|
|
||||||
(seek file 0 SEEK_SET)
|
|
||||||
(truncate-file file 0)
|
|
||||||
(write 42 file)
|
|
||||||
(force-output file)
|
|
||||||
|
|
||||||
;; Unlock, which should let the child continue.
|
|
||||||
(fcntl-flock file 'unlock)
|
|
||||||
|
|
||||||
(match (waitpid pid)
|
|
||||||
((_ . status)
|
|
||||||
(let ((result (status:exit-val status)))
|
|
||||||
(close-port file)
|
|
||||||
result)))))))
|
|
||||||
|
|
||||||
(test-equal "fcntl-flock non-blocking"
|
|
||||||
EAGAIN ; the child's exit status
|
|
||||||
(match (pipe)
|
|
||||||
((input . output)
|
|
||||||
(match (primitive-fork)
|
|
||||||
(0
|
|
||||||
(dynamic-wind
|
|
||||||
(const #t)
|
|
||||||
(lambda ()
|
|
||||||
(close-port output)
|
|
||||||
|
|
||||||
;; Wait for the green light.
|
|
||||||
(read-char input)
|
|
||||||
|
|
||||||
;; Open FILE read-only so we can have a read lock.
|
|
||||||
(let ((file (open-file temp-file "w0")))
|
|
||||||
(catch 'flock-error
|
|
||||||
(lambda ()
|
|
||||||
;; This attempt should throw EAGAIN.
|
|
||||||
(fcntl-flock file 'write-lock #:wait? #f))
|
|
||||||
(lambda (key errno)
|
|
||||||
(primitive-exit (pk 'errno errno)))))
|
|
||||||
(primitive-exit -1))
|
|
||||||
(lambda ()
|
|
||||||
(primitive-exit -2))))
|
|
||||||
(pid
|
|
||||||
(close-port input)
|
|
||||||
(let ((file (open-file temp-file "w0")))
|
|
||||||
;; Acquire an exclusive lock.
|
|
||||||
(fcntl-flock file 'write-lock)
|
|
||||||
|
|
||||||
;; Tell the child to continue.
|
|
||||||
(write 'green-light output)
|
|
||||||
(force-output output)
|
|
||||||
|
|
||||||
(match (waitpid pid)
|
|
||||||
((_ . status)
|
|
||||||
(let ((result (status:exit-val status)))
|
|
||||||
(fcntl-flock file 'unlock)
|
|
||||||
(close-port file)
|
|
||||||
result)))))))))
|
|
||||||
|
|
||||||
;; This is actually in (guix store).
|
;; This is actually in (guix store).
|
||||||
(test-equal "store-path-package-name"
|
(test-equal "store-path-package-name"
|
||||||
"bash-4.2-p24"
|
"bash-4.2-p24"
|
||||||
|
|
Loading…
Reference in New Issue