1
0
forked from tribes/guix

Compare commits

..

41 Commits

Author SHA1 Message Date
self d587817010 Add Steffen (Tribes)'s PGP key. 2026-04-16 21:06:36 +02:00
Tobias Geerinckx-Rice 0f4c1ed1a7 Add key for Nguyễn Gia Phong.
* cnx-F3F6B767.key: New file.

Voucher: Andreas Enge <andreas@enge.fr>
Voucher: Liliana Marie Prikler <liliana.prikler@gmail.com>
Voucher: Sharlatan (Oleg) Hellseher <sharlatanus@gmail.com>
Change-Id: Ib0ca113e5f7be924d94ca71910354f00bd436b0f
2026-03-29 01:00:00 +01:00
Tobias Geerinckx-Rice cd60cd5bb9 Add key for Sören Tempel.
* nmeum-9C05755D.key: New file.

Voucher: Ludovic Courtès <ludo@gnu.org>
Voucher: Sharlatan Hellseher <sharlatanus@gmail.com>
Voucher: jgart <jgart@dismail.de>
Change-Id: I4e0ec08ec4ecce091aee5b5759943e02ae4d444d
2026-03-22 01:00:00 +01:00
Maxim Cournoyer f8be2117b1 Add fishinthecalculator's PGP key.
Change-Id: Ie410e8ea9ebfbb03675d231d118724ea98f04f21
2026-01-23 11:30:34 +09:00
Hartmut Goebel 6550a260db Add htgoebel's new key.
* htgoebel-D3F631DF.key: Rename to ...
* htgoebel (old)-D3F631DF.key: ... this.
* htgoebel-3A1F9D20.key: New file.

Change-Id: I9c25a42f8cef0fbfa623536b4bd24d52305aa12c
2026-01-02 15:24:10 +01:00
Andreas Enge 5c72b7cc0a Rename key file.
The .gpg suffix is not recognized by the authentication code.

* Rutherther-69E471C3.gpg: Rename to...
* Rutherther-69E471C3.key: ...this.

Change-Id: I529c0c07398d410261bcc9fd3059f5b8fbbc88c4
2025-12-11 12:07:07 +01:00
Tobias Geerinckx-Rice b6472ce4ed Add key for Rutherther.
* Rutherther-69E471C3.gpg: New file.

Voucher: Ludovic Courtès <ludo@gnu.org>
Voucher: Efraim Flashner <efraim@flashner.co.il>
Voucher: John Kehayias <john@guixotic.coop>
Change-Id: I99f8f93190c26d891ceb1b9b6c6ab6e6012f0263
2025-12-07 01:00:00 +01:00
Maxim Cournoyer 12db45a481 Add csantosb's PGP key.
Change-Id: I9778c865be1e90e741da6c4210602cb0b55580b2
2025-11-26 10:15:15 +09:00
Maxim Cournoyer 4c11a3e33a Add Sugosha (SameExpert)'s PGP key.
Voucher: Z572 <z572@z572.online>
Voucher: Ludovic Courtès <ludo@gnu.org>
Voucher: Gabriel Wicki <gabriel@erlikon.ch>
Change-Id: I3b491b5a7193603f720552e0f76d014d19ad0058
2025-09-23 22:34:30 +09:00
Maxim Cournoyer 41a4b1e49a Add key for Gabriel Wicki.
* gabber-4330FD7F.key: New key.

Change-Id: I20bb31cce0d6a87162babf76e40aabfa88db03fd
Voucher: Andreas Enge <andreas@enge.fr>
Voucher: Steve George <steve@futurile.net>
Voucher: Leo Famulari <leo@famulari.name>
2025-07-20 10:37:20 +09:00
Maxim Cournoyer 0869e2220d Add key for Steve George.
* futurile-89CA9B07.key: New key.

Change-Id: I69d2fe98756335b27f3d3502b1eaf69ab746d178
2025-02-12 20:54:58 +09:00
Tobias Geerinckx-Rice 21173006e4 Add key for Greg Hogan.
* oom-13CFEEF3.key: New file.

Change-Id: I1a17f155a6d307542212ef606771363bf1e6f9ca
2024-12-22 01:00:00 +01:00
Tobias Geerinckx-Rice 358d959e84 Add key for Ian Eure.
* ieure-F1A71CF2.key: New file.

Change-Id: I5940be870eed715723ec2efd20091548cce7dc47
2024-12-22 01:00:00 +01:00
Efraim Flashner f8868dd56b Add key for Ekaitz Zarraga.
* ekaitz-3F7356D6.key: New file.

Change-Id: I303afcdb49003698daa7e15642b3af617a998e9e
2024-11-26 13:52:07 +02:00
Sharlatan Hellseher 1d5caad391 Rename key for Artyom V. Poptsov.
* avp-0898A02F.gpg: Rename to avp-0898A02F.key.

Change-Id: Idbf6963befc7a02088280597b12a60fc8b01c9de
2024-10-12 21:35:40 +01:00
Tobias Geerinckx-Rice 15d0fd16f3 Add key for Artyom V. Poptsov.
* avp-0898A02F.gpg: New file.

Change-Id: Ie366a45b4d3986e8402222c0e20e5051e819f5ed
2024-09-08 02:00:00 +02:00
Maxim Cournoyer fbccd14b5b Add the key of Zheng Junjie (z572).
Change-Id: If25b3c572fefd93fb9020fc587683cc0a62fd585
2024-04-20 12:58:08 -04:00
Maxim Cournoyer 1b6a6d6b24 Add the key of Oleg (sharlatanus).
Change-Id: Id34e1680c3c23fa42e11c95c0f919707003992d2
2024-01-09 23:03:18 -05:00
Leo Famulari 935e3c9e93 Add lfam's new key.
* lfam-BACA7F08.key: Rename to ...
* lfam (old)-BACA7F08.key: ... this
* lfam-757F47FF.key: New file.

Change-Id: If11df36d868cdc77830041ddcc7b9570e02db237
2023-07-23 22:26:01 -04:00
Tobias Geerinckx-Rice c3db650680 Add key for Hilton Chain. 2023-08-13 02:00:00 +02:00
Maxim Cournoyer c2b8584ac5 Add key for Jorge Gomez. 2023-05-15 21:26:15 -04:00
Maxim Cournoyer 6540a2551e Add key for Josselin Poiret. 2023-05-11 11:15:56 -04:00
Maxim Cournoyer 7206ab15bd Add key for Simon Tournier. 2023-05-11 10:24:45 -04:00
Tobias Geerinckx-Rice a6f53ad63a Add key for John Kehayias.
* podiki-5A7554F1.key: New file.
2022-12-04 01:00:00 +01:00
Efraim Flashner 2417be6861 Add key for Andrew Tropin.
* abcdw-6C328EC2.key: New file.
2022-08-05 18:26:45 +03:00
Maxim Cournoyer 3b84ecee59 Add key for Vinicius Monego.
* monego-8065B68A.key: New file.
2022-01-25 21:28:24 -05:00
Liliana Marie Prikler 702f4c7942 Remove leoprikler's redundant key.
This is a follow-up to 1802c75a3e.

* leoprikler-C70E2F87.key: Remove, since it's redundant with
'lilyp-C70E2F87.key'.
2021-09-06 11:32:40 +02:00
Liliana Marie Prikler 1802c75a3e Add key for lilyp.
* lilyp-C70E2F87.key: New file.
2021-09-06 11:29:13 +02:00
Ludovic Courtès 359ca34027 Remove bavier's redundant former key.
This is a followup to d1d2bf3eb6.

* bavier (old)-19D32566.key: Remove, since it's redundant with
'bavier-AFCA8B8E.key'.
2021-06-29 16:23:17 +02:00
Ludovic Courtès d1d2bf3eb6 Add bavier's new key.
* bavier-19D32566.key: Rename to...
* bavier (old)-19D32566.key: ... this.
* bavier-AFCA8B8E.key: New file.
2021-06-23 15:33:15 +02:00
Tobias Geerinckx-Rice 5838f4e354 Add key for raghavgururajan.
* raghavgururajan-7F8BE551.key: New file.
2021-04-11 16:02:27 +02:00
Leo Famulari 3da8e4a658 Add keys for lbraun.
* lbraun-08D8092A.key, lbraun (work)-1A378446.key: New files.
2021-03-08 13:05:30 -05:00
Tobias Geerinckx-Rice dcae73e0d4 Add key for lle_bout.
* lle_bout-6BCD10A6.key: New file.
2021-02-18 12:21:27 +01:00
Ludovic Courtès 65a3e80efc Add key for leoprikler.
* leoprikler-C70E2F87.key: New file.
2020-12-28 10:43:41 +01:00
Ludovic Courtès 62aebd90ca Add public key for magali.
* magali-6E2DFC90.key: New file.
2020-12-15 12:00:17 +01:00
Marius Bakke 93085078ad Add public key for jonsger.
* jonsger-8B4E4B9F.key: New file.
2020-11-15 23:02:50 +01:00
Ludovic Courtès 5530030442 Add public key for m1gu3l.
* m1gu3l-79FABEC2.key: New file.
2020-10-16 12:05:26 +02:00
Ludovic Courtès 3b73512763 Add public key for planglois.
* planglois-E00B77FD.key: New file.
2020-09-04 11:13:42 +02:00
Tobias Geerinckx-Rice ec32c8591e Add public key of brettgilio.
* brettgilio-BA27CB87.key: New file.
2020-07-18 20:55:05 +02:00
Ludovic Courtès edb380b705 Add public key of bricewge.
* bricewge-66A18FAE.key: New file.
2020-05-04 11:05:10 +02:00
Ludovic Courtès 1edfe6dd7b Add keyring. 2020-05-01 18:41:28 +02:00
986 changed files with 26183 additions and 239938 deletions
-69
View File
@@ -1,69 +0,0 @@
;; Per-directory local variables for GNU Emacs 23 and later.
((nil
. ((fill-column . 78)
(tab-width . 8)
;; For use with 'bug-reference-prog-mode'.
(bug-reference-url-format . "http://bugs.gnu.org/%s")
(bug-reference-bug-regexp
. "<https?://\\(debbugs\\|bugs\\)\\.gnu\\.org/\\([0-9]+\\)>")))
(c-mode . ((c-file-style . "gnu")))
(scheme-mode
.
((indent-tabs-mode . nil)
(eval . (put 'eval-when 'scheme-indent-function 1))
(eval . (put 'test-assert 'scheme-indent-function 1))
(eval . (put 'test-assertm 'scheme-indent-function 1))
(eval . (put 'test-equal 'scheme-indent-function 1))
(eval . (put 'test-eq 'scheme-indent-function 1))
(eval . (put 'call-with-input-string 'scheme-indent-function 1))
(eval . (put 'guard 'scheme-indent-function 1))
(eval . (put 'lambda* 'scheme-indent-function 1))
(eval . (put 'substitute* 'scheme-indent-function 1))
(eval . (put 'modify-phases 'scheme-indent-function 1))
(eval . (put 'with-directory-excursion 'scheme-indent-function 1))
(eval . (put 'package 'scheme-indent-function 0))
(eval . (put 'origin 'scheme-indent-function 0))
(eval . (put 'build-system 'scheme-indent-function 0))
(eval . (put 'bag 'scheme-indent-function 0))
(eval . (put 'graft 'scheme-indent-function 0))
(eval . (put 'operating-system 'scheme-indent-function 0))
(eval . (put 'file-system 'scheme-indent-function 0))
(eval . (put 'manifest-entry 'scheme-indent-function 0))
(eval . (put 'manifest-pattern 'scheme-indent-function 0))
(eval . (put 'substitute-keyword-arguments 'scheme-indent-function 1))
(eval . (put 'with-store 'scheme-indent-function 1))
(eval . (put 'with-error-handling 'scheme-indent-function 0))
(eval . (put 'with-mutex 'scheme-indent-function 1))
(eval . (put 'with-atomic-file-output 'scheme-indent-function 1))
(eval . (put 'call-with-compressed-output-port 'scheme-indent-function 2))
(eval . (put 'call-with-decompressed-port 'scheme-indent-function 2))
(eval . (put 'signature-case 'scheme-indent-function 1))
(eval . (put 'emacs-batch-eval 'scheme-indent-function 0))
(eval . (put 'emacs-batch-edit-file 'scheme-indent-function 1))
(eval . (put 'emacs-substitute-sexps 'scheme-indent-function 1))
(eval . (put 'emacs-substitute-variables 'scheme-indent-function 1))
(eval . (put 'with-derivation-narinfo 'scheme-indent-function 1))
(eval . (put 'with-derivation-substitute 'scheme-indent-function 1))
(eval . (put 'syntax-parameterize 'scheme-indent-function 1))
(eval . (put 'with-monad 'scheme-indent-function 1))
(eval . (put 'mbegin 'scheme-indent-function 1))
(eval . (put 'mwhen 'scheme-indent-function 1))
(eval . (put 'munless 'scheme-indent-function 1))
(eval . (put 'mlet* 'scheme-indent-function 2))
(eval . (put 'mlet 'scheme-indent-function 2))
(eval . (put 'run-with-store 'scheme-indent-function 1))
(eval . (put 'run-with-state 'scheme-indent-function 1))
(eval . (put 'wrap-program 'scheme-indent-function 1))
;; Recognize '~', '+', and '$', as used for gexps, as quotation symbols.
;; This notably allows '(' in Paredit to not insert a space when the
;; preceding symbol is one of these.
(eval . (modify-syntax-entry ?~ "'"))
(eval . (modify-syntax-entry ?$ "'"))
(eval . (modify-syntax-entry ?+ "'"))))
(emacs-lisp-mode . ((indent-tabs-mode . nil)))
(texinfo-mode . ((indent-tabs-mode . nil)
(fill-column . 72))))
-116
View File
@@ -1,116 +0,0 @@
*~
,*
*.tmp
*.go
tmp
*.log
/build-aux
/configure
Makefile.in
Makefile
/autom4te.cache
config.cache
/aclocal.m4
/config.status
/ABOUT-NLS
/m4/ChangeLog
/m4/gettext.m4
/m4/iconv.m4
/m4/lib-ld.m4
/m4/lib-link.m4
/m4/lib-prefix.m4
/m4/nls.m4
/m4/po.m4
/m4/progtest.m4
/po/guix/ChangeLog
/po/guix/Makefile.in.in
/po/guix/Makevars.template
/po/guix/POTFILES
/po/guix/Rules-quot
/po/guix/boldquot.sed
/po/guix/en@boldquot.*
/po/guix/en@quot.*
/po/guix/insert-header.sin
/po/guix/*.insert-header
/po/guix/quot.sed
/po/guix/remove-potcdate.sed
/po/guix/remove-potcdate.sin
/po/guix/stamp-po
/po/guix/guix.pot
/po/guix/*.mo
/po/guix/*.gmo
/po/packages/ChangeLog
/po/packages/Makefile.in.in
/po/packages/Makevars.template
/po/packages/POTFILES
/po/packages/Rules-quot
/po/packages/boldquot.sed
/po/packages/en@boldquot.*
/po/packages/en@quot.*
/po/packages/insert-header.sin
/po/packages/*.insert-header
/po/packages/quot.sed
/po/packages/remove-potcdate.sed
/po/packages/remove-potcdate.sin
/po/packages/stamp-po
/po/packages/guix-packages.pot
/po/packages/*.mo
/po/packages/*.gmo
/tests/*.trs
/INSTALL
/m4/*
/pre-inst-env
/doc/.dirstamp
/doc/guix.info
/doc/guix.pdf
/doc/stamp-vti
/doc/version.texi
/gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz
/gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz
/gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz
/gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz
/guix/config.scm
/nix/nix-daemon/nix-daemon.cc
/nix/config.h
/nix/config.h.in
stamp-h[0-9]
/nix/AUTHORS
/nix/COPYING
/libformat.a
/libstore.a
/libutil.a
/guix-daemon
/test-tmp
/nix/scripts/list-runtime-roots
/test-env
/nix/nix-setuid-helper/nix-setuid-helper.cc
/scripts/guix
/doc/guix.aux
/doc/guix.cp
/doc/guix.cps
/doc/guix.fn
/doc/guix.fns
/doc/guix.ky
/doc/guix.pg
/doc/guix.toc
/doc/guix.tp
/doc/guix.vr
/doc/guix.vrs
/nix/scripts/substitute
/doc/images/bootstrap-graph.png
/doc/images/bootstrap-graph.eps
/guix-register
GPATH
GRTAGS
GTAGS
/nix-setuid-helper
/nix/scripts/guix-authenticate
/nix/scripts/offload
/emacs/Makefile.in
/emacs/Makefile
/emacs/guix-autoloads.el
/emacs/guix-helper.scm
/emacs/guix-init.el
/emacs/guix-profiles.el
/doc/os-config-bare-bones.texi
/doc/os-config-desktop.texi
-40
View File
@@ -1,40 +0,0 @@
GNU Guix is consists of Scheme code that implements the deployment model
of the Nix package management tool. In fact, it currently talks to a
build daemon whose code comes from Nix (see the manual for details.)
Nix was initially written by Eelco Dolstra; other people have been
contributing to it. See `nix/AUTHORS' for details.
The fine people listed below have contributed code to GNU Guix (in
alphabetical order):
Eric Bavier <bavier@member.fsf.org>
Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
Federico Beffa <beffa@fbengineering.ch>
Marek Benc <merkur32@gmail.com>
Sou Bunnbu (宋文武) <iyzsong@gmail.com>
Tomáš Čech <sleep_walker@suse.cz>
Ludovic Courtès <ludo@gnu.org>
John Darrington <jmd@gnu.org>
Andreas Enge <andreas@enge.fr>
Alírio Eyng <alirioeyng@gmail.com>
Alexander I. Grafov <grafov@gmail.com>
Joshua Grant <tadni@riseup.net>
Raimon Grau <raimonster@gmail.com>
David Hashe <david.hashe@dhashe.com>
Nikita Karetnikov <nikita@karetnikov.org>
Julien Lepiller <julien@lepiller.eu>
Aljosha Papsch <misc@rpapsch.de>
Deck Pickard <deck.r.pickard@gmail.com>
Manolis Ragkousis <manolis837@gmail.com>
Cyril Roelandt <tipecaml@gmail.com>
Alex Sassmannshausen <alex.sassmannshausen@gmail.com>
Cyrill Schenkel <cyrill.schenkel@gmail.com>
Jason Self <j@jxself.org>
Sree Harsha Totakura <sreeharsha@totakura.in>
David Thompson <dthompson2@worcester.edu>
Paul van der Walt <paul@denknerd.org>
Mark H. Weaver <mhw@netris.org>
Christopher A. Webber <cwebber@dustycloud.org>
Andy Wingo <wingo@pobox.com>
Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
-674
View File
@@ -1,674 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-4
View File
@@ -1,4 +0,0 @@
Normally a ChangeLog is generated at "make dist" time and available in
source tarballs.
If not, see the Git commit log at <http://git.sv.gnu.org/cgit/guix.git/>.
-173
View File
@@ -1,173 +0,0 @@
-*- mode: org; coding: utf-8; -*-
#+TITLE: Hacking GNU Guix and Its Incredible Distro
Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
Copyright © 2014 Pierre-Antoine Rault <par@rigelk.eu>
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
* Building from Git
When building Guix from a checkout, the following packages are required in
addition to those mentioned in the installation instructions:
- [[http://www.gnu.org/software/autoconf/][GNU Autoconf]]
- [[http://www.gnu.org/software/automake/][GNU Automake]]
- [[http://www.gnu.org/software/gettext/][GNU Gettext]]
- [[http://www.graphviz.org/][Graphviz]]
Run ./bootstrap to download the Nix daemon source code and to generate the
build system infrastructure using autoconf. It reports an error if an
inappropriate version of the above packages is being used.
If you get an error like this one:
configure.ac:46: error: possibly undefined macro: PKG_CHECK_MODULES
it probably means that Autoconf couldnt find pkg.m4, which is provided by
pkg-config. Make sure that pkg.m4 is available. For instance, if you
installed Automake in /usr/local, it wouldnt look for .m4 files in
/usr/share. So you have to invoke the following command in that case
$ export ACLOCAL_PATH=/usr/share/aclocal
See “info '(automake) Macro Search Path'” for more information.
Then, run ./configure as usual.
Finally, you have to invoke make check to run tests. If anything fails,
take a look at “info '(guix) Installation'” or send a message to
<guix-devel@gnu.org>.
* Running Guix before it is installed
Command-line tools can be used even if you have not run "make install".
To do that, prefix each command with ./pre-inst-env, as in:
./pre-inst-env guix build --help
Similarly, for a Guile session using the Guix modules:
./pre-inst-env guile -c '(use-modules (guix utils)) (pk (%current-system))'
The pre-inst-env script sets up all the environment variables
necessary to support this.
* The Perfect Setup
The Perfect Setup to hack on Guix is basically the perfect setup used
for Guile hacking (info "(guile) Using Guile in Emacs"). First, you
need more than an editor, you need [[http://www.gnu.org/software/emacs][Emacs]], empowered by the wonderful
[[http://nongnu.org/geiser/][Geiser]].
Geiser allows for interactive and incremental development from within
Emacs: code compilation and evaluation from within buffers, access to
on-line documentation (docstrings), context-sensitive completion, M-. to
jump to an object definition, a REPL to try out your code, and more.
To actually edit the code, Emacs already has a neat Scheme mode. But in
addition to that, you must not miss [[http://www.emacswiki.org/emacs/ParEdit][Paredit]]. It provides facilities to
directly operate on the syntax tree, such as raising an s-expression or
wrapping it, swallowing or rejecting the following s-expression, etc.
* Submitting Patches
Development is done using the Git distributed version control system. Thus,
access to the repository is not strictly necessary. We welcome contributions
in the form of patches as produced by git format-patch sent to
guix-devel@gnu.org. Please write commit logs in the [[http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs][GNU ChangeLog
format]]; you can check the commit history for examples.
Before submitting a patch that adds or modifies a package definition, please
run guix lint PACKAGE, where PACKAGE is the name of the new or modified
package, and fix any errors it reports. In addition, please make sure the
package builds on your platform, using guix build. You may also want to
check that dependent package (if applicable) are not affected by the change;
guix refresh --list-dependent PACKAGE will help you do that.
When posting a patch to the mailing list, use "[PATCH] ..." as a subject. You
may use your email client or the git send-mail command.
As you become a regular contributor, you may find it convenient to have write
access to the repository (see below.)
* Coding Style
In general our code follows the [[info:standards][GNU Coding Standards]] (GCS). However, the GCS
do not say much about Scheme, so here are some additional rules.
** Programming Paradigm
Scheme code in Guix is written in a purely functional style. One exception is
code that involves input/output, and procedures that implement low-level
concepts, such as the memoize procedure.
** Modules
Guile modules that are meant to be used on the builder side must live in the
(guix build …) name space. They must not refer to other Guix or GNU modules.
However, it is OK for a “host-side” module to use a build-side module.
Modules that deal with the broader GNU system should be in the (gnu …) name
space rather than (guix …).
** Data Types and Pattern Matching
The tendency in classical Lisp is to use lists to represent everything, and
then to browse them “by hand” using car, cdr, cadr, and co. There are
several problems with that style, notably the fact that it is hard to read,
error-prone, and a hindrance to proper type error reports.
Guix code should define appropriate data types (for instance, using
define-record-type*) rather than abuse lists. In addition, it should use
pattern matching, via Guiles (ice-9 match) module, especially when matching
lists.
** Formatting Code
When writing Scheme code, we follow common wisdom among Scheme programmers.
In general, we follow the [[http://mumble.net/~campbell/scheme/style.txt][Riastradh's Lisp Style Rules]]. This document happens
to describe the conventions mostly used in Guiles code too. It is very
thoughtful and well written, so please do read it.
Some special forms introduced in Guix, such as the substitute* macro, have
special indentation rules. These are defined in the .dir-locals.el file,
which Emacs automatically uses. If you do not use Emacs, please make sure to
let your editor know the rules.
We require all top-level procedures to carry a docstring. This requirement
can be relaxed for simple private procedures in the (guix build …) name space,
though.
Procedures should not have more than four positional parameters. Use keyword
parameters for procedures that take more than four parameters.
* Commit Access
For frequent contributors, having write access to the repository is
convenient. When you deem it necessary, feel free to ask for it on the
mailing list. When you get commit access, please make sure to follow the
policy below (discussions of the policy can take place on guix-devel@gnu.org.)
Non-trivial patches should always be posted to guix-devel@gnu.org (trivial
patches include fixing typos, etc.)
For patches that just add a new package, and a simple one, its OK to commit,
if youre confident (which means you successfully built it in a chroot setup,
and have done a reasonable copyright and license auditing.) Likewise for
package upgrades, except upgrades that trigger a lot of rebuilds (for example,
upgrading GnuTLS or GLib.) We have a mailing list for commit notifications
(guix-commits@gnu.org), so people can notice. Before pushing your changes,
make sure to run git pull --rebase.
For anything else, please post to guix-devel@gnu.org and leave time for a
review, without committing anything. If you didnt receive any reply
after two weeks, and if youre confident, its OK to commit.
That last part is subject to being adjusted, allowing individuals to commit
directly on non-controversial changes on parts theyre familiar with.
-393
View File
@@ -1,393 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2013 Andreas Enge <andreas@enge.fr>
#
# 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/>.
bin_SCRIPTS = \
scripts/guix
nodist_noinst_SCRIPTS = \
pre-inst-env \
test-env
include gnu-system.am
MODULES = \
guix/base32.scm \
guix/base64.scm \
guix/records.scm \
guix/gcrypt.scm \
guix/hash.scm \
guix/pk-crypto.scm \
guix/pki.scm \
guix/utils.scm \
guix/sets.scm \
guix/download.scm \
guix/git-download.scm \
guix/monads.scm \
guix/monad-repl.scm \
guix/gexp.scm \
guix/profiles.scm \
guix/serialization.scm \
guix/nar.scm \
guix/derivations.scm \
guix/gnu-maintenance.scm \
guix/licenses.scm \
guix/build-system.scm \
guix/build-system/cmake.scm \
guix/build-system/glib-or-gtk.scm \
guix/build-system/gnu.scm \
guix/build-system/haskell.scm \
guix/build-system/perl.scm \
guix/build-system/python.scm \
guix/build-system/waf.scm \
guix/build-system/ruby.scm \
guix/build-system/trivial.scm \
guix/ftp-client.scm \
guix/http-client.scm \
guix/gnupg.scm \
guix/elf.scm \
guix/store.scm \
guix/cvs-download.scm \
guix/svn-download.scm \
guix/ui.scm \
guix/build/download.scm \
guix/build/cmake-build-system.scm \
guix/build/git.scm \
guix/build/glib-or-gtk-build-system.scm \
guix/build/gnu-build-system.scm \
guix/build/gnu-dist.scm \
guix/build/perl-build-system.scm \
guix/build/python-build-system.scm \
guix/build/ruby-build-system.scm \
guix/build/waf-build-system.scm \
guix/build/haskell-build-system.scm \
guix/build/store-copy.scm \
guix/build/utils.scm \
guix/build/union.scm \
guix/build/profiles.scm \
guix/build/pull.scm \
guix/build/rpath.scm \
guix/build/cvs.scm \
guix/build/svn.scm \
guix/build/syscalls.scm \
guix/build/gremlin.scm \
guix/build/emacs-utils.scm \
guix/build/graft.scm \
guix/search-paths.scm \
guix/packages.scm \
guix/import/utils.scm \
guix/import/gnu.scm \
guix/import/snix.scm \
guix/scripts/download.scm \
guix/scripts/build.scm \
guix/scripts/archive.scm \
guix/scripts/import.scm \
guix/scripts/package.scm \
guix/scripts/gc.scm \
guix/scripts/hash.scm \
guix/scripts/pull.scm \
guix/scripts/substitute.scm \
guix/scripts/authenticate.scm \
guix/scripts/refresh.scm \
guix/scripts/system.scm \
guix/scripts/lint.scm \
guix/scripts/import/gnu.scm \
guix/scripts/import/nix.scm \
guix/scripts/environment.scm \
guix/scripts/publish.scm \
guix.scm \
$(GNU_SYSTEM_MODULES)
if BUILD_DAEMON_OFFLOAD
MODULES += \
guix/scripts/offload.scm
endif BUILD_DAEMON_OFFLOAD
# Internal module with test suite support.
dist_noinst_DATA = guix/tests.scm
# Because of the autoload hack in (guix build download), we must build it
# first to avoid errors on systems where (gnutls) is unavailable.
guix/scripts/download.go: guix/build/download.go
guix/download.go: guix/build/download.go
# Linux-Libre configurations.
KCONFIGS = \
gnu/packages/linux-libre-i686.conf \
gnu/packages/linux-libre-x86_64.conf
# Templates, examples.
EXAMPLES = \
gnu/system/examples/bare-bones.tmpl \
gnu/system/examples/desktop.tmpl
GOBJECTS = $(MODULES:%.scm=%.go) guix/config.go guix/tests.go
nobase_dist_guilemodule_DATA = \
$(MODULES) $(KCONFIGS) $(EXAMPLES) \
$(MISC_DISTRO_FILES)
nobase_nodist_guilemodule_DATA = $(GOBJECTS) guix/config.scm
# Do we need to provide our own non-broken (srfi srfi-37) module?
if INSTALL_SRFI_37
nobase_nodist_guilemodule_DATA += srfi/srfi-37.scm
GOBJECTS += srfi/srfi-37.go
srfi/srfi-37.scm: srfi/srfi-37.scm.in
$(MKDIR_P) srfi
cp "$<" "$@"
endif INSTALL_SRFI_37
# Handy way to remove the .go files without removing all the rest.
clean-go:
-$(RM) -f $(GOBJECTS)
SCM_TESTS = \
tests/base32.scm \
tests/base64.scm \
tests/hash.scm \
tests/pk-crypto.scm \
tests/pki.scm \
tests/sets.scm \
tests/substitute.scm \
tests/builders.scm \
tests/derivations.scm \
tests/ui.scm \
tests/records.scm \
tests/utils.scm \
tests/build-utils.scm \
tests/packages.scm \
tests/snix.scm \
tests/store.scm \
tests/monads.scm \
tests/gexp.scm \
tests/nar.scm \
tests/union.scm \
tests/profiles.scm \
tests/syscalls.scm \
tests/gremlin.scm \
tests/lint.scm \
tests/publish.scm
if HAVE_GUILE_JSON
MODULES += \
guix/import/json.scm \
guix/import/pypi.scm \
guix/scripts/import/pypi.scm \
guix/import/cpan.scm \
guix/scripts/import/cpan.scm
SCM_TESTS += \
tests/pypi.scm \
tests/cpan.scm
endif
SH_TESTS = \
tests/guix-build.sh \
tests/guix-download.sh \
tests/guix-gc.sh \
tests/guix-hash.sh \
tests/guix-package.sh \
tests/guix-package-net.sh \
tests/guix-system.sh \
tests/guix-archive.sh \
tests/guix-authenticate.sh \
tests/guix-lint.sh
if BUILD_DAEMON
SH_TESTS += tests/guix-register.sh
endif BUILD_DAEMON
TESTS = $(SCM_TESTS) $(SH_TESTS)
TEST_EXTENSIONS = .scm .sh
AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)"
SCM_LOG_COMPILER = $(top_builddir)/test-env $(GUILE)
AM_SCM_LOG_FLAGS = --no-auto-compile -L "$(top_srcdir)"
SH_LOG_COMPILER = $(top_builddir)/test-env $(SHELL)
AM_SH_LOG_FLAGS = -x -e
# Make sure `tests/guix-gc.sh' runs last, after all the others. Otherwise it
# could end up removing files from the store while they are being used by
# other instances of the daemon.
tests/guix-gc.log: \
$(patsubst %.sh,%.log,$(filter-out tests/guix-gc.sh,$(SH_TESTS))) \
$(SCM_TESTS:%.scm=%.log)
# Public key used to sign substitutes from hydra.gnu.org.
dist_pkgdata_DATA = hydra.gnu.org.pub
# Bash completion file.
dist_bashcompletion_DATA = etc/completion/bash/guix
EXTRA_DIST = \
HACKING \
ROADMAP \
TODO \
.dir-locals.el \
build-aux/build-self.scm \
build-aux/hydra/gnu-system.scm \
build-aux/hydra/demo-os.scm \
build-aux/hydra/guix.scm \
build-aux/check-available-binaries.scm \
build-aux/check-final-inputs-self-contained.scm \
build-aux/download.scm \
build-aux/list-packages.scm \
build-aux/make-binary-tarball.scm \
srfi/srfi-37.scm.in \
srfi/srfi-64.scm \
srfi/srfi-64.upstream.scm \
tests/test.drv \
tests/signing-key.pub \
tests/signing-key.sec \
build-aux/config.rpath \
bootstrap \
release.nix \
$(TESTS)
if !BUILD_DAEMON_OFFLOAD
EXTRA_DIST += \
guix/scripts/offload.scm
endif !BUILD_DAEMON_OFFLOAD
CLEANFILES = \
$(GOBJECTS) \
$(SCM_TESTS:tests/%.scm=%.log)
AM_V_GUILEC = $(AM_V_GUILEC_$(V))
AM_V_GUILEC_ = $(AM_V_GUILEC_$(AM_DEFAULT_VERBOSITY))
AM_V_GUILEC_0 = @echo " GUILEC" $@;
# Unset 'GUILE_LOAD_COMPILED_PATH' altogether while compiling. Otherwise, if
# $GUILE_LOAD_COMPILED_PATH contains $(moduledir), we may find .go files in
# there that are newer than the local .scm files (for instance because the
# user ran 'make install' recently). When that happens, we end up loading
# those previously-installed .go files, which may be stale, thereby breaking
# the whole thing.
#
# XXX: Use the C locale for when Guile lacks
# <http://git.sv.gnu.org/cgit/guile.git/commit/?h=stable-2.0&id=e2c6bf3866d1186c60bacfbd4fe5037087ee5e3f>.
.scm.go:
$(AM_V_GUILEC)$(MKDIR_P) `dirname "$@"` ; \
unset GUILE_LOAD_COMPILED_PATH ; \
LC_ALL=C \
$(top_builddir)/pre-inst-env \
$(GUILD) compile -L "$(top_builddir)" -L "$(top_srcdir)" \
-Wformat -Wunbound-variable -Warity-mismatch \
--target="$(host)" \
-o "$@" "$<"
SUFFIXES = .go
# Make sure source files are installed first, so that the mtime of
# installed compiled files is greater than that of installed source
# files. See
# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
# for details.
guix_install_go_files = install-nobase_nodist_guilemoduleDATA
$(guix_install_go_files): install-nobase_dist_guilemoduleDATA
# The above trick doesn't work for 'config.go' because both 'config.scm' and
# 'config.go' are listed in $(nobase_nodist_guilemodule_DATA). Thus, give it
# special treatment.
install-data-hook: set-bootstrap-executable-permissions
touch "$(DESTDIR)$(guilemoduledir)/guix/config.go"
SUBDIRS = po/guix po/packages
BUILT_SOURCES =
include doc.am
if BUILD_DAEMON
include daemon.am
endif BUILD_DAEMON
ACLOCAL_AMFLAGS = -I m4
AM_DISTCHECK_CONFIGURE_FLAGS = \
--with-libgcrypt-prefix="$(LIBGCRYPT_PREFIX)" \
--with-libgcrypt-libdir="$(LIBGCRYPT_LIBDIR)" \
--with-nix-prefix="$(NIX_PREFIX)" \
--enable-daemon
dist_emacsui_DATA = emacs/guix-main.scm
nodist_emacsui_DATA = emacs/guix-helper.scm
include emacs.am
# The self-contained tarball.
guix-binary.%.tar.xz:
-GUIX_PACKAGE_PATH= \
$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/make-binary-tarball.scm" "$*" "$@"
dist-hook: sync-descriptions gen-ChangeLog assert-no-store-file-names
distcheck-hook: assert-binaries-available assert-final-inputs-self-contained
sync-descriptions:
-GUIX_PACKAGE_PATH= \
$(top_builddir)/pre-inst-env guix lint --checkers=gnu-description
gen-ChangeLog:
if test -d .git; then \
$(top_srcdir)/build-aux/gitlog-to-changelog \
> $(distdir)/cl-t; \
rm -f $(distdir)/ChangeLog; \
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
fi
# Make sure we're not shipping a file that embeds a local /gnu/store file name.
assert-no-store-file-names:
if grep -r --exclude=*.texi --exclude=*.info \
"$(storedir)/[a-z0-9]{32}-" $(distdir) ; \
then \
echo "error: store file names embedded in the distribution" >&2 ; \
exit 1 ; \
fi
# Make sure hydra.gnu.org has the important binaries.
assert-binaries-available:
$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/check-available-binaries.scm"
# Make sure the final inputs don't refer to bootstrap tools.
assert-final-inputs-self-contained:
$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/check-final-inputs-self-contained.scm"
.PHONY: sync-descriptions gen-ChangeLog clean-go
.PHONY: assert-no-store-file-names assert-binaries-available
.PHONY: assert-final-inputs-self-contained
-1529
View File
File diff suppressed because it is too large Load Diff
+3 -163
View File
@@ -1,163 +1,3 @@
-*- mode: org -*-
[[http://www.gnu.org/software/guix/][GNU Guix]] (IPA: /ɡiːks/) is a purely functional package manager, and
associated free software distribution, for the [[http://www.gnu.org/gnu/gnu.html][GNU system]]. In addition
to standard package management features, Guix supports transactional
upgrades and roll-backs, unprivileged package management, per-user
profiles, and garbage collection.
It provides [[http://www.gnu.org/software/guile/][Guile]] Scheme APIs, including a high-level embedded
domain-specific languages (EDSLs) to describe how packages are to be
built and composed.
A user-land free software distribution for GNU/Linux comes as part of
Guix.
Guix is based on the [[http://nixos.org/nix/][Nix]] package manager.
* Requirements
GNU Guix currently depends on the following packages:
- [[http://gnu.org/software/guile/][GNU Guile 2.0.x]], version 2.0.7 or later
- [[http://gnupg.org/][GNU libgcrypt]]
- [[http://www.gnu.org/software/make/][GNU Make]]
- optionally [[http://savannah.nongnu.org/projects/guile-json/][Guile-JSON]], for the 'guix import pypi' command
- optionally [[http://www.gnutls.org][GnuTLS]] compiled with guile support enabled, for HTTPS support
in the 'guix download' command. Note that 'guix import pypi' requires
this functionality.
Unless `--disable-daemon' was passed, the following packages are needed:
- [[http://sqlite.org/][SQLite 3]]
- [[http://www.bzip.org][libbz2]]
- [[http://gcc.gnu.org][GCC's g++]]
When `--disable-daemon' was passed, you instead need the following:
- [[http://nixos.org/nix/][Nix]]
* Installation
See the manual for the installation instructions, either by running
info -f doc/guix.info "(guix) Installation"
or by checking the [[http://www.gnu.org/software/guix/manual/guix.html#Installation][web copy of the manual]].
For information on installation from a Git checkout, please see the HACKING
file.
* Installing Guix from Guix
You can re-build and re-install Guix using a system that already runs Guix.
To do so:
- Install the dependencies (see 'Requirements' above) and build tools using
Guix:
guix package --install autoconf automake bzip2 gcc-toolchain gettext \
guile libgcrypt pkg-config sqlite
- Set the environment variables that Guix recommends you to set during the
package installation process:
ACLOCAL_PATH, CPATH, LIBRARY_PATH, PKG_CONFIG_PATH
- Set the PATH environment variable to refer to the profile:
PATH=$HOME/.guix-profile/bin:$PATH
- Re-run the 'configure' script passing it the option
'--with-libgcrypt-prefix=$HOME/.guix-profile/', as well as
'--localstatedir=/somewhere', where '/somewhere' is the 'localstatedir'
value of the currently installed Guix (failing to do that would lead the
new Guix to consider the store to be empty!).
- Run "make", "make check", and "make install".
* How It Works
Guix does the high-level preparation of a /derivation/. A derivation is
the promise of a build; it is stored as a text file under
=/gnu/store/xxx.drv=. The (guix derivations) module provides the
`derivation' primitive, as well as higher-level wrappers such as
`build-expression->derivation'.
Guix does remote procedure calls (RPCs) to the Guix or Nix daemon (the
=guix-daemon= or =nix-daemon= command), which in turn performs builds
and accesses to the Nix store on its behalf. The RPCs are implemented
in the (guix store) module.
* Installing Guix as non-root
The Guix daemon allows software builds to be performed under alternate
user accounts, which are normally created specifically for this
purpose. For instance, you may have a pool of accounts in the
=guixbuild= group, and then you can instruct =guix-daemon= to use them
like this:
$ guix-daemon --build-users-group=guixbuild
However, unless it is run as root, =guix-daemon= cannot switch users.
In that case, it falls back to using a setuid-root helper program call
=nix-setuid-helper=. That program is not setuid-root by default when
you install it; instead you should run a command along these lines
(assuming Guix is installed under /usr/local):
# chown root.root /usr/local/libexec/nix-setuid-helper
# chmod 4755 /usr/local/libexec/nix-setuid-helper
* Contact
GNU Guix is hosted at https://savannah.gnu.org/projects/guix/.
Please email <bug-guix@gnu.org> for bug reports or questions regarding
Guix and its distribution; email <gnu-system-discuss@gnu.org> for
general issues regarding the GNU system.
Join #guix on irc.freenode.net.
* Guix & Nix
GNU Guix is based on [[http://nixos.org/nix/][the Nix package manager]]. It implements the same
package deployment paradigm, and in fact it reuses some of its code.
Yet, different engineering decisions were made for Guix, as described
below.
Nix is really two things: a package build tool, implemented by a library
and daemon, and a special-purpose programming language. GNU Guix relies
on the former, but uses Scheme as a replacement for the latter.
Using Scheme instead of a specific language allows us to get all the
features and tooling that come with Guile (compiler, debugger, REPL,
Unicode, libraries, etc.) And it means that we have a general-purpose
language, on top of which we can have embedded domain-specific languages
(EDSLs), such as the one used to define packages. This broadens what
can be done in package recipes themselves, and what can be done around them.
Technically, Guix makes remote procedure calls to the nix-worker
daemon to perform operations on the store. At the lowest level, Nix
“derivations” represent promises of a build, stored in .drv files in
the store. Guix produces such derivations, which are then interpreted
by the daemon to perform the build. Thus, Guix derivations can use
derivations produced by Nix (and vice versa).
With Nix and the [[http://nixos.org/nixpkgs][Nixpkgs]] distribution, package composition happens at
the Nix language level, but builders are usually written in Bash.
Conversely, Guix encourages the use of Scheme for both package
composition and builders. Likewise, the core functionality of Nix is
written in C++ and Perl; Guix relies on some of the original C++ code,
but exposes all the API as Scheme.
* Related software
- [[http://nixos.org][Nix, Nixpkgs, and NixOS]], functional package manager and associated
software distribution, are the inspiration of Guix
- [[http://www.gnu.org/software/stow/][GNU Stow]] builds around the idea of one directory per prefix, and a
symlink tree to create user environments
- [[http://www.pvv.ntnu.no/~arnej/store/storedoc_6.html][STORE]] shares the same idea
- [[https://live.gnome.org/OSTree/][GNOME's OSTree]] allows bootable system images to be built from a
specified set of packages
- The [[http://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
distribution; unlike Guix, it relies on core tools available on the
host system
This “orphan” branch contains the keyring of the Guix project: the OpenPGP
public keys of all the Guix committers ever. It is used to verify signatures
on Guix commits. We only ever add new keys here.
-82
View File
@@ -1,82 +0,0 @@
-*- mode: org; coding: utf-8; -*-
#+TITLE: Tentative GNU Guix Road Map
Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
The goals of the GNU Guix project are two-fold:
- to build a purely functional package manager, based on Nix and
Guile;
- to use it to build a practical 100% free software distribution of
GNU/Linux and possibly other GNU variants, with a focus on the
promotion and tight integration of GNU componentsthe GNU system.
Since its inception, the project has gone a long way towards that goal. Below
is a list of items we want for version "1.0" of the Guix System Distribution.
There will be a few 0.x releases by then to give the new features more
exposure and testing.
You're welcome to discuss this road map on guix-devel@gnu.org or #guix on
Freenode!
* Features scheduled for 1.0
- larger & more robust build farm
+ we need a powerful, dedicated front-end
+ armhf-linux build machine
+ leave Hydra in favor of 'guix publish' + custom code?
- more OS features
+ LVM support
+ encrypted root
+ configurable name service switch
+ whole-system unit tests, using VMs
- more service definitions
+ mcron, postfix(?), wicd(?), etc.
- better 'guix system'
+ 'reconfigure' should be able to restart non-essential services
+ support for '--list-generations' and '--delete-generations'
- better 'guix pull'
+ using Git to fetch the source instead of re-downloading everything
+ build more quickly
+ install new .mo files and new manual
+ authentication of the Guix source: use signed commits?
- simplified, purely declarative service list in 'operating-system'
+ it should be possible to inspect the service instance declarations and
settings
- GUIs
+ integrate guix-web?
+ guile-ncurses installer?
- 'guix publish'?
* Features for later
- complete GNU/Hurd port
- use content-based addressing when downloading substitutes to reduce
bandwidth requirements
+ design nar v2 format where file contents are replaced by their hashes
+ leverage /gnu/store/.links
- binary origin tracking
+ keep signatures in sqlite.db
+ preserve signatures upon import/export
- peer-to-peer distribution of updates (GNUnet?)
- more deterministic builds
+ identify & fix sources of non-determinism in builds
+ strengthen guix-daemon containers to further increase reproducibility
+ trusting-trust: bootstrap with different tool chains
+ fixed-point: re-bootstrap until fixed point is reached
+ distributed validation: compare contents of store items with others
* resist a hydra.gnu.org compromise
- reproducible containers: mix of 'guix environment' and 'guix system vm'
- execute code with least privilege
+ build containers like guix-daemon does
+ provide a Plash-like interface in Bash
- daemon rewritten in Guile
- more dmd integration
+ monitor network interfaces and start/stop events based on that
+ include a DHCP client written in Scheme
+170
View File
@@ -0,0 +1,170 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ZPFE
=c1wa
-----END PGP PUBLIC KEY BLOCK-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xsFNBGdzOKQBEAC8oURgv50lQfoA+X8WQOaPX9VAzXUP7hMZ91dZdYbweGpgcJB5
JtNnAdueZnYohU7lIZlqnZpfRBHQfCLa6N1Mql6xJHbbUXNzXHaBCEWvr1bpE8Yo
wxgOJ4Nt+EEAiFveI/+rEssFTbqy4oj+KeapUSPzUskT1yuEVhMAGM5RLjpT+rZF
BtIVagQ3PrC92/vrZAahg57L7/NfiqfurxzFbQlJZGPGBM8KwIFf0NOBpbziYzk6
7vxjIhJcRnAy/C3PZCsjLLyYSJWnZ5fyhdJZ3sBcc1XJJr0nzdwbwwjdcUBj4GVH
d5Zj0Bnibenvus0sAXspAUiaF9LKieZH3t+0CuP8hIsVp3pHWZHzrpfQAEvyv6da
KftOyM99Z/EaVCcJkni/1blWOBIn7EsYs/HsRsnrQOmGTOvbX+PsIKFHj0MKdb5t
A6gEaU+hD3la3RRDiPYajot4L3CpC5QMk31N6tPPqKo48JMnqquwhfdy5DmMxBEg
1XmsJAbp8zleIK20TXUJmgniWYKSJ26KYzq/T2frVu2i4L4RLIfMwaiXmcQP/XVH
VU8OQf98l4642bymY0sb4GopV1qgzIejuVWjs8v4GHihpY77BA7UFEhu/aGGKOhu
3eyXlae9F0gG6Z+lAV7MgOcaUJ/VDyR9sKGATbt8WpXAM7cAjnJ5ULaDzQARAQAB
zR9TdWdob3NoYSA8c3VnaG9zaGFAZGlzcm9vdC5vcmc+wsGUBBMBCAA+FiEE6tGJ
5HmbXl6yCioZzbwL2VlDpwYFAmdzOKQCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYC
AwECHgECF4AACgkQzbwL2VlDpwaJZRAAiQ305lY5z9RPUAqhgcyp4PLe1l8b0/N+
dYehChu0w69z82HdJBmz2l7yLeT+lvJdSVlkjUhS3i3zBavWh/NPDHj8ISEMftKk
wUid0x5e2c5Uhm2OdEunIUkgV4vlU97ogrjISqCy0yYuLZVjvxfYssmMEl0XiMtF
jJlxpt72JsZb8kkg8CWnSQz32AFhgmdckqHp8yipUYlJ3mbgDlQdrr3TjclXfqfl
XWNoNulI4o9sCpHX341a841IA+I3ZwY5xa5f5lRTpQS9JOcSgyL28uFxECKAUkKJ
SsTRXXGrkW7EYUan5irv/fazZPV8d0KRqIoTuQNOOioHoLdh8uHHPDMpojrgM5ly
0RNcze4Q4l9aU4Dal8IU3IbUMS86LMaGWdaAdneBorgoztzeQzQCgmJPLTohH3q6
0+dD0Q6U0jcXjgBzJMCwIT4tbVKq2gC0xhfZF2+Ew89/emq2RrcHMF6CwHRCL9UJ
oYIPl97AbkPqKszpogEoX/s0vZ2eEMZGo/7QqCFVbg+WPJtmevshISAaXSXKka6U
Fdoc0NBhN4l/YI9lrtty7IqmjZJzaJNvjRKyAYXcpExRbiKDDhyBSV3al1q84bpt
dfRfWtavvFo13lVRCdjcPkYQKTqxk2BjO74WNwFF471TvFN7NxPAKc+QuX2xLsBc
0iUZ624ObWLOwU0EZ3M4pAEQALaA4lt95KaiiD9TlXwaUCQwiPjlG9UDvgY4UKiN
7Frt4pspHtMhpyfLLssEmNMd2fHYPScN7w4HnzHIu6Z+LV4USr0uABo6RFZjjJh+
lWY4sE2YUg1Xd2CpJDerkAvqL9XFuuHRxcETE821qZK7HQ2EaCR+mS6EZRdozbpG
YYtPWeThgZGKiXI1l4q32xoL4WaEY/ZDvFKuXB7tqVbjnNPFZh+oqB6lD5IdKb8k
tuQUiIlzswtxsypImF9G44JuTtoTmPPdBDt52+t18ExVScg5wABxVbQeiVs30AGw
Q4MZVQDjhJmTF+4iXFMXttEH1mAvsJzJljsbi+nWKNLN+Omk9pr1eTagn2B05QQL
UWWiqRWH6hxAjNBbO1c7JjegLK3dczL15dsfYi7FwWCzHFjg1d2kJpwA9tf7ekDR
NZ0eSzmLqzmOaO1+n8dZ467m77nUP0SUD9nmrsjuJGtMTElzxv2ByT4CeKNwt9YJ
1Qla94SzMYAiINMz8vp/7eAt1lDo9siXc1Ayc99cFXTNh401UvocuWFl1Ahg19qv
asYF8nyE7IYQNIdUcYJxY6o/8RNn/rffmbD83X/ubxslMZLDEYwXByBfuJqcrxIg
hN5nJuJzuky92oL5YQtj2gllRrhGElJzViOaufcx9DtR/RA9GP+4ji3O/dMqPmce
lTFpABEBAAHCwXwEGAEIACYWIQTq0YnkeZteXrIKKhnNvAvZWUOnBgUCZ3M4pAIb
DAUJA8JnAAAKCRDNvAvZWUOnBr/OD/4j+peTZehrJVoudaEPUeG23MuNs/ko/XNF
IRapsTaQz8zYPyUdzXQes9yQ8MQu6byhtCfbiSZFNFEdasbQJOlOoq/IXH6uPGVJ
Oi9UDWDXFfqGZUwhbaZ8fAxJSNx37X5V3yMcjsApQZ/AAerGKoh6yeiH1TugSJLR
j+kriUoagTqfmcEnP+AtBee1K8mfhGpNW58HwfF4mRNV+WrRAiwxdfV+aROb34H9
bUMhsK3rSW+x769MTF9gewX5B0oV0n+9+cj2YDcntELm6zUuRGwvwgMtBoBw4jIp
3BsSgz3EtSZz11f+YLqForToCoOchyDoEGQ3K9hoIb3S8Rl5+x2Zr1gOs78ukxqo
zSBlbhv+lPvM4xX/1fMbaRWRjq8VPMqWZZhVJHDxc59xG6/89dSrvt/Nq96EZGyX
6NlrEn3rbzV+fZh4QpRNUFK1Q8umhwlWrzZVJuLfAc1c6Qm4FdDZNmrD1TYWF45n
BFS8R7ilx0yp43+qhVliPS8ik53kqoPFu4QpDzcNuYbJb7a0lb5k+xoOlhgMQYQE
z0TUPVxmVwfNJT8gkh8gJ1N3uhOp7SJMHE2YxpP+7sFTFECiE7cSiBisjy5UuaTx
hlh20GWxETPzqy8FgB/0mg57dsGc/kTitDg5vFVB3SXvNNP1Sy9O08BtJ7cJ0ZCy
fCnIDNs57Q==
=JaPp
-----END PGP PUBLIC KEY BLOCK-----
-47
View File
@@ -1,47 +0,0 @@
A big thanks to Eelco Dolstra, who designed and implemented Nix.
Transposing functional programming discipline to package management
proved to be inspiring and fruitful.
Thanks to the following people who contributed to GNU Guix through
suggestions, bug reports, patches, internationalization, or general
infrastructure help:
Lluís Batlle i Rossell <viric@viric.name>
Federico Beffa <beffa@ieee.org>
Marek Benc <merkur32@gmail.com>
Sylvain Beucler <beuc@beuc.net>
Amirouche Boubekki <amirouche.boubekki@gmail.com>
Carlos Carleos <carleos@uniovi.es>
Felipe Castro <fefcas@gmail.com>
Daniel Clark <dclark@pobox.com>
Alexandru Cojocaru <xojoc@gmx.com>
Aleix Conchillo Flaqué <aconchillo@gmail.com>
John Darrington <jmd@gnu.org>
Rafael Ferreira <rafael.f.f1@gmail.com>
Christian Grothoff <christian@grothoff.org>
Brandon Invergo <brandon@gnu.org>
Jeffrin Jose <ahiliation@yahoo.co.in>
Kete <kete@ninthfloor.org>
Daniel Kochmański <dkochmanski@hellsgate.pl>
Alex Kost <alezost@gmail.com>
Matthew Lien <bluet@bluet.org>
Niels Möller <nisse@lysator.liu.se>
Yutaka Niibe <gniibe@fsij.org>
Andrei Osipov <andrspv@gmail.com>
Adam Pribyl <pribyl@lowlevel.cz>
Pjotr Prins <pjotr.public12@thebird.nl>
rekado <rekado@elephly.net>
Joshua Randall <jcrandall@alum.mit.edu>
Bruno Félix Rezende Ribeiro <oitofelix@gnu.org>
Cyrill Schenkel <cyrill.schenkel@gmail.com>
Benno Schulenberg <coordinator@translationproject.org>
Alen Skondro <askondro@gmail.com>
Matthias Wachs <wachs@net.in.tum.de>
Andy Wingo <wingo@pobox.com>
Philip Woods <elzairthesorcerer@gmail.com>
GNU Guix also includes non-software works. Thanks to the following
people who contributed the logo and general artwork and themes:
Nikita Karetnikov <nikita@karetnikov.org>
Felipe López <felipe.lopez@openmailbox.org>
-97
View File
@@ -1,97 +0,0 @@
-*- mode: org; coding: utf-8; -*-
#+TITLE: What's left to do?
#+STARTUP: content hidestars
Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
* Add `guix publish' to publish the store using Guile's web server
Generate narinfos and nars on the fly, upon HTTP GET requests.
Ideally, extend .nix-cache-info to include the server's public key, and also
reply to requests for .narinfo.sig.
Optionally, use Guile-Avahi to publish the service.
* MAYBE Add a substituter that uses the GNUnet DHT or [[http://libswift.org][libswift]]
Would be neat if binaries could be pushed to and pulled from the GNUnet DHT or
rather libswift (since DHTs arent suited for large payloads). Guix users
would sign their binaries, and define which binaries they trust.
Use UPnP and similar to traverse NAT, like filegive does.
* user interface
** add guile-ncurses interface
* extend <package>
** add recommends field
For instance, glibc, binutils, gcc, and ld-wrapper would recommend each other.
guix package -i could ask interactively (?), or allow users to follow all or
none of the recommendations.
** add a user-environment-hook
This should specify builder code to be run when building a user
environment with guix-package. For instance, Texinfos hook would
create a new dir.
** extend propagated-build-inputs with support for multiple outputs
#+BEGIN_SRC scheme
(outputs '("out" "include"))
(propagated-build-inputs
`(((("i1" ,p1 "o1")
("i2" ,p2))
=> "include")
("i3" ,p3)))
#+END_SRC
* synchronize non-GNU package descriptions with the [[http://directory.fsf.org][FSD]]
Meta-data for GNU packages, including descriptions and synopses, can be
dumped from the FSD:
http://directory.fsf.org/wiki?title=GNU/Export&action=purge .
We could periodically synchronize with that.
* add a guildhall build system
The Guildhall is Guiles packaging system. It should be easy to add a
guildhall-build-system that does the right thing based on guildhall
recipes.
* union
Support sophisticated collision handling when building a union: honor
per-package priorities, etc.
* add GUIX_ALLOW_EXPENSIVE_TESTS
Tests that need to download stuff or otherwise take a long time would only be
run when that is defined.
* add "guix challenge"
Would download a substitute, and compare its contents against a (hopefully
locally-built) copy.
* guix build utils
** MAYBE Change ld-wrapper to add RPATH for libs passed by file name
** MAYBE Add equivalent to chrpath that uses [[https://gitorious.org/guile-dlhacks/guile-dlhacks/][guile-dlhacks]]
** MAYBE Add a hash-rewriting thing for deep dependency replacement without rebuild
See [[https://github.com/NixOS/nixpkgs/commit/d1662d715514e6ef9d3dc29f132f1b3d8e608a18][Shea Levy's `replace-dependency' in Nixpkgs]].
* distro
** port to GNU/Hurd, aka. i686-gnu
Problems include that current glibc releases do not build on GNU/Hurd.
In addition, there havent been stable releases of GNU Mach, MiG, and
Hurd, which would be a pre-condition.
+110
View File
@@ -0,0 +1,110 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=EyBc
-----END PGP PUBLIC KEY BLOCK-----
+112
View File
@@ -0,0 +1,112 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
aqt8u5BPGC7qb6oikKM=
=X0wP
-----END PGP PUBLIC KEY BLOCK-----
+22
View File
@@ -0,0 +1,22 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEW9wl+BYJKwYBBAHaRw8BAQdAurhrcJpShB9c6LjA10W25nH06B7+rC7Nha1V
ba9Jo3G0IkFsZXggVm9uZyA8YWxleHZvbmcxOTk1QGdtYWlsLmNvbT6IlgQTFggA
PgIbAQULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBOx5gmSisiCOEHk4nl/xWAk6
4/s4BQJb3CnABQkCL/NKAAoJEF/xWAk64/s4bHEA/RYaH1dxst2MIVuHZQg0VWuj
m7cWKTqzUasHhAkEi83eAQDq3b0LI5bPo5H2eYmeoULDUTJpuihi692H0luJRi6O
B4h1BBAWCAAdFiEEqH9mXV5BNBTOWlOF865L2yPs2hsFAlvcUbYACgkQ865L2yPs
2hsKdAD/XSsEETKmG5H597axepu6zUi8VnzEXRgUGMz4Gh1S9PkBALnlSMINOACE
2nMLnJnPrn3mebMZPLCvFJ/OMW1ugvUFuDMEW9wm0RYJKwYBBAHaRw8BAQdAk2ez
QR8X4VTHUVUiUDCeiBqnQaQWT5hq0Uj+p3VxaC6I9QQYFggAJgIbAhYhBOx5gmSi
siCOEHk4nl/xWAk64/s4BQJb3CnTBQkCL/JwAIF2IAQZFggAHRYhBDBvy48sAcJd
KdMFVmHvUC72AlLyBQJb3CbRAAoJEGHvUC72AlLyAtwA/j8hOb1n52PJ+ql+vYfN
E7dG7KAnN3yUW2NOAMkiN/qzAP4/QTDzBX1l0V6EUo8m6ozQFRLsDTYbEmb9OXrX
vCrpCAkQX/FYCTrj+zhWcAD/XFQnM1bdBKGnMxxI8fQRteaRS4WGt4qhW+CrJ6Jp
DIQBAKtU4vXg9hWlgHgvKXqSEEFm8HyGh/9jx/OoJSfKiLUHuDgEW9wm8BIKKwYB
BAGXVQEFAQEHQHWQ4hmlimFlV1kHTzNeEZ7OH1YxL8GtF5fSNeC2iAB+AwEIB4h+
BBgWCAAmAhsMFiEE7HmCZKKyII4QeTieX/FYCTrj+zgFAlvcKeoFCQIv8lAACgkQ
X/FYCTrj+zhYEgEAqflYQ6CHMbxZfiG1shTFx6rj7RjD9FqzN2bgefw4dDIA/20a
jPZhWiOxJFj8dk+LST8x8vTktqIJwnsNy0rxeugN
=bApJ
-----END PGP PUBLIC KEY BLOCK-----
+44
View File
@@ -0,0 +1,44 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=E8mu
-----END PGP PUBLIC KEY BLOCK-----
+81
View File
@@ -0,0 +1,81 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=SWD4
-----END PGP PUBLIC KEY BLOCK-----
+43
View File
@@ -0,0 +1,43 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
y63vnx/jt5aE6zbSm/QZPTxn3hSVmA7zdw==
=IApS
-----END PGP PUBLIC KEY BLOCK-----
+122
View File
@@ -0,0 +1,122 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
CitZrazL0TshmAveJ+txLlujAB+TQb4=
=tjy+
-----END PGP PUBLIC KEY BLOCK-----
+60
View File
@@ -0,0 +1,60 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=OQSj
-----END PGP PUBLIC KEY BLOCK-----
+157
View File
@@ -0,0 +1,157 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
9REKVGCYlTkgaMg=
=Y6Uz
-----END PGP PUBLIC KEY BLOCK-----
+174
View File
@@ -0,0 +1,174 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=4xbz
-----END PGP PUBLIC KEY BLOCK-----
+451
View File
@@ -0,0 +1,451 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
Oc/V3vQolFE5pC2nGyryCb7aTemCGYZ3euQbAHpSKC7IDSVs7VI+eYVTPT+spJeY
xf7ZeGDiHApCqnL/z2lNX45CKPgHaV137QgLWLLwWGxkIf8xAK2ags0n5Q73LPT2
dyPzcnhAN6sipjDEwamgr4lbZAkzQoIYKo9d4ao26g9jF8SeFH0PPPJyYGNKxSGV
abKZYTTpPI6UgtZaKpmRlshYmwGWLokCMwQQAQgAHRYhBHoYgH8QCkVwxZaEIH5O
ZchyC3BrBQJebYIoAAoJEH5OZchyC3BrtqYQAJfwdA9el3n6wNC/q4GfRFD/tg43
Qnh5PBAyL7LJ8L47ffAQ+MQgL2anGHbKIAXpUd+8j9/Wuxpf1Catp5ZqHv/PCTwT
yb2Xbb5INTHSrRH3FZaUOQ2+krnoQs0iBXHYZ9tluFu0QGR3j/byW0MY87nF5Dvy
3rEXBiZXA8K7VmXdqH1ergGtQJuR8aHX52P7s8kXI/60AcKtTjApKkvKvRbv2WJF
AszEx8LO06cWJk7V4RsQyw+b9fW2nesD1fSjTCsVDXQNujW/G4twqL6Nwgk0qpj/
diZwuVnPt0i47Ma0i71nXwdCWBEX3p0TfbgR7wI6XX+sEHpTQkWxs6085jhwIrwX
sde5vu7wOMgNDN/mmt4Cp6yQkqDmefJWt8wSFk3XAZDJFd8PMqjL+pOAwWKBfpYY
euKGy5+du7IL1btXlY/leWLIuemHGdOlXQX/7qvWbfp0zYqO2IEsR86vlL/UbRzB
de6lamiJzpxmzJ9zPxq6Ez4KDuxvk2T147Z7HwNzK+7ooh2u4t913DOToOnGleUM
Xz6VhAIpzYJPH8O+wXnWonPMNjq4FJAQ2KuGBdPnwPR9FhQtoPMbR+52hspxsZRP
BZkF9oFKBp22fCUAmqFAE7ss96AAykFU09IFoRrLd3qVWrWaTYkl38cZXlgQ+kL2
lWrwur3iEVDC01++tCtBbWluIEJhbmRhbGkgPGFiYW5kYWxpQGNzY2x1Yi51d2F0
ZXJsb28uY2E+iQJVBBMBCAA/AhsBBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgBYh
BL5ic3OOYW1tGzoI6KIaAgJIgWEDBQJecqebBQkHhWfIAAoJEKIaAgJIgWEDHDYQ
AJ66mn59KBnTcCYO3YaQ4YYggRIfTVPYvW7xsnTTn64Hiu+xwaUz9rQRFJCocf61
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
=T+4B
-----END PGP PUBLIC KEY BLOCK-----
+125
View File
@@ -0,0 +1,125 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
gec=
=fLn6
-----END PGP PUBLIC KEY BLOCK-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFgAga0BCADIY78eSt/I4vGPo/UMBMQhcM8O2tptvlN0B2F6Z8sDAOwgWnQp
d0x2AVM8I39VymnmbEQfWf/Y0U9XJqrmOz91NreTsZUsR9BSZy1fVIUbdoQTI8m8
CGpjDBnloX+cQwwDPDS2RL2/a0rZciXUMunVvM/o2zLHUIyO/GeoqKN5mU4d4nZY
PHtBOBpmzfvfyZLM1uyu/flbKGFqW0uKmS8MQWhyUdvIsiAU/Aofuf0dVp2C/Z5w
01Vyw38fReZ20onxbabSjLrOT+K6vzrV/9P+6435Ptoek+5BoQX50f+cMYq4d2rE
2PBenDy4xAloL/qOUj6XqwW9ZWAkLLiqYiJdABEBAAG0LkZlZGVyaWNvIEJlZmZh
IChOb25lKSA8YmVmZmFAZmJlbmdpbmVlcmluZy5jaD6JATgEEwECACIFAlgAga0C
GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEFiTbg4vG1pMn44IAMKLId+i
81Qp15Tn+VQQqxp5hI5IK2UpkzD4TnjAfX2AO9ao5fyCGKU0tWopUY4xjtU/YH9C
A9eqfmo46PTU5AFssfTly9sxtNGKhWhViBlfNHH19W3I4eF7OwN1tRon/QacCDkj
iUwElyE03/H/IPk5TB25tRmqpcoM4VrHjLIkVvmQOFOeItFKWg6jARY0x09KcHKp
P+Q3SVdS+3JTrO97xhMjAaPByiRgrjGCYTnh9MIPl/ANJFIlJVx8R1ZqeGUJBd2E
Or6RkG34WpSC/tdfI9vxajlAHAUAIoUNq6Jn7LvVLGcnZXcoE4gU8oBtXkr79SUd
42S6HC+S/XeRHfy5AQ0EWACBrQEIAMsqA2oLmPYfdE1uhsOfDDrt72Lx7BADKqhz
k8Nqny45ISPe03MjOkVUwuClceuZDGByZ/u7fslcWvAzcjcLDO4thWj1a9s1PUmH
5evVBfFQNaHaZ5gdRdIuE+O/Vkv+pbbcR1zckBSj4PCZCBF2rQgukxNaeRB4rTAC
0VgozLRK/OgDV8nyCA/0Lx1GAFoUj+KgIIUI0mPQzPuCMJHBoOVoWQit9qANTQN0
89P/6r8dj/3AVPnUmnpENul1gtxa2k7ck9F9hH7ePD3djL2tYtQcH720eqrV70Kd
gSp7Q/N4Kujw7b9RgNmo2cUuTkRfiqR+grp7XR9BD552haU8a5EAEQEAAYkBHwQY
AQIACQUCWACBrQIbDAAKCRBYk24OLxtaTBr5B/4vmneqSuuMYmWcurgk2sv+WKky
81Q0z4OkXfwBVz+H6wdpmij0de6ZMbFqD6GjtsAMmEXKdQtbElcryibSXJSCcF6z
d534yOdkC0ptOH09thCE8SoZQ6QLQ+wkcqqCBQSNujN+TNG3L7a50p91wLg1AXYX
F+cOJ2bND8p3g5RjxGk4EEjTHycc9BMA1SRvAZsJG7WB63q1oKPwdVPy7FnNvV6H
OR1DJeh4Fkmq0cJCoQ6AOQ4AhVBRXv74XT+rnjVblT3ISSEyneF4IfsztGboIzac
7M/2czPyFWuID9mjiEcRbormFsV0Pz3huJ4AMlmCb/96ZKPAWQYVa7EmPy5Q
=SMJ5
-----END PGP PUBLIC KEY BLOCK-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFhmClEBCACWlMzAd3Nm5WD8wwVcZB4mMGJNK41tOKvFxLTpQBuVLSU8Oebv
zzJx6cWTAylqMOEtI1K4q3BtxvQ9L7ofkY/N8tVRO0zSTjFhYaFYrpNAF4TY5pSa
RTjeCp1FOU+2dR50LC7ev3p8TWSDPITdzXAhTBPRNIy1zBRNo/2FkwHktSov3W51
Ej9f/g5iIuy2yVSwPzqxynXErgmwILXa3j40ZYXj1jEFeBoeLGzSPVbeFLknvS8B
4yMx6JLVvvK+IilKzFZ97kFcnYVVx8HvyyZZLYwGapI0BSWSK4GWt1SBt4KVEREZ
38SVtyGsCSX5PBBzv/zy+gO3HOsrXGzz0RbdABEBAAG0JkJlbiBXb29kY3JvZnQg
PGRvbnR0cnVzdGJlbkBnbWFpbC5jb20+iQE3BBMBCAAhBQJYZgpRAhsDBQsJCAcC
BhUICQoLAgQWAgMBAh4BAheAAAoJECpq2fSqwg32OuEH/iMyKHsHrS4upCAl+JBy
Bq4H7MWnZQYC/f4hc1RX1WKnVYZRYuX4GTZYR+sE3J60kpdhv3ZPby5Q8mNyZXkH
wf3sF8oNpqWK5LVdM32UChMQK7L7VTkMNG7lPAq1hfS0iLiaaDN366iQNv62u4eB
8dw933877jkeobr8hnTaBNmUf2s9eJm23Cmk81DNaEFLsIvVMEcmuiz4x8rLYG+7
o8usK7n684OI2DV0k90Xn876VZtFUg9PDxnHixlvzETo2D+C6HIIx8660YJHnogr
jNEP6Wj0CT1MoiZ/dMZepY1k+uNeyreSuXv2w/Y2qzbRM34ccXArYNyFV/a5KyAJ
i9e5AQ0EWGYKUQEIAMAnzONTpBbvK9KZ2cHh+zwAF83VDl3V6EVANbQWBV39V7Rh
+Dmpuro9RqZ5VyGD94nFyeUUIFUO8Uy8wT9CW9A7FD1zFe38bhb7oC0K1XeGYm/0
WMadUb3Zp42T2KCbWN4agH9B3CwhJ/WJEM5fRpTfGq2HMq5LGlLs0AlPCli582MJ
81tmoSzdnauVdtm+4llWCk/trpCag5TUed1pHFooOKIqSDmCnLei2cuXODj5Bdt1
O3yTErBRLZcHc/Ep32DYNDqlbyeWL1KDHj4Ckc4ietX/jqpExko/RuCIhBR1niKA
AYT3P31p82oPvX9Mz4Ro5nbdzeYfjODCljp3+AMAEQEAAYkBHwQYAQgACQUCWGYK
UQIbDAAKCRAqatn0qsIN9mn0B/48T6WI2PDGn79woGBoG6VWvV3JWrXW+tA45Zy/
XVEdSuDvFhMHZYwlFMr3ckhaX5Zi7NuHATIwONekIjtLusf8ievFbR4Ez4DzoN8h
FSe00vh0C0xaOzEkufPjanbtyVCfJgGPdHJ8alB4Wxq6INvg/UBrRW4sqEikaogk
52VCdLtLp5MnhJkmMIn0BvHkOyFs2DdKa/uld85cBwLiwSQpi4nj8EVIG77gYR5S
lSmS9m65DZYp2/r2x9b8uqkc40a/USdpP/M41Kj67iHnYcQrl6/9O2i1dYMONBql
60488V4ArDgWSZn3X5jO45flYE2S1mUc3vzfRl02Ms/JV+u5
=mgGB
-----END PGP PUBLIC KEY BLOCK-----
+185
View File
@@ -0,0 +1,185 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ugGwG9zObyWr6mj4fFA8ureXYA==
=1FKf
-----END PGP PUBLIC KEY BLOCK-----
-5
View File
@@ -1,5 +0,0 @@
#!/bin/sh
# Create the build system.
set -e -x
exec autoreconf -vfi
+51
View File
@@ -0,0 +1,51 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
S96bMw==
=UgjY
-----END PGP PUBLIC KEY BLOCK-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ihtSniwGIQ==
=75zi
-----END PGP PUBLIC KEY BLOCK-----
+31
View File
@@ -0,0 +1,31 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBF8JTDABCADIOK7ciRg/PGLYj8MRQa5SLuAgrcrJITXUI9cKOfJGtTJPGzLL
LrDD8RmkOU82GY3lFjkQ+MzQApT1NtBJe700G+kPhBGoSiDZCsEMJp0EepA+RhOH
EOybYHT5b83o3Yh1hfKnhJLhMfUmexuvwhxZs7baHSKnUAq0pJzv/YtyGYX7uqiM
50JmEoLazXrRyl61clofOfGgFid4BQssV+IeTb0v5r7l4Qv5PU1XQqvO30Hk8+2x
y/pBv0uJuNJUqtiaORm0caJjLp0rc76/E945Jh8n6e/NEOnmWDcgMf6RnkSTmE7I
LvjrlOzGSGFD9I5WyGQD8NvpXlNP3wNFnV07ABEBAAG0LkJyZXR0IEdpbGlvIChQ
cml2YXRlIEdQRyBLZXkpIDxicmV0dGdAZ251Lm9yZz6JAVQEEwEIAD4WIQToKsAm
ldb/AkPKHlz2xS3RuifLhwUCXwlMMAIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgID
AQIeAQIXgAAKCRD2xS3RuifLh75SB/9JZa+c7SWBk1GHIfIjBPJEKhX6fIjDvaH+
dQQY0BWnE79mFrZCbPBtnRKohnGvAwWbYR5xsJrJimsme+PmDoqRCWtbeFS6QIJx
Ig6iPBA/E7sSfbs6zaFz8E09AZt6xUWhFLMZNkuLU8JWFz8I/8jL32C3hRW/MKGe
h4BypjUzVBVsKDwWOAoYsKZHuhQF5gzQrh96AqTgMh/gzCR5Q78fxF335arht9c2
5WoXiYJn/NHeSNi12vQ2DtqhrkUWmN+dMbOGddaEk7JFbpmZhCUQFeK0LHyMnXCt
nyKVWcC0br/LtvyXr+W7dyA6SJ6xpEb72jqIi9GAw5pA1fTxapTruQENBF8JTDAB
CADBF+D4xd81wkxcyQlP8dhE+0NW269Y31pNx/qAZKVEzBbTqmrXWHSGf8CVZLJT
5oVOmC3nMIwRo/GuK7VTjRj7PruBcXpbqzuvMAk44SGtQIk81xca1+xrQT8xAs/+
fimxSgYeG5AoB6e+5KxHv7SjqwXjU3WE7gqz5lcUk5kBPfjo0UtzhReK3FePxcjF
NFNr3CCnNST6g6y70Nno89bKd0XcgwYtuwapVBxo9FSZza826+rj0UMsg+XCcerI
Yz6KREFb8hkkHi9zGSLgP26ONyFmYxM8qvfoDnHAjmuqlGFE00WTAh+qIIEFOzd+
GPgbM7xYHCbdXPOQZ+z2ZK9LABEBAAGJATwEGAEIACYWIQToKsAmldb/AkPKHlz2
xS3RuifLhwUCXwlMMAIbDAUJA8JnAAAKCRD2xS3RuifLh5LYB/9BArNzn//eTeDr
HyOBYpaoo8uF6k5k9Bsm4A8shr8uSagaj7JvOKiQM7Xp+loIVwJ2kUbM6dzY0Opn
SNlcr7cmP/a4LpRqDbdJVQidL+YeYuhjSdk49zmtA6fJ4KzMUZvc9wLQCRy6LHm7
zgc0Z3kYfuIY4tLIjkesuz3CzCS2sCYyHZWkuIDk2Y0S/unH16EsoFWzbl+hUL7C
kL8wTjBe6Ha1gcThdY0UaiSZBqLsRXHZWy9imOYyKZ6SO0K331MEyaOjS+/PAwbI
hE5/QrslksZwfdvMuL5mhI/RqEW/Ngzxg2LHjqdoUq0rk4aEiQ3zoeQSY4xY5rTe
o+dOFmwC
=xoG7
-----END PGP PUBLIC KEY BLOCK-----
+347
View File
@@ -0,0 +1,347 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ifj+ccdGYpikfv7KOzn2dvte
=lIl+
-----END PGP PUBLIC KEY BLOCK-----
-98
View File
@@ -1,98 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 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 (build-self)
#:use-module (gnu)
#:use-module (guix)
#:use-module (srfi srfi-1)
#:export (build))
;;; Commentary:
;;;
;;; When loaded, this module returns a monadic procedure of at least one
;;; argument: the source tree to build. It returns a derivation that
;;; builds it.
;;;
;;; This file uses modules provided by the already-installed Guix. Those
;;; modules may be arbitrarily old compared to the version we want to
;;; build. Because of that, it must rely on the smallest set of features
;;; that are likely to be provided by the (guix) and (gnu) modules, and by
;;; Guile itself, forever and ever.
;;;
;;; Code:
;; The dependencies. Don't refer explicitly to the variables because they
;; could be renamed or shuffled around in modules over time. Conversely,
;; 'find-best-packages-by-name' is expected to always have the same semantics.
(define libgcrypt
(first (find-best-packages-by-name "libgcrypt" #f)))
(define guile-json
(first (find-best-packages-by-name "guile-json" #f)))
;; The actual build procedure.
(define (top-source-directory)
"Return the name of the top-level directory of this source tree."
(and=> (assoc-ref (current-source-location) 'filename)
(lambda (file)
(string-append (dirname file) "/.."))))
;; The procedure below is our return value.
(define* (build source #:key verbose?
#:allow-other-keys
#:rest rest)
"Return a derivation that unpacks SOURCE into STORE and compiles Scheme
files."
(define builder
#~(begin
(use-modules (guix build pull))
(let ((json (string-append #$guile-json "/share/guile/site/2.0")))
(set! %load-path (cons json %load-path))
(set! %load-compiled-path (cons json %load-compiled-path)))
(build-guix #$output #$source
;; XXX: This is not perfect, enabling VERBOSE? means
;; building a different derivation.
#:debug-port (if #$verbose?
(current-error-port)
(%make-void-port "w"))
#:gcrypt #$libgcrypt)))
(gexp->derivation "guix-latest" builder
#:modules '((guix build pull)
(guix build utils))
;; Arrange so that our own (guix build …) modules are
;; used.
#:module-path (list (top-source-directory))))
;; This file is loaded by 'guix pull'; return it the build procedure.
build
;; Local Variables:
;; eval: (put 'with-load-path 'scheme-indent-function 1)
;; End:
;;; build-self.scm ends here
-56
View File
@@ -1,56 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 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/>.
;;;
;;; Check whether important binaries are available at hydra.gnu.org.
;;;
(use-modules (guix store)
(guix packages)
(guix derivations)
(gnu packages emacs)
(gnu packages make-bootstrap)
(srfi srfi-1)
(srfi srfi-26))
(with-store store
(parameterize ((%graft? #f))
(let* ((native (append-map (lambda (system)
(map (cut package-derivation store <> system)
(list %bootstrap-tarballs emacs)))
%hydra-supported-systems))
(cross (map (cut package-cross-derivation store
%bootstrap-tarballs <>)
'("mips64el-linux-gnuabi64")))
(total (append native cross)))
(define (warn item system)
(format (current-error-port) "~a (~a) is not substitutable~%"
item system)
#f)
(set-build-options store #:use-substitutes? #t)
(let* ((substitutable? (substitution-oracle store total))
(result (every (lambda (drv)
(let ((out (derivation->output-path drv)))
(or (substitutable? out)
(warn out (derivation-system drv)))))
total)))
(when result
(format (current-error-port) "~a packages found substitutable~%"
(length total)))
(exit result)))))
@@ -1,81 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 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/>.
;;;
;;; Check whether important binaries are available at hydra.gnu.org.
;;;
(use-modules (guix store)
(guix packages)
(guix derivations)
(guix ui)
(gnu packages commencement)
(ice-9 match)
(srfi srfi-1)
(srfi srfi-26))
(define (final-inputs store system)
"Return the list of outputs directories of the final inputs for SYSTEM."
(append-map (match-lambda
((name package)
(let ((drv (package-derivation store package system)))
;; Libc's 'debug' output refers to gcc-cross-boot0, but it's
;; hard to avoid, so we tolerate it. This should be the
;; only exception.
(filter-map (match-lambda
(("debug" . directory)
(if (string=? "glibc" (package-name package))
#f
directory))
((_ . directory) directory))
(derivation->output-paths drv)))))
%final-inputs))
(define (assert-valid-substitute substitute)
"Make sure SUBSTITUTE does not refer to any bootstrap inputs, and bail out
if it does."
(let ((references (substitutable-references substitute)))
(when (any (cut string-contains <> "boot") references)
(leave (_ "'~a' refers to bootstrap inputs: ~s~%")
(substitutable-path substitute) references))))
(define (test-final-inputs store system)
"Check whether the final inputs for SYSTEM are clean---i.e., they don't
refer to the bootstrap tools."
(format #t "checking final inputs for '~a'...~%" system)
(let* ((inputs (final-inputs store system))
(available (substitutable-path-info store inputs)))
(for-each (lambda (dir)
(unless (find (lambda (substitute)
(string=? (substitutable-path substitute)
dir))
available)
(leave (_ "~a (system: ~a) has no substitute~%")
dir system)))
inputs)
(for-each assert-valid-substitute available)))
;; Entry point.
(with-store store
(parameterize ((%graft? #f))
(set-build-options store #:use-substitutes? #t)
(for-each (cut test-final-inputs store <>)
%hydra-supported-systems)))
-74
View File
@@ -1,74 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.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/>.
;;;
;;; Download a binary file from an external source.
;;;
(use-modules (ice-9 match)
(web uri)
(web client)
(rnrs io ports)
(srfi srfi-11)
(guix utils)
(guix hash))
(define %url-base
"http://alpha.gnu.org/gnu/guix/bootstrap"
;; Alternately:
;;"http://www.fdn.fr/~lcourtes/software/guix/packages"
)
;; XXX: Work around <http://bugs.gnu.org/13095>, present in Guile
;; up to 2.0.7.
(module-define! (resolve-module '(web client))
'shutdown (const #f))
(define (file-name->uri file)
"Return the URI for FILE."
(match (string-tokenize file (char-set-complement (char-set #\/)))
((_ ... system basename)
(string->uri (string-append %url-base "/" system
(match system
("armhf-linux"
"/20150101/")
(_
"/20131110/"))
basename)))))
(match (command-line)
((_ file expected-hash)
(let ((uri (file-name->uri file)))
(format #t "downloading file `~a' from `~a'...~%"
file (uri->string uri))
(let*-values (((resp data) (http-get uri #:decode-body? #f))
((hash) (bytevector->base16-string (sha256 data)))
((part) (string-append file ".part")))
(if (string=? expected-hash hash)
(begin
(call-with-output-file part
(lambda (port)
(put-bytevector port data)))
(rename-file part file))
(begin
(format (current-error-port)
"file at `~a' has SHA256 ~a; expected ~a~%"
(uri->string uri) hash expected-hash)
(exit 1)))))))
-432
View File
@@ -1,432 +0,0 @@
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
& eval 'exec perl -wS "$0" $argv:q'
if 0;
# Convert git log output to ChangeLog format.
my $VERSION = '2012-07-29 06:11'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
# do its job. Otherwise, update this string manually.
# Copyright (C) 2008-2013 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Written by Jim Meyering
use strict;
use warnings;
use Getopt::Long;
use POSIX qw(strftime);
(my $ME = $0) =~ s|.*/||;
# use File::Coda; # http://meyering.net/code/Coda/
END {
defined fileno STDOUT or return;
close STDOUT and return;
warn "$ME: failed to close standard output: $!\n";
$? ||= 1;
}
sub usage ($)
{
my ($exit_code) = @_;
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
if ($exit_code != 0)
{
print $STREAM "Try '$ME --help' for more information.\n";
}
else
{
print $STREAM <<EOF;
Usage: $ME [OPTIONS] [ARGS]
Convert git log output to ChangeLog format. If present, any ARGS
are passed to "git log". To avoid ARGS being parsed as options to
$ME, they may be preceded by '--'.
OPTIONS:
--amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
makes a change to SHA1's commit log text or metadata.
--append-dot append a dot to the first line of each commit message if
there is no other punctuation or blank at the end.
--no-cluster never cluster commit messages under the same date/author
header; the default is to cluster adjacent commit messages
if their headers are the same and neither commit message
contains multiple paragraphs.
--srcdir=DIR the root of the source tree, from which the .git/
directory can be derived.
--since=DATE convert only the logs since DATE;
the default is to convert all log entries.
--format=FMT set format string for commit subject and body;
see 'man git-log' for the list of format metacharacters;
the default is '%s%n%b%n'
--strip-tab remove one additional leading TAB from commit message lines.
--strip-cherry-pick remove data inserted by "git cherry-pick";
this includes the "cherry picked from commit ..." line,
and the possible final "Conflicts:" paragraph.
--help display this help and exit
--version output version information and exit
EXAMPLE:
$ME --since=2008-01-01 > ChangeLog
$ME -- -n 5 foo > last-5-commits-to-branch-foo
SPECIAL SYNTAX:
The following types of strings are interpreted specially when they appear
at the beginning of a log message line. They are not copied to the output.
Copyright-paperwork-exempt: Yes
Append the "(tiny change)" notation to the usual "date name email"
ChangeLog header to mark a change that does not require a copyright
assignment.
Co-authored-by: Joe User <user\@example.com>
List the specified name and email address on a second
ChangeLog header, denoting a co-author.
Signed-off-by: Joe User <user\@example.com>
These lines are simply elided.
In a FILE specified via --amend, comment lines (starting with "#") are ignored.
FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
a line) referring to a commit in the current project, and CODE refers to one
or more consecutive lines of Perl code. Pairs must be separated by one or
more blank line.
Here is sample input for use with --amend=FILE, from coreutils:
3a169f4c5d9159283548178668d2fae6fced3030
# fix typo in title:
s/all tile types/all file types/
1379ed974f1fa39b12e2ffab18b3f7a607082202
# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
# Change the author to be Paul. Note the escaped "@":
s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
EOF
}
exit $exit_code;
}
# If the string $S is a well-behaved file name, simply return it.
# If it contains white space, quotes, etc., quote it, and return the new string.
sub shell_quote($)
{
my ($s) = @_;
if ($s =~ m![^\w+/.,-]!)
{
# Convert each single quote to '\''
$s =~ s/\'/\'\\\'\'/g;
# Then single quote the string.
$s = "'$s'";
}
return $s;
}
sub quoted_cmd(@)
{
return join (' ', map {shell_quote $_} @_);
}
# Parse file F.
# Comment lines (starting with "#") are ignored.
# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
# (alone on a line) referring to a commit in the current project, and
# CODE refers to one or more consecutive lines of Perl code.
# Pairs must be separated by one or more blank line.
sub parse_amend_file($)
{
my ($f) = @_;
open F, '<', $f
or die "$ME: $f: failed to open for reading: $!\n";
my $fail;
my $h = {};
my $in_code = 0;
my $sha;
while (defined (my $line = <F>))
{
$line =~ /^\#/
and next;
chomp $line;
$line eq ''
and $in_code = 0, next;
if (!$in_code)
{
$line =~ /^([0-9a-fA-F]{40})$/
or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
$fail = 1, next;
$sha = lc $1;
$in_code = 1;
exists $h->{$sha}
and (warn "$ME: $f:$.: duplicate SHA1\n"),
$fail = 1, next;
}
else
{
$h->{$sha} ||= '';
$h->{$sha} .= "$line\n";
}
}
close F;
$fail
and exit 1;
return $h;
}
# git_dir_option $SRCDIR
#
# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
# is undef). Return as a list (0 or 1 element).
sub git_dir_option($)
{
my ($srcdir) = @_;
my @res = ();
if (defined $srcdir)
{
my $qdir = shell_quote $srcdir;
my $cmd = "cd $qdir && git rev-parse --show-toplevel";
my $qcmd = shell_quote $cmd;
my $git_dir = qx($cmd);
defined $git_dir
or die "$ME: cannot run $qcmd: $!\n";
$? == 0
or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
chomp $git_dir;
push @res, "--git-dir=$git_dir/.git";
}
@res;
}
{
my $since_date;
my $format_string = '%s%n%b%n';
my $amend_file;
my $append_dot = 0;
my $cluster = 1;
my $strip_tab = 0;
my $strip_cherry_pick = 0;
my $srcdir;
GetOptions
(
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
'since=s' => \$since_date,
'format=s' => \$format_string,
'amend=s' => \$amend_file,
'append-dot' => \$append_dot,
'cluster!' => \$cluster,
'strip-tab' => \$strip_tab,
'strip-cherry-pick' => \$strip_cherry_pick,
'srcdir=s' => \$srcdir,
) or usage 1;
defined $since_date
and unshift @ARGV, "--since=$since_date";
# This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
# that makes a correction in the log or attribution of that commit.
my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
my @cmd = ('git',
git_dir_option $srcdir,
qw(log --log-size),
'--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV);
open PIPE, '-|', @cmd
or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
. "(Is your Git too old? Version 1.5.1 or later is required.)\n");
my $prev_multi_paragraph;
my $prev_date_line = '';
my @prev_coauthors = ();
while (1)
{
defined (my $in = <PIPE>)
or last;
$in =~ /^log size (\d+)$/
or die "$ME:$.: Invalid line (expected log size):\n$in";
my $log_nbytes = $1;
my $log;
my $n_read = read PIPE, $log, $log_nbytes;
$n_read == $log_nbytes
or die "$ME:$.: unexpected EOF\n";
# Extract leading hash.
my ($sha, $rest) = split ':', $log, 2;
defined $sha
or die "$ME:$.: malformed log entry\n";
$sha =~ /^[0-9a-fA-F]{40}$/
or die "$ME:$.: invalid SHA1: $sha\n";
# If this commit's log requires any transformation, do it now.
my $code = $amend_code->{$sha};
if (defined $code)
{
eval 'use Safe';
my $s = new Safe;
# Put the unpreprocessed entry into "$_".
$_ = $rest;
# Let $code operate on it, safely.
my $r = $s->reval("$code")
or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
# Note that we've used this entry.
delete $amend_code->{$sha};
# Update $rest upon success.
$rest = $_;
}
# Remove lines inserted by "git cherry-pick".
if ($strip_cherry_pick)
{
$rest =~ s/^\s*Conflicts:\n.*//sm;
$rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
}
my @line = split "\n", $rest;
my $author_line = shift @line;
defined $author_line
or die "$ME:$.: unexpected EOF\n";
$author_line =~ /^(\d+) (.*>)$/
or die "$ME:$.: Invalid line "
. "(expected date/author/email):\n$author_line\n";
# Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
# `(tiny change)' annotation.
my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
? ' (tiny change)' : '');
my $date_line = sprintf "%s %s$tiny\n",
strftime ("%F", localtime ($1)), $2;
my @coauthors = grep /^Co-authored-by:.*$/, @line;
# Omit meta-data lines we've already interpreted.
@line = grep !/^(?:Signed-off-by:[ ].*>$
|Co-authored-by:[ ]
|Copyright-paperwork-exempt:[ ]
)/x, @line;
# Remove leading and trailing blank lines.
if (@line)
{
while ($line[0] =~ /^\s*$/) { shift @line; }
while ($line[$#line] =~ /^\s*$/) { pop @line; }
}
# Record whether there are two or more paragraphs.
my $multi_paragraph = grep /^\s*$/, @line;
# Format 'Co-authored-by: A U Thor <email@example.com>' lines in
# standard multi-author ChangeLog format.
for (@coauthors)
{
s/^Co-authored-by:\s*/\t /;
s/\s*</ </;
/<.*?@.*\..*>/
or warn "$ME: warning: missing email address for "
. substr ($_, 5) . "\n";
}
# If clustering of commit messages has been disabled, if this header
# would be different from the previous date/name/email/coauthors header,
# or if this or the previous entry consists of two or more paragraphs,
# then print the header.
if ( ! $cluster
|| $date_line ne $prev_date_line
|| "@coauthors" ne "@prev_coauthors"
|| $multi_paragraph
|| $prev_multi_paragraph)
{
$prev_date_line eq ''
or print "\n";
print $date_line;
@coauthors
and print join ("\n", @coauthors), "\n";
}
$prev_date_line = $date_line;
@prev_coauthors = @coauthors;
$prev_multi_paragraph = $multi_paragraph;
# If there were any lines
if (@line == 0)
{
warn "$ME: warning: empty commit message:\n $date_line\n";
}
else
{
if ($append_dot)
{
# If the first line of the message has enough room, then
if (length $line[0] < 72)
{
# append a dot if there is no other punctuation or blank
# at the end.
$line[0] =~ /[[:punct:]\s]$/
or $line[0] .= '.';
}
}
# Remove one additional leading TAB from each line.
$strip_tab
and map { s/^\t// } @line;
# Prefix each non-empty line with a TAB.
@line = map { length $_ ? "\t$_" : '' } @line;
print "\n", join ("\n", @line), "\n";
}
defined ($in = <PIPE>)
or last;
$in ne "\n"
and die "$ME:$.: unexpected line:\n$in";
}
close PIPE
or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
# FIXME-someday: include $PROCESS_STATUS in the diagnostic
# Complain about any unused entry in the --amend=F specified file.
my $fail = 0;
foreach my $sha (keys %$amend_code)
{
warn "$ME:$amend_file: unused entry: $sha\n";
$fail = 1;
}
exit $fail;
}
# Local Variables:
# mode: perl
# indent-tabs-mode: nil
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "my $VERSION = '"
# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "'; # UTC"
# End:
-92
View File
@@ -1,92 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 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/>.
;;;
;;; This file defines an operating system configuration for the demo virtual
;;; machine images that we build.
;;;
(use-modules (gnu)
(gnu packages xorg)
(gnu packages avahi)
(gnu packages linux)
(gnu packages tor)
(gnu services networking)
(gnu services avahi)
(gnu services dbus)
(gnu services xorg))
(operating-system
(host-name "gnu")
(timezone "Europe/Paris")
(locale "en_US.utf8")
(bootloader (grub-configuration
(device "/dev/sda")))
(file-systems
;; We provide a dummy file system for /, but that's OK because the VM build
;; code will automatically declare the / file system for us.
(cons* (file-system
(mount-point "/")
(device "dummy")
(type "dummy"))
;; %fuse-control-file-system ; needs fuse.ko
;; %binary-format-file-system ; needs binfmt.ko
%base-file-systems))
(users (list (user-account
(name "guest")
(group "users")
(supplementary-groups '("wheel")) ; allow use of sudo
(password "")
(comment "Guest of GNU")
(home-directory "/home/guest"))))
(issue "
This is an alpha preview of the GNU system. Welcome.
This image features the GNU Guix package manager, which was used to
build it (http://www.gnu.org/software/guix/). The init system is
GNU dmd (http://www.gnu.org/software/dmd/).
You can log in as 'guest' or 'root' with no password.
")
(services (cons* (slim-service #:auto-login? #t
#:default-user "guest")
;; QEMU networking settings.
(static-networking-service "eth0" "10.0.2.10"
#:name-servers '("10.0.2.3")
#:gateway "10.0.2.2")
(avahi-service)
(dbus-service (list avahi))
(tor-service)
%base-services))
(pam-services
;; Explicitly allow for empty passwords.
(base-pam-services #:allow-empty-passwords? #t))
(packages (cons* strace
tor torsocks
xterm avahi %base-packages)))
-272
View File
@@ -1,272 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015 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/>.
;;;
;;; This file defines build jobs for the Hydra continuation integration
;;; tool.
;;;
;; Attempt to use our very own Guix modules.
(eval-when (compile load eval)
;; Ignore any available .go, and force recompilation. This is because our
;; checkout in the store has mtime set to the epoch, and thus .go files look
;; newer, even though they may not correspond.
(set! %fresh-auto-compile #t)
(and=> (assoc-ref (current-source-location) 'filename)
(lambda (file)
(let ((dir (string-append (dirname file) "/../..")))
(format (current-error-port) "prepending ~s to the load path~%"
dir)
(set! %load-path (cons dir %load-path))))))
(use-modules (guix config)
(guix store)
(guix packages)
(guix derivations)
(guix monads)
((guix licenses) #:select (gpl3+))
((guix utils) #:select (%current-system))
((guix scripts system) #:select (read-operating-system))
(gnu packages)
(gnu packages gcc)
(gnu packages base)
(gnu packages gawk)
(gnu packages guile)
(gnu packages gettext)
(gnu packages compression)
(gnu packages multiprecision)
(gnu packages make-bootstrap)
(gnu packages commencement)
(gnu packages package-management)
(gnu system)
(gnu system vm)
(gnu system install)
(srfi srfi-1)
(srfi srfi-26)
(ice-9 match))
;; XXX: Debugging hack: since `hydra-eval-guile-jobs' redirects the output
;; port to the bit bucket, let us write to the error port instead.
(setvbuf (current-error-port) _IOLBF)
(set-current-output-port (current-error-port))
(define* (package->alist store package system
#:optional (package-derivation package-derivation))
"Convert PACKAGE to an alist suitable for Hydra."
`((derivation . ,(derivation-file-name
(package-derivation store package system
#:graft? #f)))
(description . ,(package-synopsis package))
(long-description . ,(package-description package))
(license . ,(package-license package))
(home-page . ,(package-home-page package))
(maintainers . ("bug-guix@gnu.org"))
;; Work around versions of 'hydra-eval-guile-jobs' before Hydra commit
;; 61448ca (27 Feb. 2014) which used a default timeout of 2h.
(timeout . 72000)))
(define (package-job store job-name package system)
"Return a job called JOB-NAME that builds PACKAGE on SYSTEM."
(let ((job-name (symbol-append job-name (string->symbol ".")
(string->symbol system))))
`(,job-name . ,(cut package->alist store package system))))
(define (package-cross-job store job-name package target system)
"Return a job called TARGET.JOB-NAME that cross-builds PACKAGE for TARGET on
SYSTEM."
`(,(symbol-append (string->symbol target) (string->symbol ".") job-name
(string->symbol ".") (string->symbol system)) .
,(cute package->alist store package system
(lambda* (store package system #:key graft?)
(package-cross-derivation store package target system
#:graft? graft?)))))
(define %core-packages
;; Note: Don't put the '-final' package variants because (1) that's
;; implicit, and (2) they cannot be cross-built (due to the explicit input
;; chain.)
(list gcc-4.8 gcc-4.7 glibc binutils
gmp mpfr mpc coreutils findutils diffutils patch sed grep
gawk gnu-gettext hello guile-2.0 zlib gzip xz
%bootstrap-binaries-tarball
%binutils-bootstrap-tarball
%glibc-bootstrap-tarball
%gcc-bootstrap-tarball
%guile-bootstrap-tarball
%bootstrap-tarballs))
(define %packages-to-cross-build
%core-packages)
(define %cross-targets
'("mips64el-linux-gnu"
"mips64el-linux-gnuabi64"))
(define (demo-os)
"Return the \"demo\" 'operating-system' structure."
(let* ((dir (dirname (assoc-ref (current-source-location) 'filename)))
(file (string-append dir "/demo-os.scm")))
(read-operating-system file)))
(define (qemu-jobs store system)
"Return a list of jobs that build QEMU images for SYSTEM."
(define (->alist drv)
`((derivation . ,(derivation-file-name drv))
(description . "Stand-alone QEMU image of the GNU system")
(long-description . "This is a demo stand-alone QEMU image of the GNU
system.")
(license . ,gpl3+)
(home-page . ,%guix-home-page-url)
(maintainers . ("bug-guix@gnu.org"))))
(define (->job name drv)
(let ((name (symbol-append name (string->symbol ".")
(string->symbol system))))
`(,name . ,(cut ->alist drv))))
(define MiB
(expt 2 20))
(if (member system '("x86_64-linux" "i686-linux"))
(list (->job 'qemu-image
(run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(system-qemu-image (demo-os)
#:disk-image-size
(* 1400 MiB))))) ; 1.4 GiB
(->job 'usb-image
(run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(system-disk-image installation-os
#:disk-image-size
(* 850 MiB))))))
'()))
(define (tarball-jobs store system)
"Return Hydra jobs to build the self-contained Guix binary tarball."
(define (->alist drv)
`((derivation . ,(derivation-file-name drv))
(description . "Stand-alone binary Guix tarball")
(long-description . "This is a tarball containing binaries of Guix and
all its dependencies, and ready to be installed on non-GuixSD distributions.")
(license . ,gpl3+)
(home-page . ,%guix-home-page-url)
(maintainers . ("bug-guix@gnu.org"))))
(define (->job name drv)
(let ((name (symbol-append name (string->symbol ".")
(string->symbol system))))
`(,name . ,(cut ->alist drv))))
;; XXX: Add a job for the stable Guix?
(list (->job 'binary-tarball
(run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(self-contained-tarball))
#:system system))))
(define job-name
;; Return the name of a package's job.
(compose string->symbol package-full-name))
(define package->job
(let ((base-packages
(delete-duplicates
(append-map (match-lambda
((_ package _ ...)
(match (package-transitive-inputs package)
(((_ inputs _ ...) ...)
inputs))))
%final-inputs))))
(lambda (store package system)
"Return a job for PACKAGE on SYSTEM, or #f if this combination is not
valid."
(cond ((member package base-packages)
#f)
((supported-package? package system)
(package-job store (job-name package) package system))
(else
#f)))))
;;;
;;; Hydra entry point.
;;;
(define (hydra-jobs store arguments)
"Return Hydra jobs."
(define subset
(match (assoc-ref arguments 'subset)
("core" 'core) ; only build core packages
(_ 'all))) ; build everything
(define (cross-jobs system)
(define (from-32-to-64? target)
;; Return true if SYSTEM is 32-bit and TARGET is 64-bit.
;; This hacks prevents known-to-fail cross-builds from i686-linux to
;; mips64el-linux-gnuabi64.
(and (string-prefix? "i686-" system)
(string-suffix? "64" target)))
(define (same? target)
;; Return true if SYSTEM and TARGET are the same thing. This is so we
;; don't try to cross-compile to 'mips64el-linux-gnu' from
;; 'mips64el-linux'.
(string-contains target system))
(define (either proc1 proc2)
(lambda (x)
(or (proc1 x) (proc2 x))))
(append-map (lambda (target)
(map (lambda (package)
(package-cross-job store (job-name package)
package target system))
%packages-to-cross-build))
(remove (either from-32-to-64? same?) %cross-targets)))
;; Return one job for each package, except bootstrap packages.
(append-map (lambda (system)
(case subset
((all)
;; Build everything.
(fold-packages (lambda (package result)
(let ((job (package->job store package
system)))
(if job
(cons job result)
result)))
(append (qemu-jobs store system)
(tarball-jobs store system)
(cross-jobs system))))
((core)
;; Build core packages only.
(append (map (lambda (package)
(package-job store (job-name package)
package system))
%core-packages)
(cross-jobs system)))
(else
(error "unknown subset" subset))))
%hydra-supported-systems))
-97
View File
@@ -1,97 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 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/>.
;;;
;;; This file defines build jobs of Guix itself for the Hydra continuation
;;; integration tool.
;;;
;; Attempt to use our very own Guix modules.
(eval-when (compile load eval)
;; Ignore any available .go, and force recompilation. This is because our
;; checkout in the store has mtime set to the epoch, and thus .go files look
;; newer, even though they may not correspond.
(set! %fresh-auto-compile #t)
;; Display which files are loaded.
(set! %load-verbosely #t)
(and=> (assoc-ref (current-source-location) 'filename)
(lambda (file)
(let ((dir (string-append (dirname file) "/../..")))
(format (current-error-port) "prepending ~s to the load path~%"
dir)
(set! %load-path (cons dir %load-path))))))
(use-modules (guix store)
(guix packages)
(guix utils)
(guix derivations)
(guix build-system gnu)
(gnu packages version-control)
(gnu packages package-management)
(gnu packages graphviz)
(srfi srfi-1)
(srfi srfi-26)
(ice-9 match))
;; XXX: Debugging hack: since `hydra-eval-guile-jobs' redirects the output
;; port to the bit bucket, let us write to the error port instead.
(setvbuf (current-error-port) _IOLBF)
(set-current-output-port (current-error-port))
(define* (package->alist store package system
#:optional (package-derivation package-derivation))
"Convert PACKAGE to an alist suitable for Hydra."
`((derivation . ,(derivation-file-name
(package-derivation store package system)))
(description . ,(package-synopsis package))
(long-description . ,(package-description package))
(license . ,(package-license package))
(home-page . ,(package-home-page package))
(maintainers . ("bug-guix@gnu.org"))))
(define (tarball-package checkout)
"Return a package that does `make distcheck' from CHECKOUT, a directory
containing a Git checkout of Guix."
(dist-package guix checkout))
(define (hydra-jobs store arguments)
"Return Hydra jobs."
(define systems
(match (filter-map (match-lambda
(('system . value)
value)
(_ #f))
arguments)
((lst ..1)
lst)
(_
(list (%current-system)))))
(define guix-checkout
(assq-ref arguments 'guix))
(let ((guix (assq-ref guix-checkout 'file-name)))
(format (current-error-port) "using checkout ~s (~s)~%"
guix-checkout guix)
`((tarball . ,(cute package->alist store
(tarball-package guix)
(%current-system))))))
-450
View File
@@ -1,450 +0,0 @@
#!/bin/sh
exec guile -l "$0" \
-c '(apply (@ (list-packages) list-packages)
(cdr (command-line)))'
!#
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013 Alex Sassmannshausen <alex.sassmannshausen@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (list-packages)
#:use-module (guix utils)
#:use-module (guix packages)
#:use-module (guix licenses)
#:use-module (guix gnu-maintenance)
#:use-module ((guix download) #:select (%mirrors))
#:use-module ((guix build download) #:select (maybe-expand-mirrors))
#:use-module (gnu packages)
#:use-module (sxml simple)
#:use-module (sxml fold)
#:use-module (web uri)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:export (list-packages))
;;; Commentary:
;;;
;;; Emit an HTML representation of the packages available in GNU Guix.
;;;
;;; Code:
(define lookup-gnu-package
(let ((gnu (official-gnu-packages)))
(lambda (name)
"Return the package description for GNU package NAME, or #f."
(find (lambda (package)
(equal? (gnu-package-name package) name))
gnu))))
(define (list-join lst item)
"Join the items in LST by inserting ITEM between each pair of elements."
(let loop ((lst lst)
(result '()))
(match lst
(()
(match (reverse result)
(()
'())
((_ rest ...)
rest)))
((head tail ...)
(loop tail
(cons* head item result))))))
(define (package->sxml package previous description-ids remaining)
"Return 3 values: the HTML-as-SXML for PACKAGE added to all previously
collected package output in PREVIOUS, a list of DESCRIPTION-IDS and the number
of packages still to be processed in REMAINING. Also Introduces a call to the
JavaScript prep_pkg_descs function as part of the output of PACKAGE, every
time the length of DESCRIPTION-IDS, increasing, is 15 or when REMAINING,
decreasing, is 1."
(define (location-url loc)
(string-append "http://git.savannah.gnu.org/cgit/guix.git/tree/"
(location-file loc) "#n"
(number->string (location-line loc))))
(define (source-url package)
(let ((loc (package-location package)))
(and loc (location-url loc))))
(define (license package)
(define ->sxml
(match-lambda
((lst ...)
`(div ,(map ->sxml lst)))
((? license? license)
(let ((uri (license-uri license)))
(case (and=> (and uri (string->uri uri)) uri-scheme)
((http https)
`(div (a (@ (href ,uri)
(title "Link to the full license"))
,(license-name license))))
(else
`(div ,(license-name license) " ("
,(license-comment license) ")")))))
(#f "")))
(->sxml (package-license package)))
(define (patches package)
(define patch-url
(match-lambda
((? string? patch)
(string-append
"http://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/patches/"
(basename patch)))
((? origin? patch)
(uri->string
(first (maybe-expand-mirrors (string->uri
(match (origin-uri patch)
((? string? uri) uri)
((head . tail) head)))
%mirrors))))))
(define patch-name
(match-lambda
((? string? patch)
(basename patch))
((? origin? patch)
(match (origin-uri patch)
((? string? uri) (basename uri))
((head . tail) (basename head))))))
(define (snippet-link snippet)
(let ((loc (or (package-field-location package 'source)
(package-location package))))
`(a (@ (href ,(location-url loc))
(title "Link to patch snippet"))
"snippet")))
(and (origin? (package-source package))
(let ((patches (origin-patches (package-source package)))
(snippet (origin-snippet (package-source package))))
(and (or (pair? patches) snippet)
`(div "patches: "
,(let loop ((patches patches)
(number 1)
(links '()))
(match patches
(()
(let* ((additional (and snippet
(snippet-link snippet)))
(links (if additional
(cons additional links)
links)))
(list-join (reverse links) ", ")))
((patch rest ...)
(loop rest
(+ 1 number)
(cons `(a (@ (href ,(patch-url patch))
(title ,(string-append
"Link to "
(patch-name patch))))
,(number->string number))
links))))))))))
(define (status package)
(define (url system)
`(a (@ (href ,(string-append "http://hydra.gnu.org/job/gnu/master/"
(package-full-name package) "."
system))
(title "View the status of this architecture's build at Hydra"))
,system))
`(div "status: "
,(list-join (map url
(lset-intersection
string=?
%hydra-supported-systems
(package-transitive-supported-systems package)))
" ")))
(define (package-logo name)
(and=> (lookup-gnu-package name)
gnu-package-logo))
(define (insert-tr description-id js?)
(define (insert-js-call description-ids)
"Return an sxml call to prep_pkg_descs, with up to 15 elements of
description-ids as formal parameters."
`(script (@ (type "text/javascript"))
,(format #f "prep_pkg_descs(~a)"
(string-append "'"
(string-join description-ids "', '")
"'"))))
(let ((description-ids (cons description-id description-ids)))
`(tr (td ,(if (gnu-package? package)
`(img (@ (src "/graphics/gnu-head-mini.png")
(alt "Part of GNU")
(title "Part of GNU")))
""))
(td (a (@ (href ,(source-url package))
(title "Link to the Guix package source code"))
,(package-name package) " "
,(package-version package)))
(td (span ,(package-synopsis package))
(div (@ (id ,description-id))
,(match (package-logo (package-name package))
((? string? url)
`(img (@ (src ,url)
(height "35")
(class "package-logo")
(alt ("Logo of " ,(package-name package))))))
(_ #f))
(p ,(package-description package))
,(license package)
(a (@ (href ,(package-home-page package))
(title "Link to the package's website"))
,(package-home-page package))
,(status package)
,(patches package)
,(if js?
(insert-js-call description-ids)
""))))))
(let ((description-id (symbol->string
(gensym (package-name package)))))
(cond ((= remaining 1) ; Last package in packages
(values
(reverse ; Fold has reversed packages
(cons (insert-tr description-id 'js) ; Prefix final sxml
previous))
'() ; No more work to do
0)) ; End of the line
((= (length description-ids) 15) ; Time for a JS call
(values
(cons (insert-tr description-id 'js)
previous) ; Prefix new sxml
'() ; Reset description-ids
(1- remaining))) ; Reduce remaining
(else ; Insert another row, and build description-ids
(values
(cons (insert-tr description-id #f)
previous) ; Prefix new sxml
(cons description-id description-ids) ; Update description-ids
(1- remaining)))))) ; Reduce remaining
(define (packages->sxml packages)
"Return an HTML page as SXML describing PACKAGES."
`(div
(h2 "GNU Guix Package List")
(div (@ (id "intro"))
(div
(img (@ (src "graphics/GuixSD-V.png")
(alt "Guix System Distribution")
(height "83"))))
(p "This web page lists the packages currently provided by the "
(a (@ (href "manual/guix.html#GNU-Distribution"))
"Guix System Distribution")
". "
"Our " (a (@ (href "http://hydra.gnu.org/jobset/gnu/master"))
"continuous integration system")
" shows their current build status."))
(table (@ (id "packages"))
(tr (th "GNU?")
(th "Package version")
(th "Package details"))
,@(fold-values package->sxml packages '() '() (length packages)))
(a (@ (href "#intro")
(title "Back to top.")
(id "top"))
"^")))
(define (insert-css)
"Return the CSS for the list-packages page."
(format #t
"<style>
/* license: CC0 */
a {
transition: all 0.3s;
}
div#intro {
margin-bottom: 2em;
}
div#intro div, div#intro p {
padding:0.5em;
}
div#intro div {
float:left;
}
div#intro img {
float:left;
padding:0.75em;
}
table#packages, table#packages tr, table#packages tbody, table#packages td, table#packages th {
border: 0px solid black;
clear: both;
}
table#packages tr:nth-child(even) {
background-color: #FFF;
}
table#packages tr:nth-child(odd) {
background-color: #EEE;
}
table#packages tr:hover, table#packages tr:focus, table#packages tr:active {
background-color: #DDD;
}
table#packages tr:first-child, table#packages tr:first-child:hover, table#packages tr:first-child:focus, table#packages tr:first-child:active {
background-color: #333;
color: #fff;
}
table#packages td {
margin:0px;
padding:0.2em 0.5em;
}
table#packages td:first-child {
width:10%;
text-align:center;
}
table#packages td:nth-child(2) {
width:30%;
}
table#packages td:last-child {
width:60%;
}
img.package-logo {
float: left;
padding: 0.75em;
}
table#packages span {
font-weight: 700;
}
table#packages span a {
float: right;
font-weight: 500;
}
a#top {
position:fixed;
right:10px;
bottom:10px;
font-size:150%;
background-color:#EEE;
padding:10px 7.5px 0 7.5px;
text-decoration:none;
color:#000;
border-radius:5px;
}
a#top:hover, a#top:focus {
background-color:#333;
color:#fff;
}
</style>"))
(define (insert-js)
"Return the JavaScript for the list-packages page."
(format #t
"<script type=\"text/javascript\">
// license: CC0
function show_hide(idThing)
{
if(document.getElementById && document.createTextNode) {
var thing = document.getElementById(idThing);
/* Used to change the link text, depending on whether description is
collapsed or expanded */
var thingLink = thing.previousSibling.lastChild.firstChild;
if (thing) {
if (thing.style.display == \"none\") {
thing.style.display = \"\";
thingLink.data = 'Collapse';
} else {
thing.style.display = \"none\";
thingLink.data = 'Expand';
}
}
}
}
/* Add controllers used for collapse/expansion of package descriptions */
function prep(idThing)
{
var tdThing = document.getElementById(idThing).parentNode;
if (tdThing) {
var aThing = tdThing.firstChild.appendChild(document.createElement('a'));
aThing.setAttribute('href', 'javascript:void(0)');
aThing.setAttribute('title', 'show/hide package description');
aThing.appendChild(document.createTextNode('Expand'));
aThing.onclick=function(){show_hide(idThing);};
/* aThing.onkeypress=function(){show_hide(idThing);}; */
}
}
/* Take n element IDs, prepare them for javascript enhanced
display and hide the IDs by default. */
function prep_pkg_descs()
{
if(document.getElementById && document.createTextNode) {
for(var i=0; i<arguments.length; i++) {
prep(arguments[i])
show_hide(arguments[i]);
}
}
}
</script>"))
(define (list-packages . args)
"Return an HTML page listing all the packages found in the GNU distribution,
with gnu.org server-side include and all that."
;; Don't attempt to translate descriptions.
(setlocale LC_ALL "C")
;; Output the page as UTF-8 since that's what the gnu.org server-side
;; headers claim.
(set-port-encoding! (current-output-port) "UTF-8")
(let ((packages (sort (fold-packages cons '())
(lambda (p1 p2)
(string<? (package-name p1) (package-name p2))))))
(format #t "<!--#include virtual=\"/server/html5-header.html\" -->
<!-- Parent-Version: 1.70 $ -->
<title>GNU Guix - GNU Distribution - GNU Project</title>
")
(insert-css)
(insert-js)
(format #t "<!--#include virtual=\"/server/banner.html\" -->")
(sxml->xml (packages->sxml packages))
(format #t "</div>
<!--#include virtual=\"/server/footer.html\" -->
<div id=\"footer\">
<p>Please send general FSF &amp; GNU inquiries to
<a href=\"mailto:gnu@gnu.org\">&lt;gnu@gnu.org&gt;</a>.
There are also <a href=\"/contact/\">other ways to contact</a>
the FSF. Broken links and other corrections or suggestions can be sent
to <a href=\"mailto:bug-guix@gnu.org\">&lt;bug-guix@gnu.org&gt;</a>.</p>
<p>Copyright &copy; 2013 Free Software Foundation, Inc.</p>
<p>This page is licensed under a <a rel=\"license\"
href=\"http://creativecommons.org/licenses/by-nd/3.0/us/\">Creative
Commons Attribution-NoDerivs 3.0 United States License</a>.</p>
<p>Updated:
<!-- timestamp start -->
$Date$
<!-- timestamp end -->
</p>
</div>
</div>
</body>
</html>
"))
)
;;; list-packages.scm ends here
-50
View File
@@ -1,50 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 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/>.
;;;
;;; Build a self-contained tarball containing binaries for Guix and its
;;; dependencies.
;;;
(use-modules (guix)
(guix ui)
(gnu system install)
(ice-9 match))
(define show-what-to-build*
(store-lift show-what-to-build))
(define copy-file*
(lift2 copy-file %store-monad))
(define rename-file*
(lift2 rename-file %store-monad))
(match (command-line)
((_ system file)
(with-store store
(run-with-store store
(mlet %store-monad ((tarball (self-contained-tarball)))
(mbegin %store-monad
(show-what-to-build* (list tarball))
(built-derivations (list tarball))
(copy-file* (derivation->output-path tarball)
(string-append file ".part"))
(rename-file* (string-append file ".part") file)))
#:system system))))
+62
View File
@@ -0,0 +1,62 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
hOlob5tziejTU0hW0XIRXlXKukgc+7F4b/bIGgI=
=Y7wf
-----END PGP PUBLIC KEY BLOCK-----
+3843
View File
File diff suppressed because it is too large Load Diff
+1497
View File
File diff suppressed because it is too large Load Diff
+50
View File
@@ -0,0 +1,50 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
YF3ov6wO
=3+Zu
-----END PGP PUBLIC KEY BLOCK-----
-147
View File
@@ -1,147 +0,0 @@
dnl -*- Autoconf -*- fragment for the C++ daemon.
AC_MSG_CHECKING([whether to build daemon])
AC_MSG_RESULT([$guix_build_daemon])
dnl C++ environment. This macro must be used unconditionnaly.
AC_PROG_CXX
if test "x$guix_build_daemon" = "xyes"; then
AC_PROG_RANLIB
AC_CONFIG_HEADER([nix/config.h])
dnl Decompressors, for use by the substituter.
AC_PATH_PROG([GZIP], [gzip])
AC_PATH_PROG([BZIP2], [bzip2])
AC_PATH_PROG([XZ], [xz])
AC_SUBST([GZIP])
AC_SUBST([BZIP2])
AC_SUBST([XZ])
dnl Use 64-bit file system calls so that we can support files > 2 GiB.
AC_SYS_LARGEFILE
dnl Look for libbz2, a required dependency.
AC_CHECK_LIB([bz2], [BZ2_bzWriteOpen], [true],
[AC_MSG_ERROR([Guix requires libbz2, which is part of bzip2. See http://www.bzip.org/.])])
AC_CHECK_HEADERS([bzlib.h], [true],
[AC_MSG_ERROR([Guix requires libbz2, which is part of bzip2. See http://www.bzip.org/.])])
dnl Look for SQLite, a required dependency.
PKG_CHECK_MODULES([SQLITE3], [sqlite3 >= 3.6.19])
AC_DEFINE([NIX_VERSION], ["0.0.0"], [Fake Nix version number.])
AC_DEFINE_UNQUOTED([SYSTEM], ["$guix_system"],
[Guix host system type--i.e., platform and OS kernel tuple.])
case "$LIBGCRYPT_PREFIX" in
no)
LIBGCRYPT_CFLAGS=""
;;
*)
LIBGCRYPT_CFLAGS="-I$LIBGCRYPT_PREFIX/include"
;;
esac
case "$LIBGCRYPT_LIBDIR" in
no)
LIBGCRYPT_LIBS="-lgcrypt"
;;
*)
LIBGCRYPT_LIBS="-L$LIBGCRYPT_LIBDIR -lgcrypt"
;;
esac
AC_SUBST([LIBGCRYPT_CFLAGS])
AC_SUBST([LIBGCRYPT_LIBS])
save_CFLAGS="$CFLAGS"
save_LDFLAGS="$LDFLAGS"
CFLAGS="$CFLAGS $LIBGCRYPT_CFLAGS"
LDFLAGS="$LDFLAGS $LIBGCRYPT_LDFLAGS"
have_gcrypt=yes
AC_CHECK_LIB([gcrypt], [gcry_md_open], [:], [have_gcrypt=no])
AC_CHECK_HEADER([gcrypt.h], [:], [have_gcrypt=no])
if test "x$have_gcrypt" != "xyes"; then
AC_MSG_ERROR([GNU libgcrypt not found; please install it.])
fi
CFLAGS="$save_CFLAGS"
LDFLAGS="$save_LDFLAGS"
dnl Chroot support.
AC_CHECK_FUNCS([chroot unshare])
AC_CHECK_HEADERS([sched.h sys/param.h sys/mount.h tr1/unordered_set])
if test "x$ac_cv_func_chroot" != "xyes"; then
AC_MSG_ERROR(['chroot' function missing, bailing out])
fi
dnl lutimes and lchown: used when canonicalizing store items.
dnl posix_fallocate: used when extracting archives.
dnl vfork: to speed up spawning of helper programs.
dnl `--> now disabled because of unpredictable behavior:
dnl see <http://lists.gnu.org/archive/html/guix-devel/2014-05/msg00036.html>
dnl and Nix commit f794465c (Nov. 2012).
dnl sched_setaffinity: to improve RPC locality.
dnl statvfs: to detect disk-full conditions.
dnl strsignal: for error reporting.
AC_CHECK_FUNCS([lutimes lchown posix_fallocate sched_setaffinity \
statvfs nanosleep strsignal])
dnl Check whether the store optimiser can optimise symlinks.
AC_MSG_CHECKING([whether it is possible to create a link to a symlink])
ln -s bla tmp_link
if ln tmp_link tmp_link2 2> /dev/null; then
AC_MSG_RESULT(yes)
AC_DEFINE(CAN_LINK_SYMLINK, 1, [Whether link() works on symlinks.])
else
AC_MSG_RESULT(no)
fi
rm -f tmp_link tmp_link2
dnl Check for <locale>.
AC_LANG_PUSH(C++)
AC_CHECK_HEADERS([locale])
AC_LANG_POP(C++)
dnl Check whether we have the `personality' syscall, which allows us
dnl to do i686-linux builds on x86_64-linux machines.
AC_CHECK_HEADERS([sys/personality.h])
dnl Check for <linux/fs.h> (for immutable file support).
AC_CHECK_HEADERS([linux/fs.h])
dnl Check whether the 'offload' build hook can be built (uses
dnl 'restore-file-set', which requires unbuffered custom binary input
dnl ports from Guile >= 2.0.10.)
GUIX_CHECK_UNBUFFERED_CBIP
guix_build_daemon_offload="$ac_cv_guix_cbips_support_setvbuf"
if test "x$guix_build_daemon_offload" = "xyes"; then
AC_DEFINE([HAVE_DAEMON_OFFLOAD_HOOK], [1],
[Define if the daemon's 'offload' build hook is being built.])
fi
dnl Temporary directory used to store the daemon's data.
GUIX_TEST_ROOT_DIRECTORY
GUIX_TEST_ROOT="$ac_cv_guix_test_root"
AC_SUBST([GUIX_TEST_ROOT])
AC_CONFIG_FILES([nix/scripts/list-runtime-roots],
[chmod +x nix/scripts/list-runtime-roots])
AC_CONFIG_FILES([nix/scripts/substitute],
[chmod +x nix/scripts/substitute])
AC_CONFIG_FILES([nix/scripts/guix-authenticate],
[chmod +x nix/scripts/guix-authenticate])
AC_CONFIG_FILES([nix/scripts/offload],
[chmod +x nix/scripts/offload])
fi
AM_CONDITIONAL([BUILD_DAEMON], [test "x$guix_build_daemon" = "xyes"])
AM_CONDITIONAL([BUILD_DAEMON_OFFLOAD], \
[test "x$guix_build_daemon" = "xyes" \
&& test "x$guix_build_daemon_offload" = "xyes"])
-204
View File
@@ -1,204 +0,0 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.68)
AC_INIT([GNU Guix], [0.8.2], [bug-guix@gnu.org], [guix],
[http://www.gnu.org/software/guix/])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects \
color-tests parallel-tests -Woverride -Wno-portability])
# Enable silent rules by default.
AM_SILENT_RULES([yes])
AC_CONFIG_SRCDIR([guix.scm])
AC_CONFIG_MACRO_DIR([m4])
dnl For the C++ code. This must be used early.
AC_USE_SYSTEM_EXTENSIONS
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.18.1])
guilemoduledir="${datarootdir}/guile/site/2.0"
AC_SUBST([guilemoduledir])
GUIX_SYSTEM_TYPE
GUIX_ASSERT_SUPPORTED_SYSTEM
AC_ARG_WITH(store-dir,
AC_HELP_STRING([--with-store-dir=PATH],
[file name of the store (defaults to /gnu/store)]),
[storedir="$withval"],
[storedir="/gnu/store"])
AC_SUBST(storedir)
AC_ARG_WITH([bash-completion-dir],
AC_HELP_STRING([--with-bash-completion-dir=DIR],
[name of the Bash completion directory]),
[bashcompletiondir="$withval"],
[bashcompletiondir='${sysconfdir}/bash_completion.d'])
AC_SUBST([bashcompletiondir])
dnl Better be verbose.
AC_MSG_CHECKING([for the store directory])
AC_MSG_RESULT([$storedir])
AC_ARG_ENABLE([daemon],
[AS_HELP_STRING([--disable-daemon], [build the Nix daemon (C++)])],
[guix_build_daemon="$enableval"],
[guix_build_daemon="yes"])
# Prepare a version of $localstatedir & co. that does not contain references
# to shell variables.
guix_prefix="`eval echo $prefix | sed -e"s|NONE|/usr/local|g"`"
guix_localstatedir="`eval echo $localstatedir | sed -e "s|NONE|$guix_prefix|g"`"
guix_sysconfdir="`eval echo $sysconfdir | sed -e "s|NONE|$guix_prefix|g"`"
guix_sbindir="`eval echo $sbindir | sed -e "s|NONE|$guix_prefix|g"`"
AC_SUBST([guix_localstatedir])
AC_SUBST([guix_sysconfdir])
AC_SUBST([guix_sbindir])
GUIX_CHECK_FILE_NAME_LIMITS
dnl We require pkg.m4 (from pkg-config) and guile.m4 (from Guile.)
dnl Make sure they are available.
m4_pattern_forbid([PKG_CHECK_MODULES])
m4_pattern_forbid([GUILE_MODULE_AVAILABLE])
PKG_CHECK_MODULES([GUILE], [guile-2.0 >= 2.0.7])
AC_PATH_PROG([GUILE], [guile])
AC_PATH_PROG([GUILD], [guild])
if test "x$GUILD" = "x"; then
AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.])
fi
dnl guile-json is used for the PyPI package importer
GUILE_MODULE_AVAILABLE([have_guile_json], [(json)])
AM_CONDITIONAL([HAVE_GUILE_JSON], [test "x$have_guile_json" = "xyes"])
dnl Make sure we have a full-fledged Guile.
GUIX_ASSERT_GUILE_FEATURES([regex posix socket net-db threads])
dnl Check whether (srfi srfi-37) works, and provide our own if it doesn't.
GUIX_CHECK_SRFI_37
AM_CONDITIONAL([INSTALL_SRFI_37], [test "x$ac_cv_guix_srfi_37_broken" = xyes])
AC_ARG_WITH([nix-prefix],
[AS_HELP_STRING([--with-nix-prefix=DIR],
[search for Nix in DIR (for testing purposes and '--disable-daemon' builds)])],
[case "$withval" in
yes|no) ;;
*)
NIX_PREFIX="$withval"
PATH="$NIX_PREFIX/bin:$PATH"; export PATH
AC_SUBST([NIX_PREFIX])
;;
esac],
[])
AC_PATH_PROG([NIX_INSTANTIATE], [nix-instantiate])
AC_PATH_PROG([NIX_HASH], [nix-hash])
if test "x$guix_build_daemon$NIX_INSTANTIATE$NIX_HASH" = "xno"; then
AC_MSG_ERROR([Nix programs not found; please install Nix or use `--with-nix-prefix'.])
fi
if test "x$NIX_INSTANTIATE" = "x"; then
# This program is an optional dependency, so we just want it to be
# taken from $PATH if it's not available right now.
NIX_INSTANTIATE="nix-instantiate"
fi
AC_ARG_WITH([nixpkgs],
[AS_HELP_STRING([--with-nixpkgs=DIR],
[search for Nixpkgs in DIR (for testing purposes only)])],
[case "$withval" in
yes|no) AC_MSG_ERROR([Please use `--with-nixpkgs=DIR'.]);;
*) NIXPKGS="$withval";;
esac],
[])
AC_MSG_CHECKING([for Nixpkgs source tree])
if test -f "$NIXPKGS/default.nix"; then
AC_MSG_RESULT([$NIXPKGS])
AC_SUBST([NIXPKGS])
else
AC_MSG_RESULT([not found])
fi
AC_ARG_WITH([libgcrypt-prefix],
[AS_HELP_STRING([--with-libgcrypt-prefix=DIR], [search for GNU libgcrypt in DIR])],
[case "$withval" in
yes|no)
LIBGCRYPT="libgcrypt"
LIBGCRYPT_PREFIX="no"
LIBGCRYPT_LIBDIR="no"
;;
*)
LIBGCRYPT="$withval/lib/libgcrypt"
LIBGCRYPT_PREFIX="$withval"
LIBGCRYPT_LIBDIR="$withval/lib"
;;
esac],
[LIBGCRYPT="libgcrypt"
LIBGCRYPT_PREFIX="no"
LIBGCRYPT_LIBDIR="no"])
AC_ARG_WITH([libgcrypt-libdir],
[AS_HELP_STRING([--with-libgcrypt-libdir=DIR],
[search for GNU libgcrypt's shared library in DIR])],
[case "$withval" in
yes|no)
LIBGCRYPT="libgcrypt"
LIBGCRYPT_LIBDIR="no"
;;
*)
LIBGCRYPT="$withval/libgcrypt"
LIBGCRYPT_LIBDIR="$withval"
;;
esac],
[if test "x$LIBGCRYPT" = x; then
LIBGCRYPT="libgcrypt"
fi
if test "x$LIBGCRYPT_LIBDIR" = x; then
LIBGCRYPT_LIBDIR="no"
fi])
dnl Library name suitable for `dynamic-link'.
AC_MSG_CHECKING([for libgcrypt shared library name])
AC_MSG_RESULT([$LIBGCRYPT])
AC_SUBST([LIBGCRYPT])
AC_SUBST([LIBGCRYPT_PREFIX])
AC_SUBST([LIBGCRYPT_LIBDIR])
GUIX_ASSERT_LIBGCRYPT_USABLE
AC_CACHE_SAVE
m4_include([config-daemon.ac])
dnl `dot' (from the Graphviz package) is only needed for maintainers.
dnl See `HACKING' for more info.
AM_MISSING_PROG([DOT], [dot])
AC_CONFIG_FILES([Makefile
po/guix/Makefile.in
po/packages/Makefile.in
guix/config.scm])
AC_CONFIG_FILES([scripts/guix], [chmod +x scripts/guix])
AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env])
AC_CONFIG_FILES([test-env], [chmod +x test-env])
dnl Emacs interface.
AM_PATH_LISPDIR
AM_CONDITIONAL([HAVE_EMACS], [test "x$EMACS" != "xno"])
emacsuidir="${guilemoduledir}/guix/emacs"
AC_SUBST([emacsuidir])
AC_CONFIG_FILES([emacs/guix-init.el
emacs/guix-profiles.el
emacs/guix-helper.scm])
AC_OUTPUT
+18
View File
@@ -0,0 +1,18 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZ0yjARYJKwYBBAHaRw8BAQdASb8faq1fGlD3J0HchEAWmPqxndmew1tN+Ajr
bSU0Q77NKENheWV0YW5vIFNhbnRvcyA8Y3NhbnRvc2JAaW52ZW50YXRpLm9yZz7C
mAQTFgoAQQIbAwUJBaOagAULCQgHAwUVCgkICwUWAgMBAAIeBQIXgBYhBMy4GEL5
1wWOzWc3er9c3032v2aCBQJnTLA+AhkBAAoJEL9c3032v2aCVAEA+L3wQPom76o/
jlydTly+r0X5WLWHoeRdUMMGx02PGrAA/2FwlT662UR4nZOZEpdhHTX0ZGmECjZH
p1uczk+/LmIGzTBDYXlldGFubyBTYW50b3MgKENOUlMpIDxjYXlldGFuby5zYW50
b3NAY25ycy5mcj7ClgQTFgoAPhYhBMy4GEL51wWOzWc3er9c3032v2aCBQJnTKNQ
AhsDBQkFo5qABQsJCAcDBRUKCQgLBRYCAwEAAh4FAheAAAoJEL9c3032v2aCrjsA
/0pNCd77Sp7GplttQch/moMqrbFs4+tMzpH1ngdQuD5kAPwO+/fyfFikd2B9EsIB
kGRLXDma5yWva/Fo5XTwDh3pC844BGdMowESCisGAQQBl1UBBQEBB0DPAWdwxi64
FdJfNmqisLmZRuoPABUOP5Y+OeNpK68SDgMBCAfCfgQYFgoAJhYhBMy4GEL51wWO
zWc3er9c3032v2aCBQJnTKMBAhsMBQkFo5qAAAoJEL9c3032v2aCMQUBAMMuMNqW
9097k+E3t2YRjzCUGkC2C9K/YEfkyDKEC+LXAQCfUXE40rKiGht30uThgc8S26NU
RgxOMjDlmYbHyOaCAw==
=1inp
-----END PGP PUBLIC KEY BLOCK-----
+87
View File
@@ -0,0 +1,87 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
zFSe3XJZdVySGA/VQBO4ghC+7ZCXT/BlpjZ/lw74SVik/DMADD4H60HlBLWC15SO
EE1IYCA5QGbP3KE9+zp4jf5XoAHiRLwepiFoJb6x2BqmbWV5ShAvtT/nZ4R1YDoy
9432Unb9lSDWk0pVaIG/ZGKIt3Liql5ZDyoAb1TEx3xeK8yXaYeMtoREGFIuBsvN
8W5CYtmvd1FmuQQmNJbKRMjWWoH8mNmsf+UlOMgTcBb1O0WgdiJmj6M45mm8eU1c
4L/c0S26Tu+BOgkIUSOfAFViUG/8RciYH2kCd2QH7gg9h94UH7bBc5AqEZiTf1OA
XI7VkWtMdjDVxU5sj8bDUqSGP8nFAuNJLt5Zv0ub+1BLJpmOMCwDZornVumVsssq
QKJ/3yE/xcboNoVYlCIxPIK2uI3FIOhGdM9eNlCo9mGnqlKjXyY0G1T1hKx4Jqao
s9SQOSPJHRse2lN9gX7mBWa9/uXilztenEGTAe8ZyimW1VhTNqZLZCpbP4TLJPx1
dnsDrAPr6afSMaS2uCl7zLq3KT3132PfCn9u3rQyQ2hyaXN0b3BoZXIgTGVtbWVy
IFdlYmJlciA8Y3dlYmJlckBkdXN0eWNsb3VkLm9yZz6JAk4EEwEIADgWIQRRCoYo
4qd2eI+McJxLwCWSX/j00wUCWiXx2QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIX
gAAKCRBLwCWSX/j008nJD/4rWJrf6jEd2OXAIvDlGere1lVS+bXWIyBNPaKCu8rF
tlnJ83Tik3ejguPPQD6bFnmY/sZiuUoKKR+KQD2Q3mmB1lT8pmvFca3jpM69aeFv
/66JNs14h9JWgikwJSJansnAQjIhgAvfXPQpdrLs2YMSuEtDjWe/uTZtU3Czvmv7
QialMH55RCy94jO5xxYaVdMoVX43mf3oMMXyyOfc5BrYN4JDroW2g53Fq6d04Bf0
Ce0De2ltaCEOVYbGyiNlfTrmkCIySkuCFsSCQeU6od1HjVr/IvkaBYuh4kBiki6v
21BXNOpQ6ymD/4JT5iPGh6Omi0bJkLrWykPAICyDjpOZ56ZNxnD2gDN86ylzmNDE
/64E33jNtf0cCUg0I8z8XdLZwj75FkdnfBEQ+Mj6y+U2tb+pdQkxdCqP+HpQ+rUP
BoynrO1i0/Cxpejk4L0y39kKM/ROYWhCnqiMzzif6xyfbnmsyVjqW/rrK2o7uqZa
fk7yrvRhi89WuV3y/i2KZONsp21bCl0ivMS0wYeHK4pNNJSovseidL1S5m8HHw+g
ELPSGuqREyxTi+AjnUyAx51fygRtOf3x1OsrSED5dQZie4qyZ5eJfRxo4cx17bVA
Hs/HbIJcWrSYCM0yQ5LPk3mRzuHHIPgt5/3OlF8s1hH9ao2veHkO3XstMKd45NqD
h7kCDQRRL/HPARAA3QJXDGWWHdGT4eL6bU81IkbnkuxP4kBNklto5xKNpDvhv5CG
s/1TzcOKfNdr49SUXYK0HfexfEzW7soIf0E8RqGhs3vPj0Qjn37lbdPMAnZkLTIB
s+M3JSZUPJcIl3kMpgu5SK5X5w8UY/vSwhGWqoLV0Jx1jtPCuUkvbn8YkSOS73bu
GORR2B9HV+PlRJE3hffuDVe84/T3DGTrR+ZAPxjrCDr3LOZ9rK9o1TzHN/xf/VO5
egYctXcQuRfGsED7ifE50w6Kn/5zYj6uqYcPRObRfbao1Itmy259OEWSW7iXnKGr
lA0lPWY3U5gAW40CoP0tvducE5iUK23WvsWms4nfzaOWSII62y8X4axvz4cVPkaJ
j+LVmR40r3vscH5IGMYrAwGKxIATQfrSbnqii7LJxeQfsp1ea9tbVbxp6hAsBzuU
I69EttHesrydAuYpiaCSavl90MhpSvbgg8CXK6ZM2aaXnRWXngkNLUkHdRBzV5CO
v9z46wzffJTG+sjWSUv7nYDxio6o+SmzhICr49j9glyTs7zp1fCnLtzApm9Cm4ZN
nK4HA/WoZhP2RJj11u4ehYV+dc43+UYX6Dk7kjeLzK4tWylXa+nsXKuLLP6V7NrN
LcYxeJ3Hi36OjcIbv0ZyDwaLMe+0fL/Cr68VsO1zN7d6okYg6bELmQMNh7cAEQEA
AYkCHwQYAQIACQUCUS/xzwIbDAAKCRBLwCWSX/j002GAEAC/+qV0fRL3UimD+5AK
RJgBwTCLKU46LxvIh//Pf20n8O6TaHbloaUPCN1Eel4114UQgwOMNPTfmE4vdreg
ZgQgMqHXCOjMhHNPwVseuB7wV+XMTmIwN+woBapLQm+i5gMdfpA7G6cAoBVAcjad
Na2qshdtATsrzDFByN9jKbyjW/EhrCbmaoKMzN7HaWs6/kGNWlrp6vrZ7Hhm6trP
u+aD++vopHXm7JhVR5ViQjYopin3Z/oyRW43gDl6rapqETu1sbhawdijDjv3ncWA
caj04RRzvAxSAHltlrmufXW+1kqndIT96kLUTP/dQZgfg2Qk/gZDVOWvWksT3tdd
zM1HhM7P4PvIXC2eudSeqa+w5zuDTktG861uNJaMAAJ+t7Hvij97U/5H16zag1Ee
Wkoh8Y8tSSZO2jr8ZZ6S/4Wl9yHLoEFU9qIXMzr1mo1yrGGnP+l4H1U2gG/OqgS7
/+I9qKyRJ8bCcnep6k3qYsiZSc6F3ONeldnD42GYnj2Si0pJbAqrdCXFZh2qBuKM
uBg+F4ZBhAeDDch5fjCVK31kaG9E0iXyrNNPx0vcx4lauqrBLsOGix6jZxwsTOPE
UST7LwWsSdwXI61YClCYV0Ry1qR55q119MVcoWrF0Kho17vNkzC5hg0dQ40V9l/Y
kLEjOoXNOJGMcTcKP6qdP2Aohg==
=vgxe
-----END PGP PUBLIC KEY BLOCK-----
-197
View File
@@ -1,197 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015 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/>.
#
# Integration of the `guix-daemon' code taken from upstream Nix.
#
BUILT_SOURCES += nix/libstore/schema.sql.hh
CLEANFILES += $(BUILT_SOURCES)
noinst_LIBRARIES = libformat.a libutil.a libstore.a
# Use '-std=c++0x' for 'std::shared_ptr'.
AM_CXXFLAGS = -Wall -std=c++0x
libformat_a_SOURCES = \
nix/boost/format/free_funcs.cc \
nix/boost/format/parsing.cc \
nix/boost/format/format_implementation.cc
libformat_headers = \
nix/boost/throw_exception.hpp \
nix/boost/format.hpp \
nix/boost/assert.hpp \
nix/boost/format/macros_default.hpp \
nix/boost/format/format_fwd.hpp \
nix/boost/format/format_class.hpp \
nix/boost/format/exceptions.hpp \
nix/boost/format/group.hpp \
nix/boost/format/feed_args.hpp \
nix/boost/format/internals_fwd.hpp \
nix/boost/format/internals.hpp
libformat_a_CPPFLAGS = \
-I$(top_srcdir)/nix
libutil_a_SOURCES = \
nix/libutil/archive.cc \
nix/libutil/affinity.cc \
nix/libutil/serialise.cc \
nix/libutil/util.cc \
nix/libutil/xml-writer.cc \
nix/libutil/hash.cc \
nix/libutil/gcrypt-hash.cc
libutil_headers = \
nix/libutil/affinity.hh \
nix/libutil/hash.hh \
nix/libutil/serialise.hh \
nix/libutil/xml-writer.hh \
nix/libutil/util.hh \
nix/libutil/archive.hh \
nix/libutil/types.hh \
nix/libutil/gcrypt-hash.hh \
nix/libutil/md5.h \
nix/libutil/sha1.h \
nix/libutil/sha256.h
libutil_a_CPPFLAGS = \
-I$(top_builddir)/nix \
-I$(top_srcdir)/nix/libutil \
$(libformat_a_CPPFLAGS)
libstore_a_SOURCES = \
nix/libstore/gc.cc \
nix/libstore/globals.cc \
nix/libstore/misc.cc \
nix/libstore/references.cc \
nix/libstore/store-api.cc \
nix/libstore/optimise-store.cc \
nix/libstore/local-store.cc \
nix/libstore/remote-store.cc \
nix/libstore/build.cc \
nix/libstore/pathlocks.cc \
nix/libstore/derivations.cc
libstore_headers = \
nix/libstore/references.hh \
nix/libstore/pathlocks.hh \
nix/libstore/globals.hh \
nix/libstore/schema.sql.hh \
nix/libstore/worker-protocol.hh \
nix/libstore/remote-store.hh \
nix/libstore/derivations.hh \
nix/libstore/misc.hh \
nix/libstore/local-store.hh \
nix/libstore/store-api.hh
libstore_a_CPPFLAGS = \
$(libutil_a_CPPFLAGS) \
-I$(top_srcdir)/nix/libstore \
-I$(top_builddir)/nix/libstore \
-DNIX_STORE_DIR=\"$(storedir)\" \
-DNIX_DATA_DIR=\"$(datadir)\" \
-DNIX_STATE_DIR=\"$(localstatedir)/guix\" \
-DNIX_LOG_DIR=\"$(localstatedir)/log/guix\" \
-DNIX_CONF_DIR=\"$(sysconfdir)/guix\" \
-DNIX_LIBEXEC_DIR=\"$(libexecdir)\" \
-DNIX_BIN_DIR=\"$(bindir)\" \
-DOPENSSL_PATH="\"guix-authenticate\""
libstore_a_CXXFLAGS = $(AM_CXXFLAGS) \
$(SQLITE3_CFLAGS) $(LIBGCRYPT_CFLAGS)
bin_PROGRAMS = guix-daemon
sbin_PROGRAMS = guix-register
guix_daemon_SOURCES = \
nix/nix-daemon/nix-daemon.cc \
nix/nix-daemon/guix-daemon.cc
guix_daemon_CPPFLAGS = \
$(libutil_a_CPPFLAGS) \
-I$(top_srcdir)/nix/libstore
guix_daemon_LDADD = \
libstore.a libutil.a libformat.a -lbz2 \
$(SQLITE3_LIBS) $(LIBGCRYPT_LIBS)
guix_daemon_headers = \
nix/nix-daemon/shared.hh
guix_register_SOURCES = \
nix/guix-register/guix-register.cc
guix_register_CPPFLAGS = \
$(libutil_a_CPPFLAGS) \
$(libstore_a_CPPFLAGS) \
-I$(top_srcdir)/nix/libstore
# XXX: Should we start using shared libs?
guix_register_LDADD = \
libstore.a libutil.a libformat.a -lbz2 \
$(SQLITE3_LIBS) $(LIBGCRYPT_LIBS)
noinst_HEADERS = \
$(libformat_headers) $(libutil_headers) $(libstore_headers) \
$(guix_daemon_headers)
nix/libstore/schema.sql.hh: nix/libstore/schema.sql
$(GUILE) --no-auto-compile -c \
"(use-modules (rnrs io ports)) \
(call-with-output-file \"$@\" \
(lambda (out) \
(call-with-input-file \"$^\" \
(lambda (in) \
(write (get-string-all in) out)))))"
nodist_pkglibexec_SCRIPTS = \
nix/scripts/list-runtime-roots \
nix/scripts/substitute
if BUILD_DAEMON_OFFLOAD
nodist_pkglibexec_SCRIPTS += \
nix/scripts/offload
endif BUILD_DAEMON_OFFLOAD
# XXX: It'd be better to hide it in $(pkglibexecdir).
nodist_libexec_SCRIPTS = \
nix/scripts/guix-authenticate
EXTRA_DIST += \
nix/libstore/schema.sql \
nix/AUTHORS \
nix/COPYING
AM_TESTS_ENVIRONMENT += \
top_builddir="$(abs_top_builddir)"
TESTS += \
tests/guix-daemon.sh
clean-local:
-if test -d "$(GUIX_TEST_ROOT)"; then \
find "$(GUIX_TEST_ROOT)" | xargs chmod +w; \
fi
-rm -rf "$(GUIX_TEST_ROOT)"
+80
View File
@@ -0,0 +1,80 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=RVmq
-----END PGP PUBLIC KEY BLOCK-----
+76
View File
@@ -0,0 +1,76 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
V2kKr54SWWZdTdeWM62qgpYeXrbDRg==
=2JFc
-----END PGP PUBLIC KEY BLOCK-----
+36
View File
@@ -0,0 +1,36 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
o5EIudGx
=r3t+
-----END PGP PUBLIC KEY BLOCK-----
+109
View File
@@ -0,0 +1,109 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFvHO0sBEAC/MgM9YMJ1sB3KsIj/h+tKH1q5K7pPj4yZSkbcR3wnawwoHyTm
DPpKx4TmSW25lel3rYksTLEAcMiZkudKC3FRCnNoZ7y0AMlOU7fbJ1wL6WxqDl13
8XxbUZoIIo6Ebt6Dd1DQb2Es0Iw3J1r5AdayE5CmhAdjPPdpTmktLqkL3ZvuZzey
AUkCPHSrIHikHDJ6LIH4vFggBZBENvACV9ILbvcU8bV/gpeQoFtLJwGK1TmJVP7r
oOjJfOiT0BUgxOfct0GSGDUsAghJz9QtPUNm/1m2CSKVXObzIP6ubbDX2vnBrZQP
d1SQNRYSigAe9muB1PWJTyIaLw34agH0Ej9HgHU2+TyFpNtKROHTqVLnFG0VR6bY
bz77NOGLHUGaDjFAeS/F7dyAOG2vVx7ND/nvjlFOkC3Lnn2g+Ly9vYfD1D3OrZHe
gFZ3dFCnCWB+F9z88x0KoywoRLjFaLIDGfrYRg5u5vW+AO0RDcjFinRSSam+07UY
VfAWf1pfXnPsRD3gd9u4cmUi99oeGTaKaMpaRKm9/Rv3Uq0tSqKsNJM1zxE7NY4k
2CmZ9eBdTFd2gNJBSkRA0/sNVQ/6dp+uv9Z9qwgmlJL0TY+8PDSNYIbMH+/8pTO3
QCJBoqDxIzpJaJMkYzr+n+DJ74Xz8B2nf0ihDGoZqPSemAePd0MV7gC2cwARAQAB
tCBEYXZpZCBXaWxzb24gPGRhdmlkQGRhdml3aWwuY29tPokCTQQTAQgAOBYhBDp0
mUo+sHhVWg/91Zn2oiGeOjxEBQJbxztLAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B
AheAAAoJEJn2oiGeOjxEeKIP+KpgM9L7rgmtSto2LYGeD5l8AY8tHbg8z0gK1ddT
+1u4EPPcPItfo4/skanIbGktKUWhxez1t+DTpUFyW6SO9UGlutFrM0rB8JM5gvQP
tU1o6TCjJxw75F9ew3DQ0bBLccVIs6YXbZZBCD3kfJ1/BKbJRuzswSyLwo7Jhw3b
9qrs1D1gWrTrDf1NgdFJdfDRoQWDo2eEDtgAPpmJDmr9CbCMopEwVoI2RAKOK8Iw
/4qHwE207IzLuNL6Nb3o5A+pd6lvXGITq7qVqryq5gQ14OWU0y+1c+7BpHHDKWKc
D0VpNE7AX5G0mvN6BGVNshhlUQNwEDQUzsbQS+o0yVT7rABl48GHSCUf4/R23Xyu
5K/NHcY3khuT53sEu43Dmmlzq1Ybr87Q4h9E2VssV11ho/QJqkDwjq+C79srrcMR
R23FsOR2jDewVMK/0+2pSk37czTnqjFCWCm0gu5tOApZJ7cyrmOmx2OCP1A1iT+q
L2/vLhh+FNfHIGJ0hjjRt+/vsiKPE6rlCMCdkUkNb9T8FTg3AyObT35EMTBVPaMU
P4NeKGNzmS7D1s6jEb0Mx+chtxJt+6tpDGv4Do6R/wpO785Wg01XiHx5bOP0F+Au
5K6heCnNbdB0Zn7almZO/S+BB4roCLWCwo8zCxbcrEQvL0CDVNBhpNGKoUk1QIWN
gLW5Ag0EW8c7SwEQAMS7X/3PnP9XK4B4hqtEuDs2wOUXGVnMR9o2bfsoNF/1BOXt
jMLjWKewdFAQNSaM9OmYHqkW5e+Yj/3b9uvEJ7kw6diOOhfwrgmfJ2j7tdhbkFZL
UtSVyy97gTt4S8cgKm9Wx+3tsVGpeadAPvz5wgsLWgpviE6FbofjVCBoWrYuVog+
eShP/35NhGiR1AWNTT6G6lI2nFnUlXBZKBkdrT2CVlqMHwuFcrh6lWEriKEyJMOJ
TJ3fS5U4k8Z8KBDNRXk+SdsmfafPCfNW9KTAToPcHIV24ecr9ohRPleYhdsv3dci
3zEpM+nJIduejxs1UTRmMQwl5bxHmkGPinED2vzD1aS6JNdFe8yilU1ryeE2ns4W
bo72E6e3RwSHuenqRzbr1qjDH+jo0DCu896syBXg2RD7jtu5w91bSnYiVOrqhs5J
sk6mLRL6/P24QLepafE5CkpTT0A2wlShfg14y4ioonv6ps9G1+EqjyFp4jFNsoHk
RQEU6fGsmFwizzh3FbxPyWQ5CqAOO5BYphccooYMbekghlUXa3mT33pM5GD4Dju9
DE6wo5oyzpAptS7JAzDGCEY6nnJDms7jUOqwMkYnGi016yMOEwHXnlc+/s/ekB6X
MfshFzqp9L3T5fS9qeEhimoKrMyOVf+zDUQgoasXu3pgEW+3zVtRH4fHqwGPABEB
AAGJAjYEGAEIACAWIQQ6dJlKPrB4VVoP/dWZ9qIhnjo8RAUCW8c7SwIbDAAKCRCZ
9qIhnjo8RFkuD/0RZz9RBo+GZ74TBx0L5pthrZvl58vQWxH/6KB/1VOwXeNPFA5k
3cD1X+ielzaLYj/y5XcYh1OBSAGTzyEd3bxpy0S/xpDf4PtRDKQcJc5shEAmGHbz
y625b8DbAztcQoslZutGrqI1htlak+zTqh+8jkSTVxkH/f3lx+O2YumAGuRYszie
Rih2gesruizK2keqX4fq/T+UxMqWQjoKsLt65Lm9yp0MgK0dhSb9NKjM1hYvn5ek
i8tNhyinsnmSCCmPLbVr5tqeFU0SpZYmvg4ey6vsiNDymodRB8NZojPC7wTWyFMx
XKsSqKPzG0V6HG6rxR4maq9u1lmLpz8QGCkF6BAI259a7sAehkRFgaFgoBmX8hn7
fDNN2lV9EGIr0qR6JlbD95xfIfxaTO7M5an/bBwCwQQc15fSlHcHmBqhZ9HB6NoN
32iUwqEKOOt+IPs19Bl3iX/zWH/He2lI01pJNKqNSJhlCCQ6Zf6RkSvoLDuKpgwf
WtLrTS5edml4ac4yeH4E4yHgXY3dfmWbGRPUa6Vu5xVjMagPrqp7irZJsHZg3Uov
4lJtqR0ymUwrnbPS3cDCqNEh4+UZjgOeTfao7/qwEGpItjC1G/VJu4yMs8uvD4zt
DrTYuhnSmnBFXFOTgjCwbjFEUUDUHsxUC3PWW5JYlYcm1I+WvE8AxHqER7kCDQRd
tyE0ARAAu7mGCpYHto+iaDK7Or8Y/vhXrk6XL+flCHg9LIWXVkuSDUeGWb9hpndO
0H5sj6+1toKe6SjmpbxDWl2BnPIg85lq/qaDkDYx6B1xbo32Xu6PPR5cM0RgelhD
RWzvje/I9gEkQjrJU1rA2EOWm0L0+SO9LyIbQVcgJMVgSNNEvBjmhbNh71Jku0Tn
7HUx0kemPU/Ofhywc7FhkrrMrDAMpdSU4ldP6rGpHKZFd1kY6TI9c8JuqkrmK3Ts
d0bwWecHOJJNI/0Jvslapx21HLCEtOiYTGp1Xu0iwI0mzR+uawCYWu32UZQEPdj/
cypR47B1r7C6q2DG6D1E9Mtk5OByicK2lo1outsRN3u4FvHHvi/lHpMv9YPNB5OH
Re9sk4oAJjVSCSRoJXur6VgPKltrUs2XsAeJIAY6Qv1hADdOSTbYeVtqTTcEYP57
AqpQwBX16/WiPQaIsXFeLoHnD5c9u4Gom2TOBTObNmRanwLIQyfPO+GkRo4svqYX
gqKotQUMbnypBONJE/qxVWtTnOQr2lN8Ue8S4Wycj/eV+wY5BNud145H+t5OEJ99
bcNLXAadGECirlnceT8fcK1k9kHQyz/6+PoNkUcno1brZiaONOA1w+Jqux2Wh/HN
X7jnufMgG2qmyWuBsQEC7hwH7IDa0Yh3HKHteImnFHYNBWQdjaUAEQEAAYkCNgQY
AQgAIBYhBDp0mUo+sHhVWg/91Zn2oiGeOjxEBQJdtyE0AhsgAAoJEJn2oiGeOjxE
Dw0QAKhDVHEOq85+lLAmmKRROCr7NlvvFPVmu0K5tLLSQAuoVhXnmXlJV/iAVLq2
YJuP33+NDpxmVzFykux8TXbbiCYTpM/stYtZKcpEqGiTuuvu08IlUaKcJhl+mxAz
jm3VzkH7F+nS/LP1/aiqjmcBLg2/NuecfV7e1f70Lm86saL8U9FTD78se4dYUtx0
QY7+5loy72teG688QZDEy0JFbMFI1hEW83IFVsXb8SgvkG/k5VWmxfr1FtfvHs5r
JGT5fh12LIslJVhd1FpuQVZ+wgM+DHyGdQHhrCew6cK/7Zc/htNV2Opuc/DKcal0
I2PplcHnIRQ7rBhVqSnk7Py42B/70uWPT3DJ5vHggrXAc277zMC5YtxTO0J34/xQ
GiJUSzb704CPSZkLNpUuQyIxFCpZHsgZsyKBMSMMsjR8+6o3ze9PI88za0p9F5oH
IakGPHlSlEy4fVnakFIUIDeEaytJ7buC/Dz3rxBBxxgoF7lfnzwygWQ6nPpnQ6+C
NTbKCBTrO5pgkrnxXkGg9VGLLpL2WWPmK0PWp4ga/t0nlEcWjiopUtpFFBcBqYni
bwdok46gftt8AhiscsUf7iDrNlVHzZcnYFMpnqg/SurpUz9mqW0VNcoQdD5zKfjC
mGKEWJbA07ampLKvi5D9Fk5yrMtmcVbxkEkxxzeoqf7M3O1duQINBF23RHoBEADM
bF44tUoHl8+qsiKChA0FM4CVoMd6CVB2dnUXna88S8o939xJm2uEERLu7XosZLOo
8I0D8Wms05Binmc2H9qstwQ7pry65FbuRZdVHXLm/Q5J0BFEbf7pghCVH8+BOX85
g0XLRr9HedsX86FPu8XKGcKvmF0gnfzz6A4MjdAAQ5wjRzeDKRo1ikNxZpw1IRDG
ShR/zdR4W4eOTfAu328qt65GCwSem1u5NE1qsF0Qz+FAYKNqnfu627t41bLOz2i/
3+Rb5s/Dz7vXV5jbUqaHOEePFNxzMwDp2BMP/pulaTpcRq2guLcEL1NF+JjGJOpq
GjYVCr+jJsQSyPrRohN+bnk2azMNOu1zpxKmhPMXlBrWwfL/svicGZqmaLP7uHUL
q1LHtxN5B10ym/eG3CilIrWSvdqsdVRbv+xhUDwln8QqIwJu+3dzE2LuY5ndYCu4
aSKlu2G7qGo41GIHjkOBAceWoWUi8pzZpfU0bTrgL9YlpS9CZva1ffWGM74MgO9N
JidXnJeFooOZO7yf4Sky5t7rSN+WES+qMnt6OX7v+Q5omHBcB/8hr7uoRBXUDFLv
yWSHSOqwFDZYoubVcjpMKcK9tGhocZ9MrvYmXXKlr8lXq6bYYsf4nSfD2nhKBWGd
xIqLS/R1ljMfGhI0fkDwJt1OiX9hHTwtysM3pFyBxwARAQABiQRsBBgBCAAgFiEE
OnSZSj6weFVaD/3VmfaiIZ46PEQFAl23RHoCGwICQAkQmfaiIZ46PETBdCAEGQEI
AB0WIQRTxB5uQar+VTNayl5Eai7U2UC/FAUCXbdEegAKCRBEai7U2UC/FCc8D/9J
YI4SmFTb5T1FnabmPV1wmWG41SFR34/qPLKhsQoC/G8m079qxmhZC4/azzQGO2MZ
rBYfMe2Gn83CuZKtooVxElkj0q6Kq4ON0qqOQXc1nIiZx6v+W86RiIsrhvEx1f8D
h9qqRXknFUi0STPhB5K4Ch1Rwc/dun/AiSYsH3zhVVl/yjYXLuYfK0fs6MBYblyH
g+hFjfZeAYPdQPWF1dCeqJljnAoJeWodZslDMwFV4lH8wfzVsRFUfBI1SX93Yder
dBDPPwI+uuTnra2IPV4Dzf/SYWM05tpxNFqzVypF/5Oq7/0uqHjpItwi+43C1gEq
zqmISCisJlyqlCT2ydX37Y1f5kX5ZoqflSJoX17ZIhsx59Mm8XWHR/JsoxpjbAKC
XTkCWLxx9m0gEFI6SRAiuxLjtpWtwVP+GFYescAS2DzVIh4fHtbq9qBF4L5Sdrai
UMiXXq3g26NlEsqrMrCl4oJk3jaRyO/2Q5wT0DYtU2dLe6j0dnb6AWx4Y9sbIb1L
FvjSLi4SF1OBslIUO6ixt1WiNf2ktVNSpFakvc6c/UcpIeZYWD3Ti5XJDwhr2YdY
rh8rC9i4DkeY3PgGPbjdHLKUP/00YO8xLUOlMHEN6c75EwcCHIQOgomXupliETdG
D9JgjGEc1j/c60TgGrfibCGUONJpXSbIv4PhDfJ+noXFEACvJXjv9jezeCTnuXjo
8u66doVX8YbOGFjSag/pJtHBwNztk0i48CWE4XeU7aIvbO1RYuRPXJyTXPcMGJlb
IzAqrKeMhrDM4sH0tmBGKzwz88rhMJug05t6/hE7HK4wFOjiXomdht9/TTetp4uV
1PjjUDmJx9WOyJ59I282thZJQLL3ehffX5CMb8vuY50GzLiL3Kt7YXFgyrPdAq38
DVmQbMNr427Lwom4L31jUMZ+68hrUugLqoFt1pyvsCcJwwMuN+3cP7ZuDX/zHFnt
acbA/S2pryZkm8BznmGngGbenHifiaawlK2fnTQFvZ+xi4XgXZvZNz3zFQzIk0SV
xNLoPoDEkiQI3nZh6LIDS48fXA8MH6A2jaKwzXikY5WoKYP8OG3Gyi3kNSaN3AO6
n1Rt76z/PhhjUHFEb04Qybj2GZQRGIIlyZxLpmicTBl0LT4MxqmS6MHoZSQDUIxl
ON9hnTn/iqrek5iHazKgRHbUcQr0dGtNNS81te5LZw8Jh72JWsnGmyNCn7jHeLdI
DwEw705yegnsQ7Kb3zwxKfmFs5d202iN28pp3G2I79jfJqwN7dy6yXBaKw0vOQ0l
9NuS8PCX52uqsDJqlf5QUE+FiJ7+CT7wzLsL8Yw54l/rRGOQF0gdBgUxeOKKch6l
C0kDyI03GVXxDo+5JO4vUnLiVQ==
=FZnZ
-----END PGP PUBLIC KEY BLOCK-----
-67
View File
@@ -1,67 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2013 Andreas Enge <andreas@enge.fr>
#
# 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/>.
info_TEXINFOS = doc/guix.texi
EXTRA_DIST += \
doc/emacs.texi \
doc/fdl-1.3.texi \
doc/images/bootstrap-graph.dot \
doc/images/bootstrap-graph.eps \
doc/images/bootstrap-graph.pdf
OS_CONFIG_EXAMPLES_TEXI = \
doc/os-config-bare-bones.texi \
doc/os-config-desktop.texi
# Bundle this file so that makeinfo finds it in out-of-source-tree builds.
BUILT_SOURCES += $(OS_CONFIG_EXAMPLES_TEXI)
EXTRA_DIST += $(OS_CONFIG_EXAMPLES_TEXI)
MAINTAINERCLEANFILES = $(OS_CONFIG_EXAMPLES_TEXI)
doc/os-config-%.texi: gnu/system/examples/%.tmpl
$(MKDIR_P) "`dirname "$@"`"
cp "$<" "$@"
infoimagedir = $(infodir)/images
dist_infoimage_DATA = doc/images/bootstrap-graph.png
# Try hard to obtain an image size and aspect that's reasonable for inclusion
# in an Info or PDF document.
DOT_OPTIONS = \
-Gratio=.9 -Gnodesep=.005 -Granksep=.00005 \
-Nfontsize=9 -Nheight=.1 -Nwidth=.1
.dot.png:
$(DOT) -Tpng $(DOT_OPTIONS) < "$<" > "$@.tmp"
mv "$@.tmp" "$@"
.dot.pdf:
$(DOT) -Tpdf $(DOT_OPTIONS) < "$<" > "$@.tmp"
mv "$@.tmp" "$@"
.dot.eps:
$(DOT) -Teps $(DOT_OPTIONS) < "$<" > "$@.tmp"
mv "$@.tmp" "$@"
# We cannot add new dependencies to `doc/guix.pdf' & co. (info "(automake)
# Extending"). Using the `-local' rules is imperfect, because they may be
# triggered after the main rule. Oh, well.
pdf-local: $(top_srcdir)/doc/images/bootstrap-graph.pdf
info-local: $(top_srcdir)/doc/images/bootstrap-graph.png
ps-local: $(top_srcdir)/doc/images/bootstrap-graph.eps
-488
View File
@@ -1,488 +0,0 @@
@node Emacs Interface
@section Emacs Interface
@cindex Emacs
GNU Guix comes with a visual user interface for GNU@tie{}Emacs, known
as ``guix.el''. It can be used for routine package management tasks,
pretty much like the @command{guix package} command (@pxref{Invoking
guix package}). Specifically, ``guix.el'' makes it easy to:
@itemize
@item browse and display packages and generations;
@item search, install, upgrade and remove packages;
@item display packages from previous generations;
@item do some other useful things.
@end itemize
@menu
* Initial Setup: Emacs Initial Setup. Preparing @file{~/.emacs}.
* Usage: Emacs Usage. Using the interface.
* Configuration: Emacs Configuration. Configuring the interface.
* Prettify Mode: Emacs Prettify. Abbreviating @file{/gnu/store/@dots{}} file names.
@end menu
@node Emacs Initial Setup
@subsection Initial Setup
On the Guix System Distribution (@pxref{GNU Distribution}), ``guix.el''
is ready to use, provided Guix is installed system-wide, which is the
case by default. So if that is what you're using, you can happily skip
this section and read about the fun stuff.
If you're not yet a happy user of GSD, a little bit of setup is needed.
To be able to use ``guix.el'', you need to install the following
packages:
@itemize
@item
@uref{http://www.gnu.org/software/emacs/, GNU Emacs}, version 24.3 or
later;
@item
@uref{http://nongnu.org/geiser/, Geiser}, version 0.3 or later: it is
used for interacting with the Guile process.
@end itemize
When it is done, add the following into your init file (@pxref{Init
File,,, emacs, The GNU Emacs Manual}):
@example
(require 'guix-init nil t)
@end example
However there is a chance that @code{load-path} of your Emacs does not
contain a directory with ``guix.el'' (usually it is
@file{/usr/share/emacs/site-lisp/}). In that case you need to add it
before requiring (@pxref{Lisp Libraries,,, emacs, The GNU Emacs
Manual}):
@example
(add-to-list 'load-path "/path/to/directory-with-guix.el")
(require 'guix-init)
@end example
By default, along with autoloading (@pxref{Autoload,,, elisp, The GNU
Emacs Lisp Reference Manual}) the main interactive commands for
``guix.el'' (@pxref{Emacs Commands}), requiring @code{guix-init} will
also autoload commands for the Emacs packages installed in your user
profile.
To disable automatic loading of installed Emacs packages, set
@code{guix-package-enable-at-startup} variable to @code{nil} before
requiring @code{guix-init}. This variable has the same meaning for
Emacs packages installed with Guix, as @code{package-enable-at-startup}
for the built-in Emacs package system (@pxref{Package Installation,,,
emacs, The GNU Emacs Manual}).
You can activate Emacs packages installed in your profile whenever you
want using @kbd{M-x@tie{}guix-emacs-load-autoloads}.
@node Emacs Usage
@subsection Usage
Once ``guix.el'' has been successfully configured, you should be able to
use commands for displaying packages and generations. This information
can be displayed in a ``list'' or ``info'' buffer.
@menu
* Commands: Emacs Commands. @kbd{M-x guix-@dots{}}
* General information: Emacs General info. Common for both interfaces.
* ``List'' buffer: Emacs List buffer. List-like interface.
* ``Info'' buffer: Emacs Info buffer. Help-like interface.
@end menu
@node Emacs Commands
@subsubsection Commands
All commands for displaying packages and generations use the current
profile, which can be changed with
@kbd{M-x@tie{}guix-set-current-profile}. Alternatively, if you call any
of these commands with prefix argument (@kbd{C-u}), you will be prompted
for a profile just for that command.
Commands for displaying packages:
@table @kbd
@item M-x guix-all-available-packages
@itemx M-x guix-newest-available-packages
Display all/newest available packages.
@item M-x guix-installed-packages
Display all installed packages.
@item M-x guix-obsolete-packages
Display obsolete packages (the packages that are installed in a profile
but cannot be found among available packages).
@item M-x guix-search-by-name
Display package(s) with the specified name.
@item M-x guix-search-by-regexp
Search for packages by a specified regexp. By default ``name'',
``synopsis'' and ``description'' of the packages will be searched. This
can be changed by modifying @code{guix-search-params} variable.
@end table
By default, these commands display each output on a separate line. If
you prefer to see a list of packages---i.e., a list with a package per
line, use the following setting:
@example
(setq guix-package-list-type 'package)
@end example
Commands for displaying generations:
@table @kbd
@item M-x guix-generations
List all the generations.
@item M-x guix-last-generations
List the @var{N} last generations. You will be prompted for the number
of generations.
@item M-x guix-generations-by-time
List generations matching time period. You will be prompted for the
period using Org mode time prompt based on Emacs calendar (@pxref{The
date/time prompt,,, org, The Org Manual}).
@end table
You can also invoke the @command{guix pull} command (@pxref{Invoking
guix pull}) from Emacs using:
@table @kbd
@item M-x guix-pull
With @kbd{C-u}, make it verbose.
@end table
Once @command{guix pull} has succeeded, the Guix REPL is restared. This
allows you to keep using the Emacs interface with the updated Guix.
@node Emacs General info
@subsubsection General information
The following keys are available for both ``list'' and ``info'' types of
buffers:
@table @kbd
@item l
@itemx r
Go backward/forward by the history of the displayed results (this
history is similar to the history of the Emacs @code{help-mode} or
@code{Info-mode}).
@item g
Revert current buffer: update information about the displayed
packages/generations and redisplay it.
@item R
Redisplay current buffer (without updating information).
@item C-c C-z
Go to the Guix REPL (@pxref{The REPL,,, geiser, Geiser User Manual}).
@item h
@itemx ?
Describe current mode to see all available bindings.
@end table
@emph{Hint:} If you need several ``list'' or ``info'' buffers, you can
simlpy @kbd{M-x clone-buffer} them, and each buffer will have its own
history.
@emph{Warning:} Name/version pairs cannot be used to identify packages
(because a name is not necessarily unique), so ``guix.el'' uses special
identifiers that live only during a guile session, so if the Guix REPL
was restarted, you may want to revert ``list'' buffer (by pressing
@kbd{g}).
@node Emacs List buffer
@subsubsection ``List'' buffer
An interface of a ``list'' buffer is similar to the interface provided
by ``package.el'' (@pxref{Package Menu,,, emacs, The GNU Emacs Manual}).
Default key bindings available for both ``package-list'' and
``generation-list'' buffers:
@table @kbd
@item m
Mark the current entry.
@item M
Mark all entries.
@item u
Unmark the current entry (with prefix, unmark all entries).
@item @key{DEL}
Unmark backward.
@item S
Sort entries by a specified column.
@end table
A ``package-list'' buffer additionally provides the following bindings:
@table @kbd
@item @key{RET}
Describe marked packages (display available information in a
``package-info'' buffer).
@item i
Mark the current package for installation.
@item d
Mark the current package for deletion.
@item U
Mark the current package for upgrading.
@item ^
Mark all obsolete packages for upgrading.
@item x
Execute actions on the marked packages.
@end table
A ``generation-list'' buffer additionally provides the following
bindings:
@table @kbd
@item @key{RET}
List packages installed in the current generation.
@item i
Describe marked generations (display available information in a
``generation-info'' buffer).
@item s
Switch profile to the current generation.
@item d
Mark the current generation for deletion (with prefix, mark all
generations).
@item x
Execute actions on the marked generations---i.e., delete generations.
@item e
Run Ediff (@pxref{Top,,, ediff, The Ediff Manual}) on package outputs
installed in the 2 marked generations. With prefix argument, run Ediff
on manifests of the marked generations.
@item D
@itemx =
Run Diff (@pxref{Diff Mode,,, emacs, The GNU Emacs Manual}) on package
outputs installed in the 2 marked generations. With prefix argument,
run Diff on manifests of the marked generations.
@item +
List package outputs added to the latest marked generation comparing
with another marked generation.
@item -
List package outputs removed from the latest marked generation comparing
with another marked generation.
@end table
@node Emacs Info buffer
@subsubsection ``Info'' buffer
The interface of an ``info'' buffer is similar to the interface of
@code{help-mode} (@pxref{Help Mode,,, emacs, The GNU Emacs Manual}).
``Info'' buffer contains some buttons (as usual you may use @key{TAB} /
@kbd{S-@key{TAB}} to move between buttons---@pxref{Mouse References,,,
emacs, The GNU Emacs Manual}) which can be used to:
@itemize @bullet
@item (in a ``package-info'' buffer)
@itemize @minus
@item install/remove a package;
@item jump to a package location;
@item browse home page of a package;
@item describe packages from ``Inputs'' fields.
@end itemize
@item (in a ``generation-info'' buffer)
@itemize @minus
@item remove a generation;
@item switch to a generation;
@item list packages installed in a generation;
@item jump to a generation directory.
@end itemize
@end itemize
It is also possible to copy a button label (a link to an URL or a file)
by pressing @kbd{c} on a button.
@node Emacs Configuration
@subsection Configuration
There are many variables you can modify to change the appearance or
behavior of Emacs user interface. Some of these variables are described
in this section. Also you can use Custom Interface (@pxref{Easy
Customization,,, emacs, The GNU Emacs Manual}) to explore/set variables
(not all) and faces.
@menu
* Guile and Build Options: Emacs Build Options. Specifying how packages are built.
* Buffer Names: Emacs Buffer Names. Names of Guix buffers.
* Keymaps: Emacs Keymaps. Configuring key bindings.
* Appearance: Emacs Appearance. Settings for visual appearance.
@end menu
@node Emacs Build Options
@subsubsection Guile and Build Options
@table @code
@item guix-guile-program
If you have some special needs for starting a Guile process, you may set
this variable, for example:
@example
(setq guix-guile-program '("/bin/guile" "--no-auto-compile"))
@end example
@item guix-use-substitutes
Has the same meaning as @code{--no-substitutes} option (@pxref{Invoking
guix build}).
@item guix-dry-run
Has the same meaning as @code{--dry-run} option (@pxref{Invoking guix
build}).
@end table
@node Emacs Buffer Names
@subsubsection Buffer Names
Default names of ``guix.el'' buffers (``*Guix@tie{}@dots{}*'') may be
changed with the following variables:
@table @code
@item guix-package-list-buffer-name
@item guix-output-list-buffer-name
@item guix-generation-list-buffer-name
@item guix-package-info-buffer-name
@item guix-output-info-buffer-name
@item guix-generation-info-buffer-name
@item guix-repl-buffer-name
@item guix-internal-repl-buffer-name
@end table
By default, the name of a profile is also displayed in a ``list'' or
``info'' buffer name. To change this behavior, use
@code{guix-buffer-name-function} variable.
For example, if you want to display all types of results in a single
buffer (in such case you will probably use a history (@kbd{l}/@kbd{r})
extensively), you may do it like this:
@example
(let ((name "Guix Universal"))
(setq
guix-package-list-buffer-name name
guix-output-list-buffer-name name
guix-generation-list-buffer-name name
guix-package-info-buffer-name name
guix-output-info-buffer-name name
guix-generation-info-buffer-name name
guix-buffer-name-function #'guix-buffer-name-simple))
@end example
@node Emacs Keymaps
@subsubsection Keymaps
If you want to change default key bindings, use the following keymaps
(@pxref{Init Rebinding,,, emacs, The GNU Emacs Manual}):
@table @code
@item guix-list-mode-map
Parent keymap with general keys for ``list'' buffers.
@item guix-package-list-mode-map
Keymap with specific keys for ``package-list'' buffers.
@item guix-output-list-mode-map
Keymap with specific keys for ``output-list'' buffers.
@item guix-generation-list-mode-map
Keymap with specific keys for ``generation-list'' buffers.
@item guix-info-mode-map
Parent keymap with general keys for ``info'' buffers.
@item guix-package-info-mode-map
Keymap with specific keys for ``package-info'' buffers.
@item guix-output-info-mode-map
Keymap with specific keys for ``output-info'' buffers.
@item guix-generation-info-mode-map
Keymap with specific keys for ``generation-info'' buffers.
@item guix-info-button-map
Keymap with keys available when a point is placed on a button.
@end table
@node Emacs Appearance
@subsubsection Appearance
You can change almost any aspect of ``list'' / ``info'' buffers using
the following variables:
@table @code
@item guix-list-column-format
@itemx guix-list-column-titles
@itemx guix-list-column-value-methods
Specify the columns, their names, what and how is displayed in ``list''
buffers.
@item guix-info-displayed-params
@itemx guix-info-insert-methods
@itemx guix-info-ignore-empty-vals
@itemx guix-info-param-title-format
@itemx guix-info-multiline-prefix
@itemx guix-info-indent
@itemx guix-info-fill-column
@itemx guix-info-delimiter
Various settings for ``info'' buffers.
@end table
@node Emacs Prettify
@subsection Guix Prettify Mode
Along with ``guix.el'', GNU@tie{}Guix comes with ``guix-prettify.el''.
It provides a minor mode for abbreviating store file names by replacing
hash sequences of symbols with ``@dots{}'':
@example
/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1
@result{} /gnu/store/…-foo-0.1
@end example
Once you set up ``guix.el'' (@pxref{Emacs Initial Setup}), the following
commands become available:
@table @kbd
@item M-x guix-prettify-mode
Enable/disable prettifying for the current buffer.
@item M-x global-guix-prettify-mode
Enable/disable prettifying globally.
@end table
To automatically enable @code{guix-prettify-mode} globally on Emacs
start, add the following line to your init file:
@example
(global-guix-prettify-mode)
@end example
If you want to enable it only for specific major modes, add it to the
mode hooks (@pxref{Hooks,,, emacs, The GNU Emacs Manual}), for example:
@example
(add-hook 'shell-mode-hook 'guix-prettify-mode)
(add-hook 'dired-mode-hook 'guix-prettify-mode)
@end example
-505
View File
@@ -1,505 +0,0 @@
@c The GNU Free Documentation License.
@center Version 1.3, 3 November 2008
@c This file is intended to be included within another document,
@c hence no sectioning command or @node.
@display
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
@uref{http://fsf.org/}
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@end display
@enumerate 0
@item
PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document @dfn{free} in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of ``copyleft'', which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
@item
APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The ``Document'', below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as ``you''. You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
A ``Modified Version'' of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A ``Secondary Section'' is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The ``Invariant Sections'' are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
The ``Cover Texts'' are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
A ``Transparent'' copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not ``Transparent'' is called ``Opaque''.
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, La@TeX{} input
format, SGML or XML using a publicly available
DTD, and standard-conforming simple HTML,
PostScript or PDF designed for human modification. Examples
of transparent image formats include PNG, XCF and
JPG. Opaque formats include proprietary formats that can be
read and edited only by proprietary word processors, SGML or
XML for which the DTD and/or processing tools are
not generally available, and the machine-generated HTML,
PostScript or PDF produced by some word processors for
output purposes only.
The ``Title Page'' means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, ``Title Page'' means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
The ``publisher'' means any person or entity that distributes copies
of the Document to the public.
A section ``Entitled XYZ'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as ``Acknowledgements'',
``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
of such a section when you modify the Document means that it remains a
section ``Entitled XYZ'' according to this definition.
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
@item
VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
@item
COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
@item
MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
@enumerate A
@item
Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
@item
List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
@item
State on the Title page the name of the publisher of the
Modified Version, as the publisher.
@item
Preserve all the copyright notices of the Document.
@item
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
@item
Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
@item
Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
@item
Include an unaltered copy of this License.
@item
Preserve the section Entitled ``History'', Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled ``History'' in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
@item
Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the ``History'' section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
@item
For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
the Title of the section, and preserve in the section all the
substance and tone of each of the contributor acknowledgements and/or
dedications given therein.
@item
Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
@item
Delete any section Entitled ``Endorsements''. Such a section
may not be included in the Modified Version.
@item
Do not retitle any existing section to be Entitled ``Endorsements'' or
to conflict in title with any Invariant Section.
@item
Preserve any Warranty Disclaimers.
@end enumerate
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled ``Endorsements'', provided it contains
nothing but endorsements of your Modified Version by various
parties---for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
@item
COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled ``History''
in the various original documents, forming one section Entitled
``History''; likewise combine any sections Entitled ``Acknowledgements'',
and any sections Entitled ``Dedications''. You must delete all
sections Entitled ``Endorsements.''
@item
COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
@item
AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an ``aggregate'' if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
@item
TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
If a section in the Document is Entitled ``Acknowledgements'',
``Dedications'', or ``History'', the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
@item
TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
@item
FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
@uref{http://www.gnu.org/copyleft/}.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License ``or any later version'' applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
@item
RELICENSING
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
site means any set of copyrightable works thus published on the MMC
site.
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
``Incorporate'' means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is ``eligible for relicensing'' if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
@end enumerate
@page
@heading ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
@smallexample
@group
Copyright (C) @var{year} @var{your name}.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
@end group
@end smallexample
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the ``with@dots{}Texts.''@: line with this:
@smallexample
@group
with the Invariant Sections being @var{list their titles}, with
the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
being @var{list}.
@end group
@end smallexample
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.
@c Local Variables:
@c ispell-local-pdict: "ispell-dict"
@c End:
-6383
View File
File diff suppressed because it is too large Load Diff
-83
View File
@@ -1,83 +0,0 @@
# Obtained by running "nix-store --graph" on the first GCC derivation.
digraph G {
"/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "black"];
"/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "red"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "green"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "blue"];
"/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "magenta"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "burlywood"];
"/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "black"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "red"];
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "green"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" [label = "tar", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "blue"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "magenta"];
"/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "burlywood"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "black"];
"/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "red"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "green"];
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "blue"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" [label = "xz", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [label = "glibc-bootstrap-0-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [color = "magenta"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [color = "burlywood"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [label = "module-import.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/9zrdfvnrpljryr82an2n1mj6bh2przhn-module-import-guile-builder" -> "/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [color = "black"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [color = "red"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [color = "green"];
"/nix/store/9zrdfvnrpljryr82an2n1mj6bh2przhn-module-import-guile-builder" [label = "module-import-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/9zrdfvnrpljryr82an2n1mj6bh2przhn-module-import-guile-builder" [color = "blue"];
"/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [label = "gcc-4.7.2.tar.xz.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/6kslnirvm26fij7wpjqbw617ri4gf5x5-gcc-4.7.2.tar.xz-guile-builder" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "magenta"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "burlywood"];
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "black"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "red"];
"/nix/store/6kslnirvm26fij7wpjqbw617ri4gf5x5-gcc-4.7.2.tar.xz-guile-builder" [label = "gcc-4.7.2.tar.xz-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" [label = "bash", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [label = "module-import.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/abagrdbdndkd0y2dwk0nw1gw0g0rhl2z-ftp-client.scm" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "green"];
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "blue"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "magenta"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "burlywood"];
"/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "black"];
"/nix/store/abagrdbdndkd0y2dwk0nw1gw0g0rhl2z-ftp-client.scm" [label = "ftp-client.scm", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" [label = "download.scm", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" [label = "utils.scm", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [label = "module-import-compiled.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/98gzqlgpm4gxrpl5bzykpqbwrx8ckx8l-module-import-compiled-guile-builder" -> "/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [color = "red"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" -> "/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [color = "green"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [color = "blue"];
"/nix/store/98gzqlgpm4gxrpl5bzykpqbwrx8ckx8l-module-import-compiled-guile-builder" [label = "module-import-compiled-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [label = "gcc-bootstrap-0-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [color = "magenta"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [color = "burlywood"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" -> "/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [color = "black"];
"/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [label = "glibc-2.17.tar.xz.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "red"];
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "green"];
"/nix/store/q7as3jddipj4g6si8lawrdbkjg0zcjvg-glibc-2.17.tar.xz-guile-builder" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "blue"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "magenta"];
"/nix/store/q7as3jddipj4g6si8lawrdbkjg0zcjvg-glibc-2.17.tar.xz-guile-builder" [label = "glibc-2.17.tar.xz-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [label = "guile-bootstrap-2.0.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" -> "/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [color = "burlywood"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" -> "/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [color = "black"];
"/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [label = "build-bootstrap-guile.sh", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "red"];
"/nix/store/4xv2y0m6zr2lgi8x8pcb3zxjqxsz69kj-mkdir" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "green"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "blue"];
"/nix/store/c450lqvaaz3ngx9pfiiiw55rqq6ssfda-guile-2.0.7.tar.xz" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "magenta"];
"/nix/store/4xv2y0m6zr2lgi8x8pcb3zxjqxsz69kj-mkdir" [label = "mkdir", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/c450lqvaaz3ngx9pfiiiw55rqq6ssfda-guile-2.0.7.tar.xz" [label = "guile-2.0.7.tar.xz", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [label = "module-import-compiled.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/8jiqjlb6zxjys16ca7s6jvxcc620c71k-module-import-compiled-guile-builder" -> "/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [color = "burlywood"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" -> "/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [color = "black"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [color = "red"];
"/nix/store/8jiqjlb6zxjys16ca7s6jvxcc620c71k-module-import-compiled-guile-builder" [label = "module-import-compiled-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [label = "module-import-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/abagrdbdndkd0y2dwk0nw1gw0g0rhl2z-ftp-client.scm" -> "/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [color = "green"];
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" -> "/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [color = "blue"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [color = "magenta"];
}
+30
View File
@@ -0,0 +1,30 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFidi7gBCADEupvdH6woe3DfqSgC20nTVmLgKKjvHotuEry5BGm62lKsSzPa
eyXT6UkM+MMRG6pYQ8ZgKiAZDZtiTw+fuulRA4bWXd9xBNPT+xYDGMzV8EXWlo6R
ABq3InxJK6Bbl8c+Z8hMTeHF1WR4Ylp2N9BfIw3eQKqk4MSgPPY+NddxEQUdZ4E8
3RNnWFJM08mjJJCfxHi9YmKncoUIua8Tj+SgYLt9yB2MOvm7BKoWg8k8PR1HtTMA
2/wfOyhEETqToMA24Wpq+7ULiPMq52iSjpJMjlRFqtbnd8vTjKOnoIDDuF2SKFnn
fnw/3rhiw10BYLsY/auF7AutovCFA0n+YuTPABEBAAG0HkRhdmlkIENyYXZlbiA8
ZGF2aWRAY3JhdmVuLmNoPokBTgQTAQgAOBYhBF9DtoEENy9LqJimSzO56f3ijSwj
BQJYnYu4AhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEDO56f3ijSwja/0I
AJlTg+KyMRcppViv+TSWpNf9RcyEHWPMLJCtRuZLB3eGc8SliPGL1UX+nyo9Zaap
MwFHdxyt80XWrRmtQHZB1MyRq7YJQBAaeK08UeXtomXnG/aSfr8Yk+pwlaLxGDGc
bn8yz3k+Odfkla/i1JfwvznoG0Ck6x9DsNn1EZKgOyZvCDDSK8wv3Z5BRg5zdxER
THyT+h56cPEFn1zZ75/gTuJZ6AP87m4B0n/zdwn0qxyCeV5C0Vqkq0/5ssKDO3ke
KBe3iDjxpaAQTofgjdY/mUAg8Pl4/5gJLKL4VAM/M/sTMEWmwuIwQuaOzjPt7DOr
D66jexWgs/jHptAKEfBvJ7y5AQ0EWJ2LuAEIAMR1IWIYgIGydlpvIe3+C99HB+Fw
ok+LYRdcdTud0db8dByW/DTdVJlzDN7AHp6IzG/agNaQCQd4F5W0ovIlVY7zBOOR
663XXA5vrdYWq6adFR+tN5bE9MM0xKovvKnx3kb1NXJiWG+nSqdmhd7L8ZG711R7
uh6fk1faXGAbUFSriI2gNiFdOxgfW8mHXYknsuCEI2a//RiFoUQZgScfM7oPmVGq
cCGsFGWTLj+TU5JY01BVSY7x+9lbNvb7WvyYQSUldQG8wfnuu+Xmr7cE3/5GHmMz
fmWbmv8865eKjnG51cPp2LR0VUVxpHs6hwxaXi3BJ0T3NKexIWZQE5CsXb8AEQEA
AYkBNgQYAQgAIBYhBF9DtoEENy9LqJimSzO56f3ijSwjBQJYnYu4AhsMAAoJEDO5
6f3ijSwj6rAH/1jox9X3Pw1CUALihQaN7D8vWMFh3FiboO7SzBnghHkUvlz7LyJJ
FjZkg+M4zIKckCLMVE8qPx1XR24fmFRCSiz2FvLe/FHe7FWltycpiXZzMCqh/8Ch
b8CejLlKkyVbEbD+tPfp95VXM6giIEN2lFEoDvqaXmnYAWWmWBo3sl30oUGM+xvn
e1DyWxbYhiUJ3z/P0URs2kOOl0USbx0uEprJce2vRVwij74swpmCq0K3CyYG9oWC
8ID9UlKNpo4ar3Ni1hfwARjViUev8Xc+iKitkxnAJigsYqwa2qeMEvlheJsCKHFS
eUVaVX/l+Od27ahlXPo54pU7Lc7QNmIkPlA=
=eGxN
-----END PGP PUBLIC KEY BLOCK-----
+62
View File
@@ -0,0 +1,62 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
N8KxEVauZxGaQ4T+xb0k3PWW2byfqQEyu4k=
=lxuw
-----END PGP PUBLIC KEY BLOCK-----
File diff suppressed because it is too large Load Diff
+3668
View File
File diff suppressed because it is too large Load Diff
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGcvh/QBEACePF16wEeQaqfJNgeaSQB6ty6PzLaYtl8UVApPSCF1PYNEhDtx
QOOpBXeuk6h68cjhRX7hmug8mAraXotw4aG4Z3kbUro4fzXOYW3rCi/mAm5NFXLU
mBX3E1AV1pcD8hDA5s3LeGzfTo4xRGTW4zTzxGEyrvbChkVib7wTSk52a/WkFas6
l3sXnepF8HmIEOWkwQcYdcuogaNDFP1kjZYvqfKJXmCZnY+lC8Zfe/vlD/x8FZQY
BQ5xgXIfbSR0xlRz/XIHfJv6j+3myUUr2UKMku1dkjlkhNkyfw+RypQzmbJ0oJ4b
k76/ju0nnlN65/LvyeTVUh/2O2VnPnZ49keL8sqrAPXF4di4pWT+/mPxfoEtiSDt
jyzbr8+ajcwLa4SSKLlexqjZj8X6R4tt31Rf/Pliwe4TdPmd2leE3BIJl9bAuslE
vd5tqZ1oa3Zfb62tvpaJCRYMtOEWuGkYdyrwTW7UXJPQpam4X7WoW2jWc5aTpAnp
nqIPzaWJmua1lGQjEXgt4xvVdhVmZq32fkTy/rXw9l5a+XU7N4/Zz8AR/0xO+UBc
Q1J+wHADjL8Q0v0tZLEaiWL72AsxN3GMWNPXWAplaTPUNPUlNK0JPHwhTX/cQVkI
c9avSKc3BeUofC96d13I7QmRjQ0gcBaLtV9lMOuYwbC+6tb70x2fQsI3bwARAQAB
tCJFa2FpdHogWmFycmFnYSA8ZWthaXR6QGVsZW5xLnRlY2g+iQJUBBMBCAA+FiEE
Xb4j05BTZSZ/jMdq/blSvT9zVtYFAmcvh/QCGwMFCQPCZwAFCwkIBwIGFQoJCAsC
BBYCAwECHgECF4AACgkQ/blSvT9zVtbWCRAAkbla35s8RKhQBweqwEcdYDV2Zpt1
6OgENymjLs/qhh7Y9WgWZ0YraSNYDGCt6lemhiorvrXX48+yZC98c8ZgCrr4Hmt8
i/6TvJqVhwlZ9//3W/z/YuYDtUPBzRHgwM8tejiXmNqYM8lFJg64pQaczmGAR29X
f0WTQegSociBSUg9eC7BS74Uh7UbHCgytyretoKmqJAp8SKE/Czt5x4RlXKVgGaw
zg1GerriwnNbudy0eyl1q0Pn7Q+K+tQ14EPDAM+QsGR/fBV4a3uYP6sBF+SdM+DO
LX5MRVbWJ8O3kLmbAKQeLgSLlnYydMY/mTvjgxMAakfGCA4q69gmyDSB0fzAUm3c
1JV5VwIo63rykiOEB/k2m4aiiujH5kOC86sjb273+XXWlOhOEO/vKHHdAh+B7dnE
EYUPXnUEMQ23PaF422u7C62kw3yH/krKr60t5FxcqNWtCOxEWc0WMZw12Q3Gw8+9
oA5DI/f4gjlGvQiQWqj6dvoXvIDmifr0R3sTi6xh+udu2Rp8PsKOW8ZRyQ0/VOiw
zBfQkf4PFowaiRp8LnkjLEVft6ruuA1hawO2SKKJ8WpgZPw5oMigZR5DgbunxMD4
BcqmD7bSoTRV/ljx1I8UgAaQLPqVVnLt31iENtLv43kPHl56AbYpAzcvf8nGU3KP
hGOoByyuyph4RYC5Ag0EZy+H9AEQANc9vw7DnBeNGKhq1Bg5oiGII7npGXCChe7P
B6CJjkvN6n1kXrvBYsaORXvZJPNgmBTKu/ETGYS0t0YeGlI4WTOK9dgB/7T8dngR
mrGjPmZjryzfk18tXnJq0zoLixLizDT3FqV4jOG5KjPTxQvpdBMiX9oX4Je2OMqF
d14fopLGav0rW7Fh5p83OSREpXbJUJJiUaH3p9U9Ss8IBHzr669PViAqe09EfxL/
L0l1JIFjHQjJcg01PUXZAW6aPtd7q6eNCSLTXYPiDRQe2GdRUcB7WfqCogR/LEpz
LLcd0NkxCnc0T6darq2Dupt8rvQ95L4/cOGVcDUDOGE6U92XCkaCvUQkypxQCGKS
EjbTFoLRG/4JQj0pAWSaqxPS7hkTFql4qUAdRwzHN1ib6XedcFfqHSy2Mk5ttW8D
aBGKhCm7Mn6+4smXENHSuQxCqHlCQ2m+9ogpbxavNVfAblE/ucxyfyo6FlDbGHEG
3Yu5296kUPT7PqZLiR3KetMPJfCLY2jVPio3t4tDs7Sj41sG5aIwEApb0Zoz3bPB
t5O5GUoPFnXyjO306WLxXrM2tjY38jwHxF1Qvs3HQTJgRei2g3D3KiiR27cXXs/8
lrr8tblr5J1tE4TaQCea5lDuEgTCDLnlcopoYcKpFAUBGQtzcNkudT9wsM2nf9y6
INcUE3FlABEBAAGJAjwEGAEIACYWIQRdviPTkFNlJn+Mx2r9uVK9P3NW1gUCZy+H
9AIbDAUJA8JnAAAKCRD9uVK9P3NW1td1D/4xx8AbDKAKx9ezT6GdTZbK6FS66qRQ
CEzTa5MXZCEogASOla71CB10l5fFtsRWCtNQLzmgwkFwhdxyjqendDgacc5v/71N
Bb5KpKni6wDJMeiGs3Lq3ZgWfHte3NZ99iSH+La3aBSFbCloJ/Yf/MJBkzrm1sTT
KcgF9/i0pzkume5vtpKRDjjSz4abHu7qk4Sgi5gwWpoKFTT38q6nLP+9SUla3JJj
NqU3gvn8kwv6KDMKc4marnSp/c+5O6E+lNrxMdD0n8+io/Bf/UEI6BU8F7JshPq7
32bHN1NzUXvgMd4cNsAlvsWM8UCKZ4/usFl1euMMFOvnadZinsTHpXhahJzkYWA7
nAKbCoNNq9LPtWxfjHsIfhs+QQafF31Pw+jqHqruB4tH0eiLabrz7kejaZvJdVip
NIzRUWYnpP+18khep2UtT1n9VNs6QNb4cHPsoe+s4ga4ZK/klCdEhLyaXtbcaNEH
b7NZUOBj3HhKFgIY8PD1AptAObHjsUNF5+jfEnl+5WjwyTZTIgDRiOrwn8LWOANQ
0JpR69t06uJwmiogQgnlYe36YFaauHGQZFa+L+R2zgnGn8TnR4C3tH7gNAef9+PK
qgmJT5pNIkFzlDmZi05E9xzhj4WQ/OOsqU64eHL2PaDk+2TdfrzNwNFbkABJ+C7B
HNAytQ6h9cpUbg==
=6go3
-----END PGP PUBLIC KEY BLOCK-----
-51
View File
@@ -1,51 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2014 Alex Kost <alezost@gmail.com>
#
# This file is part of GNU Guix.
#
# GNU Guix is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or (at
# your option) any later version.
#
# GNU Guix is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
AUTOLOADS = emacs/guix-autoloads.el
ELFILES = \
emacs/guix-backend.el \
emacs/guix-base.el \
emacs/guix-emacs.el \
emacs/guix-history.el \
emacs/guix-info.el \
emacs/guix-list.el \
emacs/guix-messages.el \
emacs/guix-prettify.el \
emacs/guix-utils.el \
emacs/guix.el
if HAVE_EMACS
dist_lisp_DATA = \
$(ELFILES) \
$(AUTOLOADS)
nodist_lisp_DATA = \
emacs/guix-init.el \
emacs/guix-profiles.el
$(AUTOLOADS): $(ELFILES)
$(EMACS) --batch --eval \
"(let ((backup-inhibited t) \
(generated-autoload-file \
(expand-file-name \"$(AUTOLOADS)\" \"$(srcdir)\"))) \
(update-directory-autoloads \
(expand-file-name \"emacs\" \"$(srcdir)\")))"
endif HAVE_EMACS
-378
View File
@@ -1,378 +0,0 @@
;;; guix-backend.el --- Communication with Geiser
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides the code for interacting with Guile using Geiser.
;; By default (if `guix-use-guile-server' is non-nil) 2 Geiser REPLs are
;; started. The main one (with "guile --listen" process) is used for
;; "interacting" with a user - for showing a progress of
;; installing/deleting Guix packages. The second (internal) REPL is
;; used for synchronous evaluating, e.g. when information about
;; packages/generations should be received for a list/info buffer.
;;
;; This "2 REPLs concept" makes it possible to have a running process of
;; installing/deleting packages and to continue to search/list/get info
;; about other packages at the same time. If you prefer to use a single
;; Guix REPL, do not try to receive any information while there is a
;; running code in the REPL (see
;; <https://github.com/jaor/geiser/issues/28>).
;;
;; If you need to use "guix.el" in another Emacs (i.e. when there is
;; a runnig "guile --listen..." REPL somewhere), you can either change
;; `guix-default-port' in that Emacs instance or set
;; `guix-use-guile-server' to t.
;;
;; Guix REPLs (unlike the usual Geiser REPLs) are not added to
;; `geiser-repl--repls' variable, and thus cannot be used for evaluating
;; while editing scm-files. The only purpose of Guix REPLs is to be an
;; intermediate between "Guix/Guile level" and "Emacs interface level".
;; That being said you can still want to use a Guix REPL while hacking
;; auxiliary scheme-files for "guix.el". You can just use "M-x
;; connect-to-guile" (connect to "localhost" and `guix-default-port') to
;; have a usual Geiser REPL with all stuff defined by "guix.el" package.
;;; Code:
(require 'geiser-mode)
(require 'guix-emacs)
(defvar guix-load-path
(file-name-directory (or load-file-name
(locate-library "guix")))
"Directory with scheme files for \"guix.el\" package.")
(defvar guix-helper-file
(expand-file-name "guix-helper.scm" guix-load-path)
"Auxiliary scheme file for loading.")
(defvar guix-guile-program (or geiser-guile-binary "guile")
"Name of the guile executable used for Guix REPL.
May be either a string (the name of the executable) or a list of
strings of the form:
(NAME . ARGS)
Where ARGS is a list of arguments to the guile program.")
;;; REPL
(defgroup guix-repl nil
"Settings for Guix REPLs."
:prefix "guix-repl-"
:group 'guix)
(defcustom guix-repl-startup-time 30000
"Time, in milliseconds, to wait for Guix REPL to startup.
Same as `geiser-repl-startup-time' but is used for Guix REPL.
If you have a slow system, try to increase this time."
:type 'integer
:group 'guix-repl)
(defcustom guix-repl-buffer-name "*Guix REPL*"
"Default name of a Geiser REPL buffer used for Guix."
:type 'string
:group 'guix-repl)
(defcustom guix-after-start-repl-hook ()
"Hook called after Guix REPL is started."
:type 'hook
:group 'guix-repl)
(defcustom guix-use-guile-server t
"If non-nil, start guile with '--listen' argument.
This allows to receive information about packages using an additional
REPL while some packages are being installed/removed in the main REPL."
:type 'boolean
:group 'guix-repl)
(defcustom guix-default-port 37246
"Default port used if `guix-use-guile-server' is non-nil."
:type 'integer
:group 'guix-repl)
(defvar guix-repl-buffer nil
"Main Geiser REPL buffer used for communicating with Guix.
This REPL is used for processing package actions and for
receiving information if `guix-use-guile-server' is nil.")
(defvar guix-internal-repl-buffer nil
"Additional Geiser REPL buffer used for communicating with Guix.
This REPL is used for receiving information only if
`guix-use-guile-server' is non-nil.")
(defvar guix-internal-repl-buffer-name "*Guix Internal REPL*"
"Default name of an internal Guix REPL buffer.")
(defvar guix-before-repl-operation-hook nil
"Hook run before executing an operation in Guix REPL.")
(defvar guix-after-repl-operation-hook
'(guix-emacs-load-autoloads-maybe
guix-repl-operation-success-message)
"Hook run after executing successful operation in Guix REPL.")
(defvar guix-repl-operation-p nil
"Non-nil, if current operation is performed by `guix-eval-in-repl'.
This internal variable is used to distinguish Guix operations
from operations performed in Guix REPL by a user.")
(defvar guix-repl-operation-type nil
"Type of the current operation performed by `guix-eval-in-repl'.
This internal variable is used to define what actions should be
executed after the current operation succeeds.
See `guix-eval-in-repl' for details.")
(defun guix-repl-operation-success-message ()
"Message telling about successful Guix operation."
(message "Guix operation has been performed."))
(defun guix-get-guile-program (&optional internal)
"Return a value suitable for `geiser-guile-binary'."
(if (or internal
(not guix-use-guile-server))
guix-guile-program
(append (if (listp guix-guile-program)
guix-guile-program
(list guix-guile-program))
;; Guile understands "--listen=..." but not "--listen ..."
(list (concat "--listen="
(number-to-string guix-default-port))))))
(defun guix-start-process-maybe (&optional start-msg end-msg)
"Start Geiser REPL configured for Guix if needed.
START-MSG and END-MSG are strings displayed in the minibuffer in
the beginning and in the end of the starting process. If nil,
display default messages."
(guix-start-repl-maybe nil
(or start-msg "Starting Guix REPL ...")
(or end-msg "Guix REPL has been started."))
(if guix-use-guile-server
(guix-start-repl-maybe 'internal)
(setq guix-internal-repl-buffer guix-repl-buffer)))
(defun guix-start-repl-maybe (&optional internal start-msg end-msg)
"Start Guix REPL if needed.
If INTERNAL is non-nil, start an internal REPL.
START-MSG and END-MSG are strings displayed in the minibuffer in
the beginning and in the end of the process. If nil, do not
display messages."
(let* ((repl-var (guix-get-repl-buffer-variable internal))
(repl (symbol-value repl-var)))
(unless (and (buffer-live-p repl)
(get-buffer-process repl))
(and start-msg (message start-msg))
(setq guix-repl-operation-p nil)
(let ((geiser-guile-binary (guix-get-guile-program internal))
(geiser-guile-init-file (or internal guix-helper-file))
(repl (get-buffer-create
(guix-get-repl-buffer-name internal))))
(condition-case err
(guix-start-repl repl
(and internal
(geiser-repl--read-address
"localhost" guix-default-port)))
(text-read-only
(error (concat "Couldn't start Guix REPL. Perhaps the port %s is busy.\n"
"See buffer '%s' for details")
guix-default-port (buffer-name repl))))
(set repl-var repl)
(and end-msg (message end-msg))
(unless internal
(run-hooks 'guix-after-start-repl-hook))))))
(defun guix-start-repl (buffer &optional address)
"Start Guix REPL in BUFFER.
If ADDRESS is non-nil, connect to a remote guile process using
this address (it should be defined by
`geiser-repl--read-address')."
;; A mix of the code from `geiser-repl--start-repl' and
;; `geiser-repl--to-repl-buffer'.
(let ((impl 'guile)
(geiser-guile-load-path (cons guix-load-path
geiser-guile-load-path))
(geiser-repl-startup-time guix-repl-startup-time))
(with-current-buffer buffer
(geiser-repl-mode)
(geiser-impl--set-buffer-implementation impl)
(geiser-repl--autodoc-mode -1)
(goto-char (point-max))
(let ((prompt (geiser-con--combined-prompt
geiser-guile--prompt-regexp
geiser-guile--debugger-prompt-regexp)))
(geiser-repl--save-remote-data address)
(geiser-repl--start-scheme impl address prompt)
(geiser-repl--quit-setup)
(geiser-repl--history-setup)
(setq-local geiser-repl--repls (list buffer))
(geiser-repl--set-this-buffer-repl buffer)
(setq geiser-repl--connection
(geiser-con--make-connection
(get-buffer-process (current-buffer))
geiser-guile--prompt-regexp
geiser-guile--debugger-prompt-regexp))
(geiser-repl--startup impl address)
(geiser-repl--autodoc-mode 1)
(geiser-company--setup geiser-repl-company-p)
(add-hook 'comint-output-filter-functions
'guix-repl-output-filter
nil t)
(set-process-query-on-exit-flag
(get-buffer-process (current-buffer))
geiser-repl-query-on-kill-p)))))
(defun guix-repl-output-filter (str)
"Filter function suitable for `comint-output-filter-functions'.
This is a replacement for `geiser-repl--output-filter'."
(cond
((string-match-p geiser-guile--prompt-regexp str)
(geiser-autodoc--disinhibit-autodoc)
(when guix-repl-operation-p
(setq guix-repl-operation-p nil)
(run-hooks 'guix-after-repl-operation-hook)
;; Run hooks specific to the current operation type.
(when guix-repl-operation-type
(let ((type-hook (intern
(concat "guix-after-"
(symbol-name guix-repl-operation-type)
"-hook"))))
(setq guix-repl-operation-type nil)
(and (boundp type-hook)
(run-hooks type-hook))))))
((string-match geiser-guile--debugger-prompt-regexp str)
(setq guix-repl-operation-p nil)
(geiser-con--connection-set-debugging geiser-repl--connection
(match-beginning 0))
(geiser-autodoc--disinhibit-autodoc))))
(defun guix-repl-exit (&optional internal no-wait)
"Exit the current Guix REPL.
If INTERNAL is non-nil, exit the internal REPL.
If NO-WAIT is non-nil, do not wait for the REPL process to exit:
send a kill signal to it and return immediately."
(let ((repl (symbol-value (guix-get-repl-buffer-variable internal))))
(when (get-buffer-process repl)
(with-current-buffer repl
(geiser-con--connection-deactivate geiser-repl--connection t)
(comint-kill-subjob)
(unless no-wait
(while (get-buffer-process repl)
(sleep-for 0.1)))))))
(defun guix-get-repl-buffer (&optional internal)
"Return Guix REPL buffer; start REPL if needed.
If INTERNAL is non-nil, return an additional internal REPL."
(guix-start-process-maybe)
(let ((repl (symbol-value (guix-get-repl-buffer-variable internal))))
;; If a new Geiser REPL is started, `geiser-repl--repl' variable may
;; be set to the new value in a Guix REPL, so set it back to a
;; proper value here.
(with-current-buffer repl
(geiser-repl--set-this-buffer-repl repl))
repl))
(defun guix-get-repl-buffer-variable (&optional internal)
"Return the name of a variable with a REPL buffer."
(if internal
'guix-internal-repl-buffer
'guix-repl-buffer))
(defun guix-get-repl-buffer-name (&optional internal)
"Return the name of a REPL buffer."
(if internal
guix-internal-repl-buffer-name
guix-repl-buffer-name))
(defun guix-switch-to-repl (&optional internal)
"Switch to Guix REPL.
If INTERNAL is non-nil (interactively with prefix), switch to the
additional internal REPL if it exists."
(interactive "P")
(geiser-repl--switch-to-buffer (guix-get-repl-buffer internal)))
;;; Evaluating expressions
(defvar guix-operation-buffer nil
"Buffer from which the latest Guix operation was performed.")
(defun guix-make-guile-expression (fun &rest args)
"Return string containing a guile expression for calling FUN with ARGS."
(format "(%S %s)" fun
(mapconcat
(lambda (arg)
(cond
((null arg) "'()")
((or (eq arg t)
;; An ugly hack to separate 'false' from nil
(equal arg 'f)
(keywordp arg))
(concat "#" (prin1-to-string arg t)))
((or (symbolp arg) (listp arg))
(concat "'" (prin1-to-string arg)))
(t (prin1-to-string arg))))
args
" ")))
(defun guix-eval (str &optional wrap)
"Evaluate guile expression STR.
If WRAP is non-nil, wrap STR into (begin ...) form.
Return a list of strings with result values of evaluation."
(with-current-buffer (guix-get-repl-buffer 'internal)
(let* ((wrapped (if wrap (geiser-debug--wrap-region str) str))
(code `(:eval (:scm ,wrapped)))
(ret (geiser-eval--send/wait code)))
(if (geiser-eval--retort-error ret)
(error "Error in evaluating guile expression: %s"
(geiser-eval--retort-output ret))
(cdr (assq 'result ret))))))
(defun guix-eval-read (str &optional wrap)
"Evaluate guile expression STR.
For the meaning of WRAP, see `guix-eval'.
Return elisp expression of the first result value of evaluation."
;; Parsing scheme code with elisp `read' is probably not the best idea.
(read (replace-regexp-in-string
"#f\\|#<unspecified>" "nil"
(replace-regexp-in-string
"#t" "t" (car (guix-eval str wrap))))))
(defun guix-eval-in-repl (str &optional operation-buffer operation-type)
"Switch to Guix REPL and evaluate STR with guile expression there.
If OPERATION-BUFFER is non-nil, it should be a buffer from which
the current operation was performed.
If OPERATION-TYPE is non-nil, it should be a symbol. After
successful executing of the current operation,
`guix-after-OPERATION-TYPE-hook' is called."
(run-hooks 'guix-before-repl-operation-hook)
(setq guix-repl-operation-p t
guix-repl-operation-type operation-type
guix-operation-buffer operation-buffer)
(let ((repl (guix-get-repl-buffer)))
(with-current-buffer repl
(geiser-repl--send str))
(geiser-repl--switch-to-buffer repl)))
(provide 'guix-backend)
;;; guix-backend.el ends here
-1066
View File
File diff suppressed because it is too large Load Diff
-79
View File
@@ -1,79 +0,0 @@
;;; guix-emacs.el --- Emacs packages installed with Guix
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides auxiliary code for working with Emacs packages
;; installed with Guix.
;;; Code:
(require 'guix-profiles)
(defcustom guix-emacs-activate-after-operation t
"Activate Emacs packages after installing.
If nil, do not load autoloads of the Emacs packages after
they are successfully installed."
:type 'boolean
:group 'guix)
(defvar guix-emacs-autoloads nil
"List of the last loaded Emacs autoloads.")
(defun guix-emacs-directory (&optional profile)
"Return directory with Emacs packages installed in PROFILE.
If PROFILE is nil, use `guix-user-profile'."
(expand-file-name "share/emacs/site-lisp"
(or profile guix-user-profile)))
(defun guix-emacs-find-autoloads (&optional profile)
"Return list of autoloads of Emacs packages installed in PROFILE.
If PROFILE is nil, use `guix-user-profile'.
Return nil if there are no emacs packages installed in PROFILE."
(let ((dir (guix-emacs-directory profile)))
(if (file-directory-p dir)
(directory-files dir 'full-name "-autoloads\\.el\\'")
(message "Directory '%s' does not exist." dir)
nil)))
;;;###autoload
(defun guix-emacs-load-autoloads (&optional all)
"Load autoloads for Emacs packages installed in a user profile.
If ALL is nil, activate only those packages that were installed
after the last activation, otherwise activate all Emacs packages
installed in `guix-user-profile'."
(interactive "P")
(let* ((autoloads (guix-emacs-find-autoloads))
(files (if all
autoloads
(cl-nset-difference autoloads guix-emacs-autoloads
:test #'string=))))
(dolist (file files)
(load file 'noerror))
(setq guix-emacs-autoloads autoloads)))
(defun guix-emacs-load-autoloads-maybe ()
"Load autoloads for Emacs packages if needed.
See `guix-emacs-activate-after-operation' for details."
(and guix-emacs-activate-after-operation
(guix-emacs-load-autoloads)))
(provide 'guix-emacs)
;;; guix-emacs.el ends here
-65
View File
@@ -1,65 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This is an auxiliary file for the Emacs UI. It is used to add Guix
;; directories to path variables and to load the main code.
;;; Code:
(use-modules (ice-9 regex)
(srfi srfi-26))
(define %guix-dir)
;; The code is taken from guix executable script
(define (set-paths!)
(define-syntax-rule (push! elt v) (set! v (cons elt v)))
(define config-lookup
(let ((config '(("prefix" . "@prefix@")
("guilemoduledir" . "@guilemoduledir@")))
(var-ref-regexp (make-regexp "\\$\\{([a-z]+)\\}")))
(define (expand-var-ref match)
(lookup (match:substring match 1)))
(define (expand str)
(regexp-substitute/global #f var-ref-regexp str
'pre expand-var-ref 'post))
(define (lookup name)
(expand (assoc-ref config name)))
lookup))
(let ((module-dir (config-lookup "guilemoduledir"))
(updates-dir (and=> (or (getenv "XDG_CONFIG_HOME")
(and=> (getenv "HOME")
(cut string-append <> "/.config")))
(cut string-append <> "/guix/latest"))))
(push! module-dir %load-path)
(push! module-dir %load-compiled-path)
(if (and updates-dir (file-exists? updates-dir))
(begin
(set! %guix-dir updates-dir)
(push! updates-dir %load-path)
(push! updates-dir %load-compiled-path))
(set! %guix-dir module-dir))))
(set-paths!)
(load-from-path "guix-main")
-92
View File
@@ -1,92 +0,0 @@
;;; guix-history.el --- History of buffer information
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides support for history of buffers similar to the
;; history of a `help-mode' buffer.
;;; Code:
(require 'cl-macs)
(defvar-local guix-history-stack-item nil
"Current item of the history.
A list of the form (FUNCTION [ARGS ...]).
The item is used by calling (apply FUNCTION ARGS).")
(put 'guix-history-stack-item 'permanent-local t)
(defvar-local guix-history-back-stack nil
"Stack (list) of visited items.
Each element of the list has a form of `guix-history-stack-item'.")
(put 'guix-history-back-stack 'permanent-local t)
(defvar-local guix-history-forward-stack nil
"Stack (list) of items visited with `guix-history-back'.
Each element of the list has a form of `guix-history-stack-item'.")
(put 'guix-history-forward-stack 'permanent-local t)
(defvar guix-history-size 0
"Maximum number of items saved in history.
If 0, the history is disabled.")
(defun guix-history-add (item)
"Add ITEM to history."
(and guix-history-stack-item
(push guix-history-stack-item guix-history-back-stack))
(setq guix-history-forward-stack nil
guix-history-stack-item item)
(when (>= (length guix-history-back-stack)
guix-history-size)
(setq guix-history-back-stack
(cl-loop for elt in guix-history-back-stack
for i from 1 to guix-history-size
collect elt))))
(defun guix-history-replace (item)
"Replace current item in history with ITEM."
(setq guix-history-stack-item item))
(defun guix-history-goto (item)
"Go to the ITEM of history.
ITEM should have the form of `guix-history-stack-item'."
(or (listp item)
(error "Wrong value of history element"))
(setq guix-history-stack-item item)
(apply (car item) (cdr item)))
(defun guix-history-back ()
"Go back to the previous element of history in the current buffer."
(interactive)
(or guix-history-back-stack
(user-error "No previous element in history"))
(push guix-history-stack-item guix-history-forward-stack)
(guix-history-goto (pop guix-history-back-stack)))
(defun guix-history-forward ()
"Go forward to the next element of history in the current buffer."
(interactive)
(or guix-history-forward-stack
(user-error "No next element in history"))
(push guix-history-stack-item guix-history-back-stack)
(guix-history-goto (pop guix-history-forward-stack)))
(provide 'guix-history)
;;; guix-history.el ends here
-870
View File
@@ -1,870 +0,0 @@
;;; guix-info.el --- Info buffers for displaying entries -*- lexical-binding: t -*-
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides a help-like buffer for displaying information
;; about Guix packages and generations.
;;; Code:
(require 'guix-base)
(require 'guix-utils)
(defgroup guix-info nil
"General settings for info buffers."
:prefix "guix-info-"
:group 'guix)
(defface guix-info-param-title
'((t :inherit font-lock-type-face))
"Face used for titles of parameters."
:group 'guix-info)
(defface guix-info-file-path
'((t :inherit link))
"Face used for file paths."
:group 'guix-info)
(defface guix-info-url
'((t :inherit link))
"Face used for URLs."
:group 'guix-info)
(defface guix-info-time
'((t :inherit font-lock-constant-face))
"Face used for timestamps."
:group 'guix-info)
(defface guix-info-action-button
'((((type x w32 ns) (class color))
:box (:line-width 2 :style released-button)
:background "lightgrey" :foreground "black")
(t :inherit button))
"Face used for action buttons."
:group 'guix-info)
(defface guix-info-action-button-mouse
'((((type x w32 ns) (class color))
:box (:line-width 2 :style released-button)
:background "grey90" :foreground "black")
(t :inherit highlight))
"Mouse face used for action buttons."
:group 'guix-info)
(defcustom guix-info-ignore-empty-vals nil
"If non-nil, do not display parameters with nil values."
:type 'boolean
:group 'guix-info)
(defvar guix-info-param-title-format "%-18s: "
"String used to format a title of a parameter.
It should be a '%s'-sequence. After inserting a title formatted
with this string, a value of the parameter is inserted.
This string is used by `guix-info-insert-title-default'.")
(defvar guix-info-multiline-prefix (make-string 20 ?\s)
"String used to format multi-line parameter values.
If a value occupies more than one line, this string is inserted
in the beginning of each line after the first one.
This string is used by `guix-info-insert-val-default'.")
(defvar guix-info-indent 2
"Number of spaces used to indent various parts of inserted text.")
(defvar guix-info-fill-column 60
"Column used for filling (word wrapping) parameters with long lines.
If a value is not multi-line and it occupies more than this
number of characters, it will be split into several lines.")
(defvar guix-info-delimiter "\n\f\n"
"String used to separate entries.")
(defvar guix-info-insert-methods
'((package
(name guix-package-info-name)
(version guix-package-info-version)
(license guix-package-info-license)
(synopsis guix-package-info-synopsis)
(description guix-package-info-insert-description
guix-info-insert-title-simple)
(outputs guix-package-info-insert-outputs
guix-info-insert-title-simple)
(source guix-package-info-insert-source
guix-info-insert-title-simple)
(home-url guix-info-insert-url)
(inputs guix-package-info-insert-inputs)
(native-inputs guix-package-info-insert-native-inputs)
(propagated-inputs guix-package-info-insert-propagated-inputs)
(location guix-package-info-insert-location))
(installed
(path guix-package-info-insert-output-path
guix-info-insert-title-simple)
(dependencies guix-package-info-insert-output-dependencies
guix-info-insert-title-simple))
(output
(name guix-package-info-name)
(version guix-output-info-insert-version)
(output guix-output-info-insert-output)
(source guix-package-info-insert-source
guix-info-insert-title-simple)
(path guix-package-info-insert-output-path
guix-info-insert-title-simple)
(dependencies guix-package-info-insert-output-dependencies
guix-info-insert-title-simple)
(license guix-package-info-license)
(synopsis guix-package-info-synopsis)
(description guix-package-info-insert-description
guix-info-insert-title-simple)
(home-url guix-info-insert-url)
(inputs guix-package-info-insert-inputs)
(native-inputs guix-package-info-insert-native-inputs)
(propagated-inputs guix-package-info-insert-propagated-inputs)
(location guix-package-info-insert-location))
(generation
(number guix-generation-info-insert-number)
(current guix-generation-info-insert-current)
(path guix-info-insert-file-path)
(time guix-info-insert-time)))
"Methods for inserting parameter values.
Each element of the list should have a form:
(ENTRY-TYPE . ((PARAM INSERT-VALUE [INSERT-TITLE]) ...))
INSERT-VALUE may be either nil, a face name or a function. If it
is nil or a face, `guix-info-insert-val-default' function is
called with parameter value and INSERT-VALUE as arguments. If it
is a function, this function is called with parameter value and
entry info (alist of parameters and their values) as arguments.
INSERT-TITLE may be either nil, a face name or a function. If it
is nil or a face, `guix-info-insert-title-default' function is
called with parameter title and INSERT-TITLE as arguments. If it
is a function, this function is called with parameter title as
argument.")
(defvar guix-info-displayed-params
'((package name version synopsis outputs source location home-url
license inputs native-inputs propagated-inputs description)
(output name version output synopsis source path dependencies location
home-url license inputs native-inputs propagated-inputs
description)
(installed path dependencies)
(generation number prev-number current time path))
"List of displayed entry parameters.
Each element of the list should have a form:
(ENTRY-TYPE . (PARAM ...))
The order of displayed parameters is the same as in this list.")
(defun guix-info-get-insert-methods (entry-type param)
"Return list of insert methods for parameter PARAM of ENTRY-TYPE.
See `guix-info-insert-methods' for details."
(guix-get-key-val guix-info-insert-methods
entry-type param))
(defun guix-info-get-displayed-params (entry-type)
"Return parameters of ENTRY-TYPE that should be displayed."
(guix-get-key-val guix-info-displayed-params
entry-type))
(defun guix-info-get-indent (&optional level)
"Return `guix-info-indent' \"multiplied\" by LEVEL spaces.
LEVEL is 1 by default."
(make-string (* guix-info-indent (or level 1)) ?\s))
(defun guix-info-insert-indent (&optional level)
"Insert `guix-info-indent' spaces LEVEL times (1 by default)."
(insert (guix-info-get-indent level)))
(defun guix-info-insert-entries (entries entry-type)
"Display ENTRIES of ENTRY-TYPE in the current info buffer.
ENTRIES should have a form of `guix-entries'."
(guix-mapinsert (lambda (entry)
(guix-info-insert-entry entry entry-type))
entries
guix-info-delimiter))
(defun guix-info-insert-entry-default (entry entry-type
&optional indent-level)
"Insert ENTRY of ENTRY-TYPE into the current info buffer.
If INDENT-LEVEL is non-nil, indent displayed information by this
number of `guix-info-indent' spaces."
(let ((region-beg (point)))
(mapc (lambda (param)
(guix-info-insert-param param entry entry-type))
(guix-info-get-displayed-params entry-type))
(when indent-level
(indent-rigidly region-beg (point)
(* indent-level guix-info-indent)))))
(defun guix-info-insert-entry (entry entry-type &optional indent-level)
"Insert ENTRY of ENTRY-TYPE into the current info buffer.
Use `guix-info-insert-ENTRY-TYPE-function' or
`guix-info-insert-entry-default' if it is nil."
(let* ((var (intern (concat "guix-info-insert-"
(symbol-name entry-type)
"-function")))
(fun (symbol-value var)))
(if (functionp fun)
(funcall fun entry)
(guix-info-insert-entry-default entry entry-type indent-level))))
(defun guix-info-insert-param (param entry entry-type)
"Insert title and value of a PARAM at point.
ENTRY is alist with parameters and their values.
ENTRY-TYPE is a type of ENTRY."
(let ((val (guix-get-key-val entry param)))
(unless (and guix-info-ignore-empty-vals (null val))
(let* ((title (guix-get-param-title entry-type param))
(insert-methods (guix-info-get-insert-methods entry-type param))
(val-method (car insert-methods))
(title-method (cadr insert-methods)))
(guix-info-method-funcall title title-method
#'guix-info-insert-title-default)
(guix-info-method-funcall val val-method
#'guix-info-insert-val-default
entry)
(insert "\n")))))
(defun guix-info-method-funcall (val method default-fun &rest args)
"Call METHOD or DEFAULT-FUN.
If METHOD is a function and VAL is non-nil, call this
function by applying it to VAL and ARGS.
If METHOD is a face, propertize inserted VAL with this face."
(cond ((or (null method)
(facep method))
(funcall default-fun val method))
((functionp method)
(apply method val args))
(t (error "Unknown method '%S'" method))))
(defun guix-info-insert-title-default (title &optional face format)
"Insert TITLE formatted with `guix-info-param-title-format' at point."
(guix-format-insert title
(or face 'guix-info-param-title)
(or format guix-info-param-title-format)))
(defun guix-info-insert-title-simple (title &optional face)
"Insert TITLE at point."
(guix-info-insert-title-default title face "%s:"))
(defun guix-info-insert-val-default (val &optional face)
"Format and insert parameter value VAL at point.
This function is intended to be called after
`guix-info-insert-title-default'.
If VAL is a one-line string longer than `guix-info-fill-column',
split it into several short lines. See also
`guix-info-multiline-prefix'.
If FACE is non-nil, propertize inserted line(s) with this FACE."
(guix-split-insert val face
guix-info-fill-column
(concat "\n" guix-info-multiline-prefix)))
(defun guix-info-insert-val-simple (val &optional face-or-fun)
"Format and insert parameter value VAL at point.
This function is intended to be called after
`guix-info-insert-title-simple'.
If VAL is a one-line string longer than `guix-info-fill-column',
split it into several short lines and indent each line with
`guix-info-indent' spaces.
If FACE-OR-FUN is a face, propertize inserted line(s) with this FACE.
If FACE-OR-FUN is a function, call it with VAL as argument. If
VAL is a list, call the function on each element of this list."
(if (null val)
(progn (guix-info-insert-indent)
(guix-format-insert nil))
(let ((prefix (concat "\n" (guix-info-get-indent))))
(insert prefix)
(if (functionp face-or-fun)
(guix-mapinsert face-or-fun
(if (listp val) val (list val))
prefix)
(guix-split-insert val face-or-fun
guix-info-fill-column prefix)))))
(defun guix-info-insert-time (seconds &optional _)
"Insert formatted time string using SECONDS at point."
(guix-info-insert-val-default (guix-get-time-string seconds)
'guix-info-time))
;;; Buttons
(defvar guix-info-button-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map button-map)
(define-key map (kbd "c") 'guix-info-button-copy-label)
map)
"Keymap for buttons in info buffers.")
(define-button-type 'guix
'keymap guix-info-button-map
'follow-link t)
(define-button-type 'guix-action
:supertype 'guix
'face 'guix-info-action-button
'mouse-face 'guix-info-action-button-mouse)
(define-button-type 'guix-file
:supertype 'guix
'face 'guix-info-file-path
'help-echo "Find file"
'action (lambda (btn)
(guix-find-file (button-label btn))))
(define-button-type 'guix-url
:supertype 'guix
'face 'guix-info-url
'help-echo "Browse URL"
'action (lambda (btn)
(browse-url (button-label btn))))
(define-button-type 'guix-package-location
:supertype 'guix
'face 'guix-package-info-location
'help-echo "Find location of this package"
'action (lambda (btn)
(guix-find-location (button-label btn))))
(define-button-type 'guix-package-name
:supertype 'guix
'face 'guix-package-info-name-button
'help-echo "Describe this package"
'action (lambda (btn)
(guix-get-show-entries guix-profile 'info guix-package-info-type
'name (button-label btn))))
(defun guix-info-button-copy-label (&optional pos)
"Copy a label of the button at POS into kill ring.
If POS is nil, use the current point position."
(interactive)
(let ((button (button-at (or pos (point)))))
(when button
(kill-new (button-label button)))))
(defun guix-info-insert-action-button (label action &optional message
&rest properties)
"Make action button with LABEL and insert it at point.
ACTION is a function called when the button is pressed. It
should accept button as the argument.
MESSAGE is a button message.
See `insert-text-button' for the meaning of PROPERTIES."
(apply #'guix-insert-button
label 'guix-action
'action action
'help-echo message
properties))
(defun guix-info-insert-file-path (path &optional _)
"Make button from file PATH and insert it at point."
(guix-insert-button path 'guix-file))
(defun guix-info-insert-url (url &optional _)
"Make button from URL and insert it at point."
(guix-insert-button url 'guix-url))
(defvar guix-info-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent
map (make-composed-keymap button-buffer-map
special-mode-map))
map)
"Parent keymap for info buffers.")
(define-derived-mode guix-info-mode special-mode "Guix-Info"
"Parent mode for displaying information in info buffers.")
;;; Displaying packages
(guix-define-buffer-type info package
:required (id installed non-unique))
(defface guix-package-info-heading
'((((type tty pc) (class color)) :weight bold)
(t :height 1.6 :weight bold :inherit variable-pitch))
"Face for package name and version headings."
:group 'guix-package-info)
(defface guix-package-info-name
'((t :inherit font-lock-keyword-face))
"Face used for a name of a package."
:group 'guix-package-info)
(defface guix-package-info-name-button
'((t :inherit button))
"Face used for a full name that can be used to describe a package."
:group 'guix-package-info)
(defface guix-package-info-version
'((t :inherit font-lock-builtin-face))
"Face used for a version of a package."
:group 'guix-package-info)
(defface guix-package-info-synopsis
'((((type tty pc) (class color)) :weight bold)
(t :height 1.1 :weight bold :inherit variable-pitch))
"Face used for a synopsis of a package."
:group 'guix-package-info)
(defface guix-package-info-description
'((t))
"Face used for a description of a package."
:group 'guix-package-info)
(defface guix-package-info-license
'((t :inherit font-lock-string-face))
"Face used for a license of a package."
:group 'guix-package-info)
(defface guix-package-info-location
'((t :inherit link))
"Face used for a location of a package."
:group 'guix-package-info)
(defface guix-package-info-installed-outputs
'((default :weight bold)
(((class color) (min-colors 88) (background light))
:foreground "ForestGreen")
(((class color) (min-colors 88) (background dark))
:foreground "PaleGreen")
(((class color) (min-colors 8))
:foreground "green")
(t :underline t))
"Face used for installed outputs of a package."
:group 'guix-package-info)
(defface guix-package-info-uninstalled-outputs
'((t :weight bold))
"Face used for uninstalled outputs of a package."
:group 'guix-package-info)
(defface guix-package-info-obsolete
'((t :inherit error))
"Face used if a package is obsolete."
:group 'guix-package-info)
(defvar guix-info-insert-package-function
#'guix-package-info-insert-with-heading
"Function used to insert a package information.
It is called with a single argument - alist of package parameters.
If nil, insert package in a default way.")
(defvar guix-package-info-heading-params '(synopsis description)
"List of parameters displayed in a heading along with name and version.")
(defun guix-package-info-insert-heading (entry)
"Insert the heading for package ENTRY.
Show package name, version, and `guix-package-info-heading-params'."
(guix-format-insert (concat (guix-get-key-val entry 'name) " "
(guix-get-key-val entry 'version))
'guix-package-info-heading)
(insert "\n\n")
(mapc (lambda (param)
(let ((val (guix-get-key-val entry param))
(face (guix-get-symbol (symbol-name param)
'info 'package)))
(when val
(guix-format-insert val (and (facep face) face))
(insert "\n\n"))))
guix-package-info-heading-params))
(defun guix-package-info-insert-with-heading (entry)
"Insert package ENTRY with its heading at point."
(guix-package-info-insert-heading entry)
(mapc (lambda (param)
(unless (or (memq param '(name version))
(memq param guix-package-info-heading-params))
(guix-info-insert-param param entry 'package)))
(guix-info-get-displayed-params 'package)))
(defun guix-package-info-insert-description (desc &optional _)
"Insert description DESC at point."
(guix-info-insert-val-simple desc 'guix-package-info-description))
(defun guix-package-info-insert-location (location &optional _)
"Make button from file LOCATION and insert it at point."
(guix-insert-button location 'guix-package-location))
(defmacro guix-package-info-define-insert-inputs (&optional type)
"Define a face and a function for inserting package inputs.
TYPE is a type of inputs.
Function name is `guix-package-info-insert-TYPE-inputs'.
Face name is `guix-package-info-TYPE-inputs'."
(let* ((type-str (symbol-name type))
(type-name (and type (concat type-str "-")))
(type-desc (and type (concat type-str " ")))
(face (intern (concat "guix-package-info-" type-name "inputs")))
(btn (intern (concat "guix-package-" type-name "input")))
(fun (intern (concat "guix-package-info-insert-" type-name "inputs"))))
`(progn
(defface ,face
'((t :inherit guix-package-info-name-button))
,(concat "Face used for " type-desc "inputs of a package.")
:group 'guix-package-info)
(define-button-type ',btn
:supertype 'guix-package-name
'face ',face)
(defun ,fun (inputs &optional _)
,(concat "Make buttons from " type-desc "INPUTS and insert them at point.")
(guix-package-info-insert-full-names inputs ',btn)))))
(guix-package-info-define-insert-inputs)
(guix-package-info-define-insert-inputs native)
(guix-package-info-define-insert-inputs propagated)
(defun guix-package-info-insert-full-names (names button-type)
"Make BUTTON-TYPE buttons from package NAMES and insert them at point.
NAMES is a list of strings."
(if names
(guix-info-insert-val-default
(with-temp-buffer
(guix-mapinsert (lambda (name)
(guix-insert-button name button-type))
names
guix-list-separator)
(buffer-substring (point-min) (point-max))))
(guix-format-insert nil)))
;;; Inserting outputs and installed parameters
(defvar guix-package-info-output-format "%-10s"
"String used to format output names of the packages.
It should be a '%s'-sequence. After inserting an output name
formatted with this string, an action button is inserted.")
(defvar guix-package-info-obsolete-string "(This package is obsolete)"
"String used if a package is obsolete.")
(defvar guix-info-insert-installed-function nil
"Function used to insert an installed information.
It is called with a single argument - alist of installed
parameters (`output', `path', `dependencies').
If nil, insert installed info in a default way.")
(defun guix-package-info-insert-outputs (outputs entry)
"Insert OUTPUTS from package ENTRY at point."
(and (guix-get-key-val entry 'obsolete)
(guix-package-info-insert-obsolete-text))
(and (guix-get-key-val entry 'non-unique)
(guix-get-key-val entry 'installed)
(guix-package-info-insert-non-unique-text
(guix-get-full-name entry)))
(insert "\n")
(mapc (lambda (output)
(guix-package-info-insert-output output entry))
outputs))
(defun guix-package-info-insert-obsolete-text ()
"Insert a message about obsolete package at point."
(guix-info-insert-indent)
(guix-format-insert guix-package-info-obsolete-string
'guix-package-info-obsolete))
(defun guix-package-info-insert-non-unique-text (full-name)
"Insert a message about non-unique package with FULL-NAME at point."
(insert "\n")
(guix-info-insert-indent)
(insert "Installed outputs are displayed for a non-unique ")
(guix-insert-button full-name 'guix-package-name)
(insert " package."))
(defun guix-package-info-insert-output (output entry)
"Insert OUTPUT at point.
Make some fancy text with buttons and additional stuff if the
current OUTPUT is installed (if there is such output in
`installed' parameter of a package ENTRY)."
(let* ((installed (guix-get-key-val entry 'installed))
(obsolete (guix-get-key-val entry 'obsolete))
(installed-entry (cl-find-if
(lambda (entry)
(string= (guix-get-key-val entry 'output)
output))
installed))
(action-type (if installed-entry 'delete 'install)))
(guix-info-insert-indent)
(guix-format-insert output
(if installed-entry
'guix-package-info-installed-outputs
'guix-package-info-uninstalled-outputs)
guix-package-info-output-format)
(guix-package-info-insert-action-button action-type entry output)
(when obsolete
(guix-info-insert-indent)
(guix-package-info-insert-action-button 'upgrade entry output))
(insert "\n")
(when installed-entry
(guix-info-insert-entry installed-entry 'installed 2))))
(defun guix-package-info-insert-action-button (type entry output)
"Insert button to process an action on a package OUTPUT at point.
TYPE is one of the following symbols: `install', `delete', `upgrade'.
ENTRY is an alist with package info."
(let ((type-str (capitalize (symbol-name type)))
(full-name (guix-get-full-name entry output)))
(guix-info-insert-action-button
type-str
(lambda (btn)
(guix-process-package-actions
guix-profile
`((,(button-get btn 'action-type) (,(button-get btn 'id)
,(button-get btn 'output))))
(current-buffer)))
(concat type-str " '" full-name "'")
'action-type type
'id (or (guix-get-key-val entry 'package-id)
(guix-get-key-val entry 'id))
'output output)))
(defun guix-package-info-insert-output-path (path &optional _)
"Insert PATH of the installed output."
(guix-info-insert-val-simple path #'guix-info-insert-file-path))
(defalias 'guix-package-info-insert-output-dependencies
'guix-package-info-insert-output-path)
;;; Inserting a source
(defface guix-package-info-source
'((t :inherit link :underline nil))
"Face used for a source URL of a package."
:group 'guix-package-info)
(defcustom guix-package-info-auto-find-source nil
"If non-nil, find a source file after pressing a \"Show\" button.
If nil, just display the source file path without finding."
:type 'boolean
:group 'guix-package-info)
(defcustom guix-package-info-auto-download-source t
"If nil, do not automatically download a source file if it doesn't exist.
After pressing a \"Show\" button, a derivation of the package
source is calculated and a store file path is displayed. If this
variable is non-nil and the source file does not exist in the
store, it will be automatically downloaded (with a possible
prompt depending on `guix-operation-confirm' variable)."
:type 'boolean
:group 'guix-package-info)
(defvar guix-package-info-download-buffer nil
"Buffer from which a current download operation was performed.")
(define-button-type 'guix-package-source
:supertype 'guix
'face 'guix-package-info-source
'help-echo ""
'action (lambda (_)
;; As a source may not be a real URL (e.g., "mirror://..."),
;; no action is bound to a source button.
(message "Yes, this is the source URL. What did you expect?")))
(defun guix-package-info-insert-source-url (url &optional _)
"Make button from source URL and insert it at point."
(guix-insert-button url 'guix-package-source))
(defun guix-package-info-show-source (entry-id package-id)
"Show file name of a package source in the current info buffer.
Find the file if needed (see `guix-package-info-auto-find-source').
ENTRY-ID is an ID of the current entry (package or output).
PACKAGE-ID is an ID of the package which source to show."
(let* ((entry (guix-get-entry-by-id entry-id guix-entries))
(file (guix-package-source-path package-id)))
(or file
(error "Couldn't define file path of the package source"))
(let* ((new-entry (cons (cons 'source-file file)
entry))
(entries (cl-substitute-if
new-entry
(lambda (entry)
(equal (guix-get-key-val entry 'id)
entry-id))
guix-entries
:count 1)))
(guix-redisplay-buffer :entries entries)
(if (file-exists-p file)
(if guix-package-info-auto-find-source
(guix-find-file file)
(message "The source store path is displayed."))
(if guix-package-info-auto-download-source
(guix-package-info-download-source package-id)
(message "The source does not exist in the store."))))))
(defun guix-package-info-download-source (package-id)
"Download a source of the package PACKAGE-ID."
(setq guix-package-info-download-buffer (current-buffer))
(guix-package-source-build-derivation
package-id
"The source does not exist in the store. Download it?"))
(defun guix-package-info-insert-source (source entry)
"Insert SOURCE from package ENTRY at point.
SOURCE is a list of URLs."
(guix-info-insert-indent)
(if (null source)
(guix-format-insert nil)
(let* ((source-file (guix-get-key-val entry 'source-file))
(entry-id (guix-get-key-val entry 'id))
(package-id (or (guix-get-key-val entry 'package-id)
entry-id)))
(if (null source-file)
(guix-info-insert-action-button
"Show"
(lambda (btn)
(guix-package-info-show-source (button-get btn 'entry-id)
(button-get btn 'package-id)))
"Show the source store path of the current package"
'entry-id entry-id
'package-id package-id)
(unless (file-exists-p source-file)
(guix-info-insert-action-button
"Download"
(lambda (btn)
(guix-package-info-download-source
(button-get btn 'package-id)))
"Download the source into the store"
'package-id package-id))
(guix-info-insert-val-simple source-file
#'guix-info-insert-file-path))
(guix-info-insert-val-simple source
#'guix-package-info-insert-source-url))))
(defun guix-package-info-redisplay-after-download ()
"Redisplay an 'info' buffer after downloading the package source.
This function is used to hide a \"Download\" button if needed."
(when (buffer-live-p guix-package-info-download-buffer)
(guix-redisplay-buffer :buffer guix-package-info-download-buffer)
(setq guix-package-info-download-buffer nil)))
(add-hook 'guix-after-source-download-hook
'guix-package-info-redisplay-after-download)
;;; Displaying outputs
(guix-define-buffer-type info output
:buffer-name "*Guix Package Info*"
:required (id package-id installed non-unique))
(defvar guix-info-insert-output-function nil
"Function used to insert an output information.
It is called with a single argument - alist of output parameters.
If nil, insert output in a default way.")
(defun guix-output-info-insert-version (version entry)
"Insert output VERSION and obsolete text if needed at point."
(guix-info-insert-val-default version
'guix-package-info-version)
(and (guix-get-key-val entry 'obsolete)
(guix-package-info-insert-obsolete-text)))
(defun guix-output-info-insert-output (output entry)
"Insert OUTPUT and action buttons at point."
(let* ((installed (guix-get-key-val entry 'installed))
(obsolete (guix-get-key-val entry 'obsolete))
(action-type (if installed 'delete 'install)))
(guix-info-insert-val-default
output
(if installed
'guix-package-info-installed-outputs
'guix-package-info-uninstalled-outputs))
(guix-info-insert-indent)
(guix-package-info-insert-action-button action-type entry output)
(when obsolete
(guix-info-insert-indent)
(guix-package-info-insert-action-button 'upgrade entry output))))
;;; Displaying generations
(guix-define-buffer-type info generation)
(defface guix-generation-info-number
'((t :inherit font-lock-keyword-face))
"Face used for a number of a generation."
:group 'guix-generation-info)
(defface guix-generation-info-current
'((t :inherit guix-package-info-installed-outputs))
"Face used if a generation is the current one."
:group 'guix-generation-info)
(defface guix-generation-info-not-current
'((t nil))
"Face used if a generation is not the current one."
:group 'guix-generation-info)
(defvar guix-info-insert-generation-function nil
"Function used to insert a generation information.
It is called with a single argument - alist of generation parameters.
If nil, insert generation in a default way.")
(defun guix-generation-info-insert-number (number &optional _)
"Insert generation NUMBER and action buttons."
(guix-info-insert-val-default number 'guix-generation-info-number)
(guix-info-insert-indent)
(guix-info-insert-action-button
"Packages"
(lambda (btn)
(guix-get-show-entries guix-profile 'list guix-package-list-type
'generation (button-get btn 'number)))
"Show installed packages for this generation"
'number number)
(guix-info-insert-indent)
(guix-info-insert-action-button
"Delete"
(lambda (btn)
(guix-delete-generations guix-profile (list (button-get btn 'number))
(current-buffer)))
"Delete this generation"
'number number))
(defun guix-generation-info-insert-current (val entry)
"Insert boolean value VAL showing whether this generation is current."
(if val
(guix-info-insert-val-default "Yes" 'guix-generation-info-current)
(guix-info-insert-val-default "No" 'guix-generation-info-not-current)
(guix-info-insert-indent)
(guix-info-insert-action-button
"Switch"
(lambda (btn)
(guix-switch-to-generation guix-profile (button-get btn 'number)
(current-buffer)))
"Switch to this generation (make it the current one)"
'number (guix-get-key-val entry 'number))))
(provide 'guix-info)
;;; guix-info.el ends here
-21
View File
@@ -1,21 +0,0 @@
(require 'guix-autoloads)
(require 'guix-emacs)
(defvar guix-load-path
(replace-regexp-in-string "${prefix}" "@prefix@" "@emacsuidir@")
"Directory with scheme files for \"guix.el\" package.")
(defcustom guix-package-enable-at-startup t
"If non-nil, activate Emacs packages installed in a user profile.
Set this variable to nil before requiring `guix-init' file to
avoid loading autoloads of Emacs packages installed in
`guix-user-profile'."
:type 'boolean
:group 'guix)
(add-to-list 'load-path (guix-emacs-directory))
(when guix-package-enable-at-startup
(guix-emacs-load-autoloads 'all))
(provide 'guix-init)
-865
View File
@@ -1,865 +0,0 @@
;;; guix-list.el --- List buffers for displaying entries -*- lexical-binding: t -*-
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides a list-like buffer for displaying information
;; about Guix packages and generations.
;;; Code:
(require 'cl-lib)
(require 'tabulated-list)
(require 'guix-info)
(require 'guix-base)
(require 'guix-utils)
(defgroup guix-list nil
"General settings for list buffers."
:prefix "guix-list-"
:group 'guix)
(defface guix-list-file-path
'((t :inherit guix-info-file-path))
"Face used for file paths."
:group 'guix-list)
(defcustom guix-list-describe-warning-count 10
"The maximum number of entries for describing without a warning.
If a user wants to describe more than this number of marked
entries, he will be prompted for confirmation."
:type 'integer
:group 'guix-list)
(defvar guix-list-column-format
`((package
(name 20 t)
(version 10 nil)
(outputs 13 t)
(installed 13 t)
(synopsis 30 nil))
(output
(name 20 t)
(version 10 nil)
(output 9 t)
(installed 12 t)
(synopsis 30 nil))
(generation
(number 5
,(lambda (a b) (guix-list-sort-numerically 0 a b))
:right-align t)
(current 10 t)
(time 20 t)
(path 30 t)))
"Columns displayed in list buffers.
Each element of the list has a form:
(ENTRY-TYPE . ((PARAM WIDTH SORT . PROPS) ...))
PARAM is the name of an entry parameter of ENTRY-TYPE. For the
meaning of WIDTH, SORT and PROPS, see `tabulated-list-format'.")
(defvar guix-list-column-titles
'((generation
(number . "N.")))
"Column titles for list buffers.
Has the same structure as `guix-param-titles', but titles from
this list have a priority.")
(defvar guix-list-column-value-methods
'((package
(name . guix-package-list-get-name)
(synopsis . guix-list-get-one-line)
(description . guix-list-get-one-line)
(installed . guix-package-list-get-installed-outputs))
(output
(name . guix-package-list-get-name)
(synopsis . guix-list-get-one-line)
(description . guix-list-get-one-line))
(generation
(current . guix-generation-list-get-current)
(time . guix-list-get-time)
(path . guix-list-get-file-path)))
"Methods for inserting parameter values in columns.
Each element of the list has a form:
(ENTRY-TYPE . ((PARAM . FUN) ...))
PARAM is the name of an entry parameter of ENTRY-TYPE.
FUN is a function returning a value that will be inserted. The
function is called with 2 arguments: the first one is the value
of the parameter; the second argument is an entry info (alist of
parameters and their values).")
(defun guix-list-get-param-title (entry-type param)
"Return title of an ENTRY-TYPE entry parameter PARAM."
(or (guix-get-key-val guix-list-column-titles
entry-type param)
(guix-get-param-title entry-type param)))
(defun guix-list-get-column-format (entry-type)
"Return column format for ENTRY-TYPE."
(guix-get-key-val guix-list-column-format entry-type))
(defun guix-list-get-displayed-params (entry-type)
"Return list of parameters of ENTRY-TYPE that should be displayed."
(mapcar #'car
(guix-list-get-column-format entry-type)))
(defun guix-list-get-sort-key (entry-type param &optional invert)
"Return suitable sort key for `tabulated-list-sort-key'.
Define column title by ENTRY-TYPE and PARAM. If INVERT is
non-nil, invert the sort."
(when (memq param (guix-list-get-displayed-params entry-type))
(cons (guix-list-get-param-title entry-type param) invert)))
(defun guix-list-sort-numerically (column a b)
"Compare COLUMN of tabulated entries A and B numerically.
It is a sort predicate for `tabulated-list-format'.
Return non-nil, if B is bigger than A."
(cl-flet ((num (entry)
(string-to-number (aref (cadr entry) column))))
(> (num b) (num a))))
(defun guix-list-make-tabulated-vector (entry-type fun)
"Call FUN on each column specification for ENTRY-TYPE.
FUN is called with 2 argument: parameter name and column
specification (see `guix-list-column-format').
Return a vector made of values of FUN calls."
(apply #'vector
(mapcar (lambda (col-spec)
(funcall fun (car col-spec) (cdr col-spec)))
(guix-list-get-column-format entry-type))))
(defun guix-list-get-list-format (entry-type)
"Return ENTRY-TYPE list specification for `tabulated-list-format'."
(guix-list-make-tabulated-vector
entry-type
(lambda (param spec)
(cons (guix-list-get-param-title entry-type param)
spec))))
(defun guix-list-insert-entries (entries entry-type)
"Display ENTRIES of ENTRY-TYPE in the current list buffer.
ENTRIES should have a form of `guix-entries'."
(setq tabulated-list-entries
(guix-list-get-tabulated-entries entries entry-type))
(tabulated-list-print))
(defun guix-list-get-tabulated-entries (entries entry-type)
"Return list of values of ENTRY-TYPE for `tabulated-list-entries'.
Values are taken from ENTRIES which should have the form of
`guix-entries'."
(mapcar (lambda (entry)
(list (guix-get-key-val entry 'id)
(guix-list-get-tabulated-entry entry entry-type)))
entries))
(defun guix-list-get-tabulated-entry (entry entry-type)
"Return array of values for `tabulated-list-entries'.
Parameters are taken from ENTRY of ENTRY-TYPE."
(guix-list-make-tabulated-vector
entry-type
(lambda (param _)
(let ((val (guix-get-key-val entry param))
(fun (guix-get-key-val guix-list-column-value-methods
entry-type param)))
(if fun
(funcall fun val entry)
(guix-get-string val))))))
(defun guix-list-get-one-line (val &optional _)
"Return one-line string from a multi-line string VAL.
VAL may be nil."
(if val
(guix-get-one-line val)
(guix-get-string nil)))
(defun guix-list-get-time (seconds &optional _)
"Return formatted time string from SECONDS."
(guix-get-time-string seconds))
(defun guix-list-get-file-path (path &optional _)
"Return PATH button specification for `tabulated-list-entries'."
(list path
'face 'guix-list-file-path
'action (lambda (btn) (find-file (button-label btn)))
'follow-link t
'help-echo "Find file"))
(defun guix-list-current-id ()
"Return ID of the current entry."
(or (tabulated-list-get-id)
(user-error "No entry here")))
(defun guix-list-current-entry ()
"Return alist of the current entry info."
(guix-get-entry-by-id (guix-list-current-id) guix-entries))
(defun guix-list-for-each-line (fun &rest args)
"Call FUN with ARGS for each entry line."
(or (derived-mode-p 'guix-list-mode)
(error "The current buffer is not in Guix List mode"))
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(apply fun args)
(forward-line))))
(defun guix-list-fold-lines (fun init)
"Fold over entry lines in the current list buffer.
Call FUN with RESULT as argument for each line, using INIT as
the initial value of RESULT. Return the final result."
(let ((res init))
(guix-list-for-each-line
(lambda () (setq res (funcall fun res))))
res))
;;; Marking and sorting
(defvar-local guix-list-marked nil
"List of the marked entries.
Each element of the list has a form:
(ID MARK-NAME . ARGS)
ID is an entry ID.
MARK-NAME is a symbol from `guix-list-mark-alist'.
ARGS is a list of additional values.")
(defvar guix-list-mark-alist
'((empty . ?\s)
(general . ?*))
"Alist of available mark names and mark characters.")
(defsubst guix-list-get-mark (name)
"Return mark character by its NAME."
(or (guix-get-key-val guix-list-mark-alist name)
(error "Mark '%S' not found" name)))
(defsubst guix-list-get-mark-string (name)
"Return mark string by its NAME."
(string (guix-list-get-mark name)))
(defun guix-list-current-mark ()
"Return mark character of the current line."
(char-after (line-beginning-position)))
(defun guix-list-get-marked (&rest mark-names)
"Return list of specs of entries marked with any mark from MARK-NAMES.
Entry specs are elements from `guix-list-marked' list.
If MARK-NAMES are not specified, use all marks from
`guix-list-mark-alist' except the `empty' one."
(or mark-names
(setq mark-names
(delq 'empty
(mapcar #'car guix-list-mark-alist))))
(cl-remove-if-not (lambda (assoc)
(memq (cadr assoc) mark-names))
guix-list-marked))
(defun guix-list-get-marked-args (mark-name)
"Return list of (ID . ARGS) elements from lines marked with MARK-NAME.
See `guix-list-marked' for the meaning of ARGS."
(mapcar (lambda (spec)
(let ((id (car spec))
(args (cddr spec)))
(cons id args)))
(guix-list-get-marked mark-name)))
(defun guix-list-get-marked-id-list (&rest mark-names)
"Return list of IDs of entries marked with any mark from MARK-NAMES.
See `guix-list-get-marked' for details."
(mapcar #'car (apply #'guix-list-get-marked mark-names)))
(defun guix-list-mark (mark-name &optional advance &rest args)
"Put a mark on the current line.
Also add the current entry to `guix-list-marked' using its ID and ARGS.
MARK-NAME is a symbol from `guix-list-mark-alist'.
If ADVANCE is non-nil, move forward by one line after marking.
Interactively, put a general mark and move to the next line."
(interactive '(general t))
(let ((id (guix-list-current-id)))
(if (eq mark-name 'empty)
(setq guix-list-marked (assq-delete-all id guix-list-marked))
(let ((assoc (assq id guix-list-marked))
(val (cons mark-name args)))
(if assoc
(setcdr assoc val)
(push (cons id val) guix-list-marked)))))
(tabulated-list-put-tag (guix-list-get-mark-string mark-name)
advance))
(defun guix-list-mark-all (mark-name)
"Mark all lines with MARK-NAME mark.
MARK-NAME is a symbol from `guix-list-mark-alist'.
Interactively, put a general mark on all lines."
(interactive '(general))
(guix-list-for-each-line #'guix-list-mark mark-name))
(defun guix-list-unmark (&optional arg)
"Unmark the current line and move to the next line.
With ARG, unmark all lines."
(interactive "P")
(if arg
(guix-list-unmark-all)
(guix-list-mark 'empty t)))
(defun guix-list-unmark-backward ()
"Move up one line and unmark it."
(interactive)
(forward-line -1)
(guix-list-mark 'empty))
(defun guix-list-unmark-all ()
"Unmark all lines."
(interactive)
(guix-list-mark-all 'empty))
(defun guix-list-restore-marks ()
"Put marks according to `guix-list-mark-alist'."
(guix-list-for-each-line
(lambda ()
(let ((mark-name (car (guix-get-key-val guix-list-marked
(guix-list-current-id)))))
(tabulated-list-put-tag
(guix-list-get-mark-string (or mark-name 'empty)))))))
(defun guix-list-sort (&optional n)
"Sort guix list entries by the column at point.
With a numeric prefix argument N, sort the Nth column.
Same as `tabulated-list-sort', but also restore marks after sorting."
(interactive "P")
(tabulated-list-sort n)
(guix-list-restore-marks))
(defvar guix-list-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map tabulated-list-mode-map)
(define-key map (kbd "RET") 'guix-list-describe)
(define-key map (kbd "m") 'guix-list-mark)
(define-key map (kbd "*") 'guix-list-mark)
(define-key map (kbd "M") 'guix-list-mark-all)
(define-key map (kbd "u") 'guix-list-unmark)
(define-key map (kbd "DEL") 'guix-list-unmark-backward)
(define-key map [remap tabulated-list-sort] 'guix-list-sort)
map)
"Parent keymap for list buffers.")
(define-derived-mode guix-list-mode tabulated-list-mode "Guix-List"
"Parent mode for displaying information in list buffers."
(setq tabulated-list-padding 2))
(defmacro guix-list-define-entry-type (entry-type &rest args)
"Define common stuff for displaying ENTRY-TYPE entries in list buffers.
Remaining argument (ARGS) should have a form [KEYWORD VALUE] ... The
following keywords are available:
- `:sort-key' - default sort key for the tabulated list buffer.
- `:invert-sort' - if non-nil, invert initial sort.
- `:marks' - default value for the defined
`guix-ENTRY-TYPE-mark-alist' variable.
This macro defines the following functions:
- `guix-ENTRY-TYPE-mark-MARK-NAME' functions for each mark
specified in `:marks' argument."
(let* ((entry-type-str (symbol-name entry-type))
(prefix (concat "guix-" entry-type-str "-list"))
(mode-str (concat prefix "-mode"))
(init-fun (intern (concat prefix "-mode-initialize")))
(marks-var (intern (concat prefix "-mark-alist")))
(marks-val nil)
(sort-key nil)
(invert-sort nil))
;; Process the keyword args.
(while (keywordp (car args))
(pcase (pop args)
(`:sort-key (setq sort-key (pop args)))
(`:invert-sort (setq invert-sort (pop args)))
(`:marks (setq marks-val (pop args)))
(_ (pop args))))
`(progn
(defvar ,marks-var ',marks-val
,(concat "Alist of additional marks for `" mode-str "'.\n"
"Marks from this list are added to `guix-list-mark-alist'."))
,@(mapcar (lambda (mark-spec)
(let* ((mark-name (car mark-spec))
(mark-name-str (symbol-name mark-name)))
`(defun ,(intern (concat prefix "-mark-" mark-name-str "-simple")) ()
,(concat "Put '" mark-name-str "' mark and move to the next line.\n"
"Also add the current entry to `guix-list-marked'.")
(interactive)
(guix-list-mark ',mark-name t))))
marks-val)
(defun ,init-fun ()
,(concat "Initial settings for `" mode-str "'.")
,(when sort-key
`(setq tabulated-list-sort-key
(guix-list-get-sort-key
',entry-type ',sort-key ,invert-sort)))
(setq tabulated-list-format
(guix-list-get-list-format ',entry-type))
(setq-local guix-list-mark-alist
(append guix-list-mark-alist ,marks-var))
(tabulated-list-init-header)))))
(put 'guix-list-define-entry-type 'lisp-indent-function 'defun)
(defun guix-list-describe-maybe (entry-type ids)
"Describe ENTRY-TYPE entries in info buffer using list of IDS."
(let ((count (length ids)))
(when (or (<= count guix-list-describe-warning-count)
(y-or-n-p (format "Do you really want to describe %d entries? "
count)))
(apply #'guix-get-show-entries
guix-profile 'info entry-type 'id ids))))
(defun guix-list-describe (&optional arg)
"Describe entries marked with a general mark.
If no entries are marked, describe the current entry.
With prefix (if ARG is non-nil), describe entries marked with any mark."
(interactive "P")
(let ((ids (or (apply #'guix-list-get-marked-id-list
(unless arg '(general)))
(list (guix-list-current-id)))))
(guix-list-describe-maybe guix-entry-type ids)))
;;; Displaying packages
(guix-define-buffer-type list package)
(guix-list-define-entry-type package
:sort-key name
:marks ((install . ?I)
(upgrade . ?U)
(delete . ?D)))
(defface guix-package-list-installed
'((t :inherit guix-package-info-installed-outputs))
"Face used if there are installed outputs for the current package."
:group 'guix-package-list)
(defface guix-package-list-obsolete
'((t :inherit guix-package-info-obsolete))
"Face used if a package is obsolete."
:group 'guix-package-list)
(defcustom guix-package-list-generation-marking-enabled nil
"If non-nil, allow putting marks in a list with 'generation packages'.
By default this is disabled, because it may be confusing. For
example a package is installed in some generation, so a user can
mark it for deletion in the list of packages from this
generation, but the package may not be installed in the latest
generation, so actually it cannot be deleted.
If you managed to understand the explanation above or if you
really know what you do or if you just don't care, you can set
this variable to t. It should not do much harm anyway (most
likely)."
:type 'boolean
:group 'guix-package-list)
(let ((map guix-package-list-mode-map))
(define-key map (kbd "x") 'guix-package-list-execute)
(define-key map (kbd "i") 'guix-package-list-mark-install)
(define-key map (kbd "d") 'guix-package-list-mark-delete)
(define-key map (kbd "U") 'guix-package-list-mark-upgrade)
(define-key map (kbd "^") 'guix-package-list-mark-upgrades))
(defun guix-package-list-get-name (name entry)
"Return NAME of the package ENTRY.
Colorize it with `guix-package-list-installed' or
`guix-package-list-obsolete' if needed."
(guix-get-string name
(cond ((guix-get-key-val entry 'obsolete)
'guix-package-list-obsolete)
((guix-get-key-val entry 'installed)
'guix-package-list-installed))))
(defun guix-package-list-get-installed-outputs (installed &optional _)
"Return string with outputs from INSTALLED entries."
(guix-get-string
(mapcar (lambda (entry)
(guix-get-key-val entry 'output))
installed)))
(defun guix-package-list-marking-check ()
"Signal an error if marking is disabled for the current buffer."
(when (and (not guix-package-list-generation-marking-enabled)
(or (derived-mode-p 'guix-package-list-mode)
(derived-mode-p 'guix-output-list-mode))
(eq guix-search-type 'generation))
(error "Action marks are disabled for lists of 'generation packages'")))
(defun guix-package-list-mark-outputs (mark default
&optional prompt available)
"Mark the current package with MARK and move to the next line.
If PROMPT is non-nil, use it to ask a user for outputs from
AVAILABLE list, otherwise mark all DEFAULT outputs."
(let ((outputs (if prompt
(guix-completing-read-multiple
prompt available nil t)
default)))
(apply #'guix-list-mark mark t outputs)))
(defun guix-package-list-mark-install (&optional arg)
"Mark the current package for installation and move to the next line.
With ARG, prompt for the outputs to install (several outputs may
be separated with \",\")."
(interactive "P")
(guix-package-list-marking-check)
(let* ((entry (guix-list-current-entry))
(all (guix-get-key-val entry 'outputs))
(installed (guix-get-installed-outputs entry))
(available (cl-set-difference all installed :test #'string=)))
(or available
(user-error "This package is already installed"))
(guix-package-list-mark-outputs
'install '("out")
(and arg "Output(s) to install: ")
available)))
(defun guix-package-list-mark-delete (&optional arg)
"Mark the current package for deletion and move to the next line.
With ARG, prompt for the outputs to delete (several outputs may
be separated with \",\")."
(interactive "P")
(guix-package-list-marking-check)
(let* ((entry (guix-list-current-entry))
(installed (guix-get-installed-outputs entry)))
(or installed
(user-error "This package is not installed"))
(guix-package-list-mark-outputs
'delete installed
(and arg "Output(s) to delete: ")
installed)))
(defun guix-package-list-mark-upgrade (&optional arg)
"Mark the current package for upgrading and move to the next line.
With ARG, prompt for the outputs to upgrade (several outputs may
be separated with \",\")."
(interactive "P")
(guix-package-list-marking-check)
(let* ((entry (guix-list-current-entry))
(installed (guix-get-installed-outputs entry)))
(or installed
(user-error "This package is not installed"))
(when (or (guix-get-key-val entry 'obsolete)
(y-or-n-p "This package is not obsolete. Try to upgrade it anyway? "))
(guix-package-list-mark-outputs
'upgrade installed
(and arg "Output(s) to upgrade: ")
installed))))
(defun guix-list-mark-package-upgrades (fun)
"Mark all obsolete packages for upgrading.
Use FUN to perform marking of the current line. FUN should
accept an entry as argument."
(guix-package-list-marking-check)
(let ((obsolete (cl-remove-if-not
(lambda (entry)
(guix-get-key-val entry 'obsolete))
guix-entries)))
(guix-list-for-each-line
(lambda ()
(let* ((id (guix-list-current-id))
(entry (cl-find-if
(lambda (entry)
(equal id (guix-get-key-val entry 'id)))
obsolete)))
(when entry
(funcall fun entry)))))))
(defun guix-package-list-mark-upgrades ()
"Mark all obsolete packages for upgrading."
(interactive)
(guix-list-mark-package-upgrades
(lambda (entry)
(apply #'guix-list-mark
'upgrade nil
(guix-get-installed-outputs entry)))))
(defun guix-list-execute-package-actions (fun)
"Perform actions on the marked packages.
Use FUN to define actions suitable for `guix-process-package-actions'.
FUN should accept action-type as argument."
(let ((actions (delq nil
(mapcar fun '(install delete upgrade)))))
(if actions
(guix-process-package-actions
guix-profile actions (current-buffer))
(user-error "No operations specified"))))
(defun guix-package-list-execute ()
"Perform actions on the marked packages."
(interactive)
(guix-list-execute-package-actions #'guix-package-list-make-action))
(defun guix-package-list-make-action (action-type)
"Return action specification for the packages marked with ACTION-TYPE.
Return nil, if there are no packages marked with ACTION-TYPE.
The specification is suitable for `guix-process-package-actions'."
(let ((specs (guix-list-get-marked-args action-type)))
(and specs (cons action-type specs))))
;;; Displaying outputs
(guix-define-buffer-type list output
:buffer-name "*Guix Package List*")
(guix-list-define-entry-type output
:sort-key name
:marks ((install . ?I)
(upgrade . ?U)
(delete . ?D)))
(let ((map guix-output-list-mode-map))
(define-key map (kbd "RET") 'guix-output-list-describe)
(define-key map (kbd "x") 'guix-output-list-execute)
(define-key map (kbd "i") 'guix-output-list-mark-install)
(define-key map (kbd "d") 'guix-output-list-mark-delete)
(define-key map (kbd "U") 'guix-output-list-mark-upgrade)
(define-key map (kbd "^") 'guix-output-list-mark-upgrades))
(defun guix-output-list-mark-install ()
"Mark the current output for installation and move to the next line."
(interactive)
(guix-package-list-marking-check)
(let* ((entry (guix-list-current-entry))
(installed (guix-get-key-val entry 'installed)))
(if installed
(user-error "This output is already installed")
(guix-list-mark 'install t))))
(defun guix-output-list-mark-delete ()
"Mark the current output for deletion and move to the next line."
(interactive)
(guix-package-list-marking-check)
(let* ((entry (guix-list-current-entry))
(installed (guix-get-key-val entry 'installed)))
(if installed
(guix-list-mark 'delete t)
(user-error "This output is not installed"))))
(defun guix-output-list-mark-upgrade ()
"Mark the current output for deletion and move to the next line."
(interactive)
(guix-package-list-marking-check)
(let* ((entry (guix-list-current-entry))
(installed (guix-get-key-val entry 'installed)))
(or installed
(user-error "This output is not installed"))
(when (or (guix-get-key-val entry 'obsolete)
(y-or-n-p "This output is not obsolete. Try to upgrade it anyway? "))
(guix-list-mark 'upgrade t))))
(defun guix-output-list-mark-upgrades ()
"Mark all obsolete package outputs for upgrading."
(interactive)
(guix-list-mark-package-upgrades
(lambda (_) (guix-list-mark 'upgrade))))
(defun guix-output-list-execute ()
"Perform actions on the marked outputs."
(interactive)
(guix-list-execute-package-actions #'guix-output-list-make-action))
(defun guix-output-list-make-action (action-type)
"Return action specification for the outputs marked with ACTION-TYPE.
Return nil, if there are no outputs marked with ACTION-TYPE.
The specification is suitable for `guix-process-output-actions'."
(let ((ids (guix-list-get-marked-id-list action-type)))
(and ids (cons action-type
(mapcar #'guix-get-package-id-and-output-by-output-id
ids)))))
(defun guix-output-list-describe (&optional arg)
"Describe outputs or packages marked with a general mark.
If no entries are marked, describe the current output or package.
With prefix (if ARG is non-nil), describe entries marked with any mark.
Also see `guix-package-info-type'."
(interactive "P")
(if (eq guix-package-info-type 'output)
(guix-list-describe arg)
(let* ((oids (or (apply #'guix-list-get-marked-id-list
(unless arg '(general)))
(list (guix-list-current-id))))
(pids (mapcar (lambda (oid)
(car (guix-get-package-id-and-output-by-output-id
oid)))
oids)))
(guix-list-describe-maybe 'package (cl-remove-duplicates pids)))))
;;; Displaying generations
(guix-define-buffer-type list generation)
(guix-list-define-entry-type generation
:sort-key number
:invert-sort t
:marks ((delete . ?D)))
(let ((map guix-generation-list-mode-map))
(define-key map (kbd "RET") 'guix-generation-list-show-packages)
(define-key map (kbd "+") 'guix-generation-list-show-added-packages)
(define-key map (kbd "-") 'guix-generation-list-show-removed-packages)
(define-key map (kbd "=") 'guix-generation-list-diff)
(define-key map (kbd "D") 'guix-generation-list-diff)
(define-key map (kbd "e") 'guix-generation-list-ediff)
(define-key map (kbd "x") 'guix-generation-list-execute)
(define-key map (kbd "i") 'guix-list-describe)
(define-key map (kbd "s") 'guix-generation-list-switch)
(define-key map (kbd "d") 'guix-generation-list-mark-delete))
(defun guix-generation-list-get-current (val &optional _)
"Return string from VAL showing whether this generation is current.
VAL is a boolean value."
(if val "(current)" ""))
(defun guix-generation-list-switch ()
"Switch current profile to the generation at point."
(interactive)
(let* ((entry (guix-list-current-entry))
(current (guix-get-key-val entry 'current))
(number (guix-get-key-val entry 'number)))
(if current
(user-error "This generation is already the current one")
(guix-switch-to-generation guix-profile number (current-buffer)))))
(defun guix-generation-list-show-packages ()
"List installed packages for the generation at point."
(interactive)
(guix-get-show-entries guix-profile 'list guix-package-list-type
'generation (guix-list-current-id)))
(defun guix-generation-list-generations-to-compare ()
"Return a sorted list of 2 marked generations for comparing."
(let ((numbers (guix-list-get-marked-id-list 'general)))
(if (/= (length numbers) 2)
(user-error "2 generations should be marked for comparing")
(sort numbers #'<))))
(defun guix-generation-list-show-added-packages ()
"List package outputs added to the latest marked generation.
If 2 generations are marked with \\[guix-list-mark], display
outputs installed in the latest marked generation that were not
installed in the other one."
(interactive)
(apply #'guix-get-show-entries
guix-profile 'list 'output 'generation-diff
(reverse (guix-generation-list-generations-to-compare))))
(defun guix-generation-list-show-removed-packages ()
"List package outputs removed from the latest marked generation.
If 2 generations are marked with \\[guix-list-mark], display
outputs not installed in the latest marked generation that were
installed in the other one."
(interactive)
(apply #'guix-get-show-entries
guix-profile 'list 'output 'generation-diff
(guix-generation-list-generations-to-compare)))
(defun guix-generation-list-compare (diff-fun gen-fun)
"Run GEN-FUN on the 2 marked generations and run DIFF-FUN on the results."
(cl-multiple-value-bind (gen1 gen2)
(guix-generation-list-generations-to-compare)
(funcall diff-fun
(funcall gen-fun gen1)
(funcall gen-fun gen2))))
(defun guix-generation-list-ediff-manifests ()
"Run Ediff on manifests of the 2 marked generations."
(interactive)
(guix-generation-list-compare
#'ediff-files
#'guix-profile-generation-manifest-file))
(defun guix-generation-list-diff-manifests ()
"Run Diff on manifests of the 2 marked generations."
(interactive)
(guix-generation-list-compare
#'guix-diff
#'guix-profile-generation-manifest-file))
(defun guix-generation-list-ediff-packages ()
"Run Ediff on package outputs installed in the 2 marked generations."
(interactive)
(guix-generation-list-compare
#'ediff-buffers
#'guix-profile-generation-packages-buffer))
(defun guix-generation-list-diff-packages ()
"Run Diff on package outputs installed in the 2 marked generations."
(interactive)
(guix-generation-list-compare
#'guix-diff
#'guix-profile-generation-packages-buffer))
(defun guix-generation-list-ediff (arg)
"Run Ediff on package outputs installed in the 2 marked generations.
With ARG, run Ediff on manifests of the marked generations."
(interactive "P")
(if arg
(guix-generation-list-ediff-manifests)
(guix-generation-list-ediff-packages)))
(defun guix-generation-list-diff (arg)
"Run Diff on package outputs installed in the 2 marked generations.
With ARG, run Diff on manifests of the marked generations."
(interactive "P")
(if arg
(guix-generation-list-diff-manifests)
(guix-generation-list-diff-packages)))
(defun guix-generation-list-mark-delete (&optional arg)
"Mark the current generation for deletion and move to the next line.
With ARG, mark all generations for deletion."
(interactive "P")
(if arg
(guix-list-mark-all 'delete)
(guix-list-mark 'delete t)))
(defun guix-generation-list-execute ()
"Delete marked generations."
(interactive)
(let ((marked (guix-list-get-marked-id-list 'delete)))
(or marked
(user-error "No generations marked for deletion"))
(guix-delete-generations guix-profile marked (current-buffer))))
(provide 'guix-list)
;;; guix-list.el ends here
-922
View File
@@ -1,922 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Information about packages and generations is passed to the elisp
;; side in the form of alists of parameters (such as name or
;; version) and their values.
;; entries procedure is the “entry point” for the elisp side to get
;; information about packages and generations.
;; Since name/version pair is not necessarily unique, we use
;; `object-address' to identify a package (for id parameter), if
;; possible. However for the obsolete packages (that can be found in
;; installed manifest but not in a package directory), id parameter is
;; still "name-version" string. So id package parameter in the code
;; below is either an object-address number or a full-name string.
;; To speed-up the process of getting information, the following
;; auxiliary variables are used:
;;
;; - `%packages' - VHash of "package address"/"package" pairs.
;;
;; - `%package-table' - Hash table of
;; "name+version key"/"list of packages" pairs.
;;; Code:
(use-modules
(ice-9 vlist)
(ice-9 match)
(srfi srfi-1)
(srfi srfi-2)
(srfi srfi-11)
(srfi srfi-19)
(srfi srfi-26)
(guix)
(guix git-download)
(guix packages)
(guix profiles)
(guix licenses)
(guix utils)
(guix ui)
(guix scripts package)
(guix scripts pull)
(gnu packages))
(define-syntax-rule (first-or-false lst)
(and (not (null? lst))
(first lst)))
(define (list-maybe obj)
(if (list? obj) obj (list obj)))
(define full-name->name+version package-name->name+version)
(define (name+version->full-name name version)
(string-append name "-" version))
(define* (make-package-specification name #:optional version output)
(let ((full-name (if version
(name+version->full-name name version)
name)))
(if output
(string-append full-name ":" output)
full-name)))
(define name+version->key cons)
(define key->name+version car+cdr)
(define %packages
(fold-packages (lambda (pkg res)
(vhash-consq (object-address pkg) pkg res))
vlist-null))
(define %package-table
(let ((table (make-hash-table (vlist-length %packages))))
(vlist-for-each
(lambda (elem)
(match elem
((address . pkg)
(let* ((key (name+version->key (package-name pkg)
(package-version pkg)))
(ref (hash-ref table key)))
(hash-set! table key
(if ref (cons pkg ref) (list pkg)))))))
%packages)
table))
(define (manifest-entry->name+version+output entry)
(values
(manifest-entry-name entry)
(manifest-entry-version entry)
(manifest-entry-output entry)))
(define (manifest-entry->package-specification entry)
(call-with-values
(lambda () (manifest-entry->name+version+output entry))
make-package-specification))
(define (manifest-entries->package-specifications entries)
(map manifest-entry->package-specification entries))
(define (generation-package-specifications profile number)
"Return a list of package specifications for generation NUMBER."
(let ((manifest (profile-manifest
(generation-file-name profile number))))
(manifest-entries->package-specifications
(manifest-entries manifest))))
(define (generation-package-specifications+paths profile number)
"Return a list of package specifications and paths for generation NUMBER.
Each element of the list is a list of the package specification and its path."
(let ((manifest (profile-manifest
(generation-file-name profile number))))
(map (lambda (entry)
(list (manifest-entry->package-specification entry)
(manifest-entry-item entry)))
(manifest-entries manifest))))
(define (generation-difference profile number1 number2)
"Return a list of package specifications for outputs installed in generation
NUMBER1 and not installed in generation NUMBER2."
(let ((specs1 (generation-package-specifications profile number1))
(specs2 (generation-package-specifications profile number2)))
(lset-difference string=? specs1 specs2)))
(define (manifest-entries->hash-table entries)
"Return a hash table of name keys and lists of matching manifest ENTRIES."
(let ((table (make-hash-table (length entries))))
(for-each (lambda (entry)
(let* ((key (manifest-entry-name entry))
(ref (hash-ref table key)))
(hash-set! table key
(if ref (cons entry ref) (list entry)))))
entries)
table))
(define (manifest=? m1 m2)
(or (eq? m1 m2)
(equal? m1 m2)))
(define manifest->hash-table
(let ((current-manifest #f)
(current-table #f))
(lambda (manifest)
"Return a hash table of name keys and matching MANIFEST entries."
(unless (manifest=? manifest current-manifest)
(set! current-manifest manifest)
(set! current-table (manifest-entries->hash-table
(manifest-entries manifest))))
current-table)))
(define* (manifest-entries-by-name manifest name #:optional version output)
"Return a list of MANIFEST entries matching NAME, VERSION and OUTPUT."
(let ((entries (or (hash-ref (manifest->hash-table manifest) name)
'())))
(if (or version output)
(filter (lambda (entry)
(and (or (not version)
(equal? version (manifest-entry-version entry)))
(or (not output)
(equal? output (manifest-entry-output entry)))))
entries)
entries)))
(define (manifest-entry-by-output entries output)
"Return a manifest entry from ENTRIES matching OUTPUT."
(find (lambda (entry)
(string= output (manifest-entry-output entry)))
entries))
(define (fold-manifest-by-name manifest proc init)
"Fold over MANIFEST entries.
Call (PROC NAME VERSION ENTRIES RESULT), using INIT as the initial value
of RESULT. ENTRIES is a list of manifest entries with NAME/VERSION."
(hash-fold (lambda (name entries res)
(proc name (manifest-entry-version (car entries))
entries res))
init
(manifest->hash-table manifest)))
(define* (object-transformer param-alist #:optional (params '()))
"Return procedure transforming objects into alist of parameter/value pairs.
PARAM-ALIST is alist of available parameters (symbols) and procedures
returning values of these parameters. Each procedure is applied to
objects.
PARAMS is list of parameters from PARAM-ALIST that should be returned by
a resulting procedure. If PARAMS is not specified or is an empty list,
use all available parameters.
Example:
(let* ((alist `((plus1 . ,1+) (minus1 . ,1-) (mul2 . ,(cut * 2 <>))))
(number->alist (object-transformer alist '(plus1 mul2))))
(number->alist 8))
=>
((plus1 . 9) (mul2 . 16))
"
(let* ((use-all-params (null? params))
(alist (filter-map (match-lambda
((param . proc)
(and (or use-all-params
(memq param params))
(cons param proc)))
(_ #f))
param-alist)))
(lambda objects
(map (match-lambda
((param . proc)
(cons param (apply proc objects))))
alist))))
(define %manifest-entry-param-alist
`((output . ,manifest-entry-output)
(path . ,manifest-entry-item)
(dependencies . ,manifest-entry-dependencies)))
(define manifest-entry->sexp
(object-transformer %manifest-entry-param-alist))
(define (manifest-entries->sexps entries)
(map manifest-entry->sexp entries))
(define (package-inputs-names inputs)
"Return a list of full names of the packages from package INPUTS."
(filter-map (match-lambda
((_ (? package? package))
(package-full-name package))
(_ #f))
inputs))
(define (package-license-names package)
"Return a list of license names of the PACKAGE."
(filter-map (lambda (license)
(and (license? license)
(license-name license)))
(list-maybe (package-license package))))
(define (package-source-names package)
"Return a list of source names (URLs) of the PACKAGE."
(let ((source (package-source package)))
(and (origin? source)
(filter-map (lambda (uri)
(cond ((string? uri)
uri)
((git-reference? uri)
(git-reference-url uri))
(else "Unknown source type")))
(list-maybe (origin-uri source))))))
(define (package-unique? package)
"Return #t if PACKAGE is a single package with such name/version."
(null? (cdr (packages-by-name (package-name package)
(package-version package)))))
(define %package-param-alist
`((id . ,object-address)
(package-id . ,object-address)
(name . ,package-name)
(version . ,package-version)
(license . ,package-license-names)
(source . ,package-source-names)
(synopsis . ,package-synopsis)
(description . ,package-description)
(home-url . ,package-home-page)
(outputs . ,package-outputs)
(non-unique . ,(negate package-unique?))
(inputs . ,(lambda (pkg)
(package-inputs-names
(package-inputs pkg))))
(native-inputs . ,(lambda (pkg)
(package-inputs-names
(package-native-inputs pkg))))
(propagated-inputs . ,(lambda (pkg)
(package-inputs-names
(package-propagated-inputs pkg))))
(location . ,(lambda (pkg)
(location->string (package-location pkg))))))
(define (package-param package param)
"Return a value of a PACKAGE PARAM."
(and=> (assq-ref %package-param-alist param)
(cut <> package)))
;;; Finding packages.
(define (package-by-address address)
(and=> (vhash-assq address %packages)
cdr))
(define (packages-by-name+version name version)
(or (hash-ref %package-table
(name+version->key name version))
'()))
(define (packages-by-full-name full-name)
(call-with-values
(lambda () (full-name->name+version full-name))
packages-by-name+version))
(define (packages-by-id id)
(if (integer? id)
(let ((pkg (package-by-address id)))
(if pkg (list pkg) '()))
(packages-by-full-name id)))
(define (id->name+version id)
(if (integer? id)
(and=> (package-by-address id)
(lambda (pkg)
(values (package-name pkg)
(package-version pkg))))
(full-name->name+version id)))
(define (package-by-id id)
(first-or-false (packages-by-id id)))
(define (newest-package-by-id id)
(and=> (id->name+version id)
(lambda (name)
(first-or-false (find-best-packages-by-name name #f)))))
(define (matching-packages predicate)
(fold-packages (lambda (pkg res)
(if (predicate pkg)
(cons pkg res)
res))
'()))
(define (filter-packages-by-output packages output)
(filter (lambda (package)
(member output (package-outputs package)))
packages))
(define* (packages-by-name name #:optional version output)
"Return a list of packages matching NAME, VERSION and OUTPUT."
(let ((packages (if version
(packages-by-name+version name version)
(matching-packages
(lambda (pkg) (string=? name (package-name pkg)))))))
(if output
(filter-packages-by-output packages output)
packages)))
(define (manifest-entry->packages entry)
(call-with-values
(lambda () (manifest-entry->name+version+output entry))
packages-by-name))
(define (packages-by-regexp regexp match-params)
"Return a list of packages matching REGEXP string.
MATCH-PARAMS is a list of parameters that REGEXP can match."
(define (package-match? package regexp)
(any (lambda (param)
(let ((val (package-param package param)))
(and (string? val) (regexp-exec regexp val))))
match-params))
(let ((re (make-regexp regexp regexp/icase)))
(matching-packages (cut package-match? <> re))))
(define (all-available-packages)
"Return a list of all available packages."
(matching-packages (const #t)))
(define (newest-available-packages)
"Return a list of the newest available packages."
(vhash-fold (lambda (name elem res)
(match elem
((_ newest pkgs ...)
(cons newest res))))
'()
(find-newest-available-packages)))
;;; Making package/output patterns.
(define (specification->package-pattern specification)
(call-with-values
(lambda ()
(full-name->name+version specification))
list))
(define (specification->output-pattern specification)
(call-with-values
(lambda ()
(package-specification->name+version+output specification #f))
list))
(define (id->package-pattern id)
(if (integer? id)
(package-by-address id)
(specification->package-pattern id)))
(define (id->output-pattern id)
"Return an output pattern by output ID.
ID should be '<package-address>:<output>' or '<name>-<version>:<output>'."
(let-values (((name version output)
(package-specification->name+version+output id)))
(if version
(list name version output)
(list (package-by-address (string->number name))
output))))
(define (specifications->package-patterns . specifications)
(map specification->package-pattern specifications))
(define (specifications->output-patterns . specifications)
(map specification->output-pattern specifications))
(define (ids->package-patterns . ids)
(map id->package-pattern ids))
(define (ids->output-patterns . ids)
(map id->output-pattern ids))
(define* (manifest-patterns-result packages res obsolete-pattern
#:optional installed-pattern)
"Auxiliary procedure for 'manifest-package-patterns' and
'manifest-output-patterns'."
(if (null? packages)
(cons (obsolete-pattern) res)
(if installed-pattern
;; We don't need duplicates for a list of installed packages,
;; so just take any (car) package.
(cons (installed-pattern (car packages)) res)
res)))
(define* (manifest-package-patterns manifest #:optional obsolete-only?)
"Return a list of package patterns for MANIFEST entries.
If OBSOLETE-ONLY? is #f, use all entries, otherwise make patterns only
for obsolete packages."
(fold-manifest-by-name
manifest
(lambda (name version entries res)
(manifest-patterns-result (packages-by-name name version)
res
(lambda () (list name version entries))
(and (not obsolete-only?)
(cut list <> entries))))
'()))
(define* (manifest-output-patterns manifest #:optional obsolete-only?)
"Return a list of output patterns for MANIFEST entries.
If OBSOLETE-ONLY? is #f, use all entries, otherwise make patterns only
for obsolete packages."
(fold (lambda (entry res)
(manifest-patterns-result (manifest-entry->packages entry)
res
(lambda () entry)
(and (not obsolete-only?)
(cut list <> entry))))
'()
(manifest-entries manifest)))
(define (obsolete-package-patterns manifest)
(manifest-package-patterns manifest #t))
(define (obsolete-output-patterns manifest)
(manifest-output-patterns manifest #t))
;;; Transforming package/output patterns into alists.
(define (obsolete-package-sexp name version entries)
"Return an alist with information about obsolete package.
ENTRIES is a list of installed manifest entries."
`((id . ,(name+version->full-name name version))
(name . ,name)
(version . ,version)
(outputs . ,(map manifest-entry-output entries))
(obsolete . #t)
(installed . ,(manifest-entries->sexps entries))))
(define (package-pattern-transformer manifest params)
"Return 'package-pattern->package-sexps' procedure."
(define package->sexp
(object-transformer %package-param-alist params))
(define* (sexp-by-package package #:optional
(entries (manifest-entries-by-name
manifest
(package-name package)
(package-version package))))
(cons (cons 'installed (manifest-entries->sexps entries))
(package->sexp package)))
(define (->sexps pattern)
(match pattern
((? package? package)
(list (sexp-by-package package)))
(((? package? package) entries)
(list (sexp-by-package package entries)))
((name version entries)
(list (obsolete-package-sexp
name version entries)))
((name version)
(let ((packages (packages-by-name name version)))
(if (null? packages)
(let ((entries (manifest-entries-by-name
manifest name version)))
(if (null? entries)
'()
(list (obsolete-package-sexp
name version entries))))
(map sexp-by-package packages))))
(_ '())))
->sexps)
(define (output-pattern-transformer manifest params)
"Return 'output-pattern->output-sexps' procedure."
(define package->sexp
(object-transformer (alist-delete 'id %package-param-alist)
params))
(define manifest-entry->sexp
(object-transformer (alist-delete 'output %manifest-entry-param-alist)
params))
(define* (output-sexp pkg-alist pkg-address output
#:optional entry)
(let ((entry-alist (if entry
(manifest-entry->sexp entry)
'()))
(base `((id . ,(string-append
(number->string pkg-address)
":" output))
(output . ,output)
(installed . ,(->bool entry)))))
(append entry-alist base pkg-alist)))
(define (obsolete-output-sexp entry)
(let-values (((name version output)
(manifest-entry->name+version+output entry)))
(let ((base `((id . ,(make-package-specification
name version output))
(package-id . ,(name+version->full-name name version))
(name . ,name)
(version . ,version)
(output . ,output)
(obsolete . #t)
(installed . #t))))
(append (manifest-entry->sexp entry) base))))
(define* (sexps-by-package package #:optional output
(entries (manifest-entries-by-name
manifest
(package-name package)
(package-version package))))
;; Assuming that PACKAGE has this OUTPUT.
(let ((pkg-alist (package->sexp package))
(address (object-address package))
(outputs (if output
(list output)
(package-outputs package))))
(map (lambda (output)
(output-sexp pkg-alist address output
(manifest-entry-by-output entries output)))
outputs)))
(define* (sexps-by-manifest-entry entry #:optional
(packages (manifest-entry->packages
entry)))
(if (null? packages)
(list (obsolete-output-sexp entry))
(map (lambda (package)
(output-sexp (package->sexp package)
(object-address package)
(manifest-entry-output entry)
entry))
packages)))
(define (->sexps pattern)
(match pattern
((? package? package)
(sexps-by-package package))
((package (? string? output))
(sexps-by-package package output))
((? manifest-entry? entry)
(list (obsolete-output-sexp entry)))
((package entry)
(sexps-by-manifest-entry entry (list package)))
((name version output)
(let ((packages (packages-by-name name version output)))
(if (null? packages)
(let ((entries (manifest-entries-by-name
manifest name version output)))
(append-map (cut sexps-by-manifest-entry <>)
entries))
(append-map (cut sexps-by-package <> output)
packages))))
(_ '())))
->sexps)
(define (entry-type-error entry-type)
(error (format #f "Wrong entry-type '~a'" entry-type)))
(define (search-type-error entry-type search-type)
(error (format #f "Wrong search type '~a' for entry-type '~a'"
search-type entry-type)))
(define %pattern-transformers
`((package . ,package-pattern-transformer)
(output . ,output-pattern-transformer)))
(define (pattern-transformer entry-type)
(assq-ref %pattern-transformers entry-type))
;; All procedures from inner alists are called with (MANIFEST . SEARCH-VALS)
;; as arguments; see `package/output-sexps'.
(define %patterns-makers
(let* ((apply-to-rest (lambda (proc)
(lambda (_ . rest) (apply proc rest))))
(apply-to-first (lambda (proc)
(lambda (first . _) (proc first))))
(manifest-package-proc (apply-to-first manifest-package-patterns))
(manifest-output-proc (apply-to-first manifest-output-patterns))
(regexp-proc (lambda (_ regexp params . __)
(packages-by-regexp regexp params)))
(all-proc (lambda _ (all-available-packages)))
(newest-proc (lambda _ (newest-available-packages))))
`((package
(id . ,(apply-to-rest ids->package-patterns))
(name . ,(apply-to-rest specifications->package-patterns))
(installed . ,manifest-package-proc)
(generation . ,manifest-package-proc)
(obsolete . ,(apply-to-first obsolete-package-patterns))
(regexp . ,regexp-proc)
(all-available . ,all-proc)
(newest-available . ,newest-proc))
(output
(id . ,(apply-to-rest ids->output-patterns))
(name . ,(apply-to-rest specifications->output-patterns))
(installed . ,manifest-output-proc)
(generation . ,manifest-output-proc)
(obsolete . ,(apply-to-first obsolete-output-patterns))
(regexp . ,regexp-proc)
(all-available . ,all-proc)
(newest-available . ,newest-proc)))))
(define (patterns-maker entry-type search-type)
(or (and=> (assq-ref %patterns-makers entry-type)
(cut assq-ref <> search-type))
(search-type-error entry-type search-type)))
(define (package/output-sexps profile params entry-type
search-type search-vals)
"Return information about packages or package outputs.
See 'entry-sexps' for details."
(let* ((profile (if (eq? search-type 'generation)
(generation-file-name profile (car search-vals))
profile))
(manifest (profile-manifest profile))
(patterns (if (and (eq? entry-type 'output)
(eq? search-type 'generation-diff))
(match search-vals
((g1 g2)
(map specification->output-pattern
(generation-difference profile g1 g2)))
(_ '()))
(apply (patterns-maker entry-type search-type)
manifest search-vals)))
(->sexps ((pattern-transformer entry-type) manifest params)))
(append-map ->sexps patterns)))
;;; Getting information about generations.
(define (generation-param-alist profile)
"Return an alist of generation parameters and procedures for PROFILE."
(let ((current (generation-number profile)))
`((id . ,identity)
(number . ,identity)
(prev-number . ,(cut previous-generation-number profile <>))
(current . ,(cut = current <>))
(path . ,(cut generation-file-name profile <>))
(time . ,(lambda (gen)
(time-second (generation-time profile gen)))))))
(define (matching-generations profile predicate)
"Return a list of PROFILE generations matching PREDICATE."
(filter predicate (profile-generations profile)))
(define (last-generations profile number)
"Return a list of last NUMBER generations.
If NUMBER is 0 or less, return all generations."
(let ((generations (profile-generations profile))
(number (if (<= number 0) +inf.0 number)))
(if (> (length generations) number)
(list-head (reverse generations) number)
generations)))
(define (find-generations profile search-type search-vals)
"Find PROFILE's generations matching SEARCH-TYPE and SEARCH-VALS."
(case search-type
((id)
(matching-generations profile (cut memq <> search-vals)))
((last)
(last-generations profile (car search-vals)))
((all)
(last-generations profile +inf.0))
((time)
(match search-vals
((from to)
(matching-generations
profile
(lambda (gen)
(let ((time (time-second (generation-time profile gen))))
(< from time to)))))
(_ '())))
(else (search-type-error "generation" search-type))))
(define (generation-sexps profile params search-type search-vals)
"Return information about generations.
See 'entry-sexps' for details."
(let ((generations (find-generations profile search-type search-vals))
(->sexp (object-transformer (generation-param-alist profile)
params)))
(map ->sexp generations)))
;;; Getting package/output/generation entries (alists).
(define (entries profile params entry-type search-type search-vals)
"Return information about entries.
ENTRY-TYPE is a symbol defining a type of returning information. Should
be: 'package', 'output' or 'generation'.
SEARCH-TYPE and SEARCH-VALS define how to get the information.
SEARCH-TYPE should be one of the following symbols:
- If ENTRY-TYPE is 'package' or 'output':
'id', 'name', 'regexp', 'all-available', 'newest-available',
'installed', 'obsolete', 'generation'.
- If ENTRY-TYPE is 'generation':
'id', 'last', 'all', 'time'.
PARAMS is a list of parameters for receiving. If it is an empty list,
get information with all available parameters, which are:
- If ENTRY-TYPE is 'package':
'id', 'name', 'version', 'outputs', 'license', 'synopsis',
'description', 'home-url', 'inputs', 'native-inputs',
'propagated-inputs', 'location', 'installed'.
- If ENTRY-TYPE is 'output':
'id', 'package-id', 'name', 'version', 'output', 'license',
'synopsis', 'description', 'home-url', 'inputs', 'native-inputs',
'propagated-inputs', 'location', 'installed', 'path', 'dependencies'.
- If ENTRY-TYPE is 'generation':
'id', 'number', 'prev-number', 'path', 'time'.
Returning value is a list of alists. Each alist consists of
parameter/value pairs."
(case entry-type
((package output)
(package/output-sexps profile params entry-type
search-type search-vals))
((generation)
(generation-sexps profile params
search-type search-vals))
(else (entry-type-error entry-type))))
;;; Package actions.
(define* (package->manifest-entry* package #:optional output)
(and package
(begin
(check-package-freshness package)
(package->manifest-entry package output))))
(define* (make-install-manifest-entries id #:optional output)
(package->manifest-entry* (package-by-id id) output))
(define* (make-upgrade-manifest-entries id #:optional output)
(package->manifest-entry* (newest-package-by-id id) output))
(define* (make-manifest-pattern id #:optional output)
"Make manifest pattern from a package ID and OUTPUT."
(let-values (((name version)
(id->name+version id)))
(and name version
(manifest-pattern
(name name)
(version version)
(output output)))))
(define (convert-action-pattern pattern proc)
"Convert action PATTERN into a list of objects returned by PROC.
PROC is called: (PROC ID) or (PROC ID OUTPUT)."
(match pattern
((id . outputs)
(if (null? outputs)
(let ((obj (proc id)))
(if obj (list obj) '()))
(filter-map (cut proc id <>)
outputs)))
(_ '())))
(define (convert-action-patterns patterns proc)
(append-map (cut convert-action-pattern <> proc)
patterns))
(define* (process-package-actions
profile #:key (install '()) (upgrade '()) (remove '())
(use-substitutes? #t) dry-run?)
"Perform package actions.
INSTALL, UPGRADE, REMOVE are lists of 'package action patterns'.
Each pattern should have the following form:
(ID . OUTPUTS)
ID is an object address or a full-name of a package.
OUTPUTS is a list of package outputs (may be an empty list)."
(format #t "The process begins ...~%")
(let* ((install (append
(convert-action-patterns
install make-install-manifest-entries)
(convert-action-patterns
upgrade make-upgrade-manifest-entries)))
(remove (convert-action-patterns remove make-manifest-pattern))
(transaction (manifest-transaction (install install)
(remove remove)))
(manifest (profile-manifest profile))
(new-manifest (manifest-perform-transaction
manifest transaction)))
(unless (and (null? install) (null? remove))
(with-store store
(let* ((derivation (run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(profile-derivation new-manifest))))
(derivations (list derivation))
(new-profile (derivation->output-path derivation)))
(set-build-options store
#:print-build-trace #f
#:use-substitutes? use-substitutes?)
(show-manifest-transaction store manifest transaction
#:dry-run? dry-run?)
(show-what-to-build store derivations
#:use-substitutes? use-substitutes?
#:dry-run? dry-run?)
(unless dry-run?
(let ((name (generation-file-name
profile
(+ 1 (generation-number profile)))))
(and (build-derivations store derivations)
(let* ((entries (manifest-entries new-manifest))
(count (length entries)))
(switch-symlinks name new-profile)
(switch-symlinks profile name)
(format #t (N_ "~a package in profile~%"
"~a packages in profile~%"
count)
count))))))))))
(define (delete-generations* profile generations)
"Delete GENERATIONS from PROFILE.
GENERATIONS is a list of generation numbers."
(with-store store
(delete-generations store profile generations)))
(define (package-source-derivation->store-path derivation)
"Return a store path of the package source DERIVATION."
(match (derivation-outputs derivation)
;; Source derivation is always (("out" . derivation)).
(((_ . output-drv))
(derivation-output-path output-drv))
(_ #f)))
(define (package-source-path package-id)
"Return a store file path to a source of a package PACKAGE-ID."
(and-let* ((package (package-by-id package-id))
(source (package-source package)))
(with-store store
(package-source-derivation->store-path
(package-source-derivation store source)))))
(define* (package-source-build-derivation package-id #:key dry-run?
(use-substitutes? #t))
"Build source derivation of a package PACKAGE-ID."
(and-let* ((package (package-by-id package-id))
(source (package-source package)))
(with-store store
(let* ((derivation (package-source-derivation store source))
(derivations (list derivation)))
(set-build-options store
#:print-build-trace #f
#:use-substitutes? use-substitutes?)
(show-what-to-build store derivations
#:use-substitutes? use-substitutes?
#:dry-run? dry-run?)
(unless dry-run?
(build-derivations store derivations))
(format #t "The source store path: ~a~%"
(package-source-derivation->store-path derivation))))))
-208
View File
@@ -1,208 +0,0 @@
;;; guix-messages.el --- Minibuffer messages
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides `guix-result-message' function used to show a
;; minibuffer message after displaying packages/generations in a
;; list/info buffer.
;;; Code:
(require 'cl-lib)
(require 'guix-utils)
(defvar guix-messages
`((package
(id
(0 "Packages not found.")
(1 "")
(many "%d packages." count))
(name
,(lambda (_ entries names)
(guix-message-packages-by-name entries 'package names)))
(regexp
(0 "No packages matching '%s'." val)
(1 "A single package matching '%s'." val)
(many "%d packages matching '%s'." count val))
(all-available
(0 "No packages are available for some reason.")
(1 "A single available package (that's strange).")
(many "%d available packages." count))
(newest-available
(0 "No packages are available for some reason.")
(1 "A single newest available package (that's strange).")
(many "%d newest available packages." count))
(installed
(0 "No packages installed in profile '%s'." profile)
(1 "A single package installed in profile '%s'." profile)
(many "%d packages installed in profile '%s'." count profile))
(obsolete
(0 "No obsolete packages in profile '%s'." profile)
(1 "A single obsolete package in profile '%s'." profile)
(many "%d obsolete packages in profile '%s'." count profile))
(generation
(0 "No packages installed in generation %d of profile '%s'."
val profile)
(1 "A single package installed in generation %d of profile '%s'."
val profile)
(many "%d packages installed in generation %d of profile '%s'."
count val profile)))
(output
(id
(0 "Package outputs not found.")
(1 "")
(many "%d package outputs." count))
(name
,(lambda (_ entries names)
(guix-message-packages-by-name entries 'output names)))
(regexp
(0 "No package outputs matching '%s'." val)
(1 "A single package output matching '%s'." val)
(many "%d package outputs matching '%s'." count val))
(all-available
(0 "No package outputs are available for some reason.")
(1 "A single available package output (that's strange).")
(many "%d available package outputs." count))
(newest-available
(0 "No package outputs are available for some reason.")
(1 "A single newest available package output (that's strange).")
(many "%d newest available package outputs." count))
(installed
(0 "No package outputs installed in profile '%s'." profile)
(1 "A single package output installed in profile '%s'." profile)
(many "%d package outputs installed in profile '%s'." count profile))
(obsolete
(0 "No obsolete package outputs in profile '%s'." profile)
(1 "A single obsolete package output in profile '%s'." profile)
(many "%d obsolete package outputs in profile '%s'." count profile))
(generation
(0 "No package outputs installed in generation %d of profile '%s'."
val profile)
(1 "A single package output installed in generation %d of profile '%s'."
val profile)
(many "%d package outputs installed in generation %d of profile '%s'."
count val profile))
(generation-diff
guix-message-outputs-by-diff))
(generation
(id
(0 "Generations not found.")
(1 "")
(many "%d generations." count))
(last
(0 "No generations in profile '%s'." profile)
(1 "The last generation of profile '%s'." profile)
(many "%d last generations of profile '%s'." count profile))
(all
(0 "No generations in profile '%s'." profile)
(1 "A single generation available in profile '%s'." profile)
(many "%d generations available in profile '%s'." count profile))
(time
guix-message-generations-by-time))))
(defun guix-message-string-name (name)
"Return a quoted name string."
(concat "'" name "'"))
(defun guix-message-string-entry-type (entry-type &optional plural)
"Return a string denoting an ENTRY-TYPE."
(cl-ecase entry-type
(package
(if plural "packages" "package"))
(output
(if plural "package outputs" "package output"))
(generation
(if plural "generations" "generation"))))
(defun guix-message-string-entries (count entry-type)
"Return a string denoting the COUNT of ENTRY-TYPE entries."
(cl-case count
(0 (concat "No "
(guix-message-string-entry-type
entry-type 'plural)))
(1 (concat "A single "
(guix-message-string-entry-type
entry-type)))
(t (format "%d %s"
count
(guix-message-string-entry-type
entry-type 'plural)))))
(defun guix-message-packages-by-name (entries entry-type names)
"Display a message for packages or outputs searched by NAMES."
(let* ((count (length entries))
(str-beg (guix-message-string-entries count entry-type))
(str-end (if (cdr names)
(concat "matching the following names: "
(mapconcat #'guix-message-string-name
names ", "))
(concat "with name "
(guix-message-string-name (car names))))))
(message "%s %s." str-beg str-end)))
(defun guix-message-generations-by-time (profile entries times)
"Display a message for generations searched by TIMES."
(let* ((count (length entries))
(str-beg (guix-message-string-entries count 'generation))
(time-beg (guix-get-time-string (car times)))
(time-end (guix-get-time-string (cadr times))))
(message (concat "%s of profile '%s'\n"
"matching time period '%s' - '%s'.")
str-beg profile time-beg time-end)))
(defun guix-message-outputs-by-diff (profile entries generations)
"Display a message for outputs searched by GENERATIONS difference."
(let* ((count (length entries))
(str-beg (guix-message-string-entries count 'output))
(gen1 (car generations))
(gen2 (cadr generations)))
(cl-multiple-value-bind (new old str-action)
(if (> gen1 gen2)
(list gen1 gen2 "added to")
(list gen2 gen1 "removed from"))
(message (concat "%s %s generation %d comparing with "
"generation %d of profile '%s'.")
str-beg str-action new old profile))))
(defun guix-result-message (profile entries entry-type
search-type search-vals)
"Display an appropriate message after displaying ENTRIES."
(let* ((type-spec (guix-get-key-val guix-messages
entry-type search-type))
(fun-or-count-spec (car type-spec)))
(if (functionp fun-or-count-spec)
(funcall fun-or-count-spec profile entries search-vals)
(let* ((count (length entries))
(count-key (if (> count 1) 'many count))
(msg-spec (guix-get-key-val type-spec count-key))
(msg (car msg-spec))
(args (cdr msg-spec)))
(mapc (lambda (subst)
(setq args (cl-substitute (cdr subst) (car subst) args)))
`((count . ,count)
(val . ,(car search-vals))
(profile . ,profile)))
(apply #'message msg args)))))
(provide 'guix-messages)
;;; guix-messages.el ends here
-204
View File
@@ -1,204 +0,0 @@
;;; guix-prettify.el --- Prettify Guix store file names
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This package provides minor-mode for prettifying Guix store file
;; names — i.e., after enabling `guix-prettify-mode',
;; '/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1' names will be
;; replaced with '/gnu/store/…-foo-0.1' in the current buffer. There is
;; also `global-guix-prettify-mode' for global prettifying.
;; To install, add the following to your emacs init file:
;;
;; (add-to-list 'load-path "/path/to/dir-with-guix-prettify")
;; (autoload 'guix-prettify-mode "guix-prettify" nil t)
;; (autoload 'global-guix-prettify-mode "guix-prettify" nil t)
;; If you want to enable/disable composition after "M-x font-lock-mode",
;; use the following setting:
;;
;; (setq font-lock-extra-managed-props
;; (cons 'composition font-lock-extra-managed-props))
;; Credits:
;;
;; Thanks to Ludovic Courtès for the idea of this package.
;;
;; Thanks to the authors of `prettify-symbols-mode' (part of Emacs 24.4)
;; and "pretty-symbols.el" <http://github.com/drothlis/pretty-symbols>
;; for the code. It helped to write this package.
;;; Code:
(defgroup guix-prettify nil
"Prettify Guix store file names."
:prefix "guix-prettify-"
:group 'font-lock
:group 'convenience)
(defcustom guix-prettify-char ?…
"Character used for prettifying."
:type 'character
:group 'guix-prettify)
(defcustom guix-prettify-decompose-force nil
"If non-nil, remove any composition.
By default, after disabling `guix-prettify-mode',
compositions (prettifying names with `guix-prettify-char') are
removed only from strings matching `guix-prettify-regexp', so
that compositions created by other modes are left untouched.
Set this variable to non-nil, if you want to remove any
composition unconditionally (like `prettify-symbols-mode' does).
Most likely it will do no harm and will make the process of
disabling `guix-prettify-mode' a little faster."
:type 'boolean
:group 'guix-prettify)
(defcustom guix-prettify-regexp
(rx "/"
(or "nix" "gnu")
"/store/"
;; Hash-parts do not include "e", "o", "u" and "t". See base32Chars
;; at <https://github.com/NixOS/nix/blob/master/src/libutil/hash.cc>
(group (= 32 (any "0-9" "a-d" "f-n" "p-s" "v-z"))))
"Regexp matching file names for prettifying.
Disable `guix-prettify-mode' before modifying this variable and
make sure to modify `guix-prettify-regexp-group' if needed.
Example of a \"deeper\" prettifying:
(setq guix-prettify-regexp \"store/[[:alnum:]]\\\\\\={32\\\\}\"
guix-prettify-regexp-group 0)
This will transform
'/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1' into
'/gnu/…-foo-0.1'"
:type 'regexp
:group 'guix-prettify)
(defcustom guix-prettify-regexp-group 1
"Regexp group in `guix-prettify-regexp' for prettifying."
:type 'integer
:group 'guix-prettify)
(defvar guix-prettify-special-modes
'(guix-info-mode ibuffer-mode)
"List of special modes that support font-locking.
By default, \\[global-guix-prettify-mode] enables prettifying in
all buffers except the ones where `font-lock-defaults' is
nil (see Info node `(elisp) Font Lock Basics'), because it may
break the existing highlighting.
Modes from this list and all derived modes are exceptions
\(`global-guix-prettify-mode' enables prettifying there).")
(defvar guix-prettify-flush-function
(cond ((fboundp 'font-lock-flush) #'font-lock-flush)
((fboundp 'jit-lock-refontify) #'jit-lock-refontify))
"Function used to refontify buffer.
This function is called without arguments after
enabling/disabling `guix-prettify-mode'. If nil, do nothing.")
(defun guix-prettify-compose ()
"Compose matching region in the current buffer."
(let ((beg (match-beginning guix-prettify-regexp-group))
(end (match-end guix-prettify-regexp-group)))
(compose-region beg end guix-prettify-char 'decompose-region))
;; Return nil because we're not adding any face property.
nil)
(defun guix-prettify-decompose-buffer ()
"Remove file names compositions from the current buffer."
(with-silent-modifications
(let ((inhibit-read-only t))
(if guix-prettify-decompose-force
(remove-text-properties (point-min)
(point-max)
'(composition nil))
(save-excursion
(goto-char (point-min))
(while (re-search-forward guix-prettify-regexp nil t)
(remove-text-properties
(match-beginning guix-prettify-regexp-group)
(match-end guix-prettify-regexp-group)
'(composition nil))))))))
;;;###autoload
(define-minor-mode guix-prettify-mode
"Toggle Guix Prettify mode.
With a prefix argument ARG, enable Guix Prettify mode if ARG is
positive, and disable it otherwise. If called from Lisp, enable
the mode if ARG is omitted or nil.
When Guix Prettify mode is enabled, hash-parts of the Guix store
file names (see `guix-prettify-regexp') are prettified,
i.e. displayed as `guix-prettify-char' character. This mode can
be enabled programmatically using hooks:
(add-hook 'shell-mode-hook 'guix-prettify-mode)
It is possible to enable the mode in any buffer, however not any
buffer's highlighting may survive after adding new elements to
`font-lock-keywords' (see `guix-prettify-special-modes' for
details).
Also you can use `global-guix-prettify-mode' to enable Guix
Prettify mode for all modes that support font-locking."
:init-value nil
:lighter ""
(let ((keywords `((,guix-prettify-regexp
(,guix-prettify-regexp-group
(guix-prettify-compose))))))
(if guix-prettify-mode
;; Turn on.
(font-lock-add-keywords nil keywords)
;; Turn off.
(font-lock-remove-keywords nil keywords)
(guix-prettify-decompose-buffer))
(and guix-prettify-flush-function
(funcall guix-prettify-flush-function))))
(defun guix-prettify-supported-p ()
"Return non-nil, if the mode can be harmlessly enabled in current buffer."
(or font-lock-defaults
(apply #'derived-mode-p guix-prettify-special-modes)))
(defun guix-prettify-turn-on ()
"Enable `guix-prettify-mode' in the current buffer if needed.
See `guix-prettify-special-modes' for details."
(and (not guix-prettify-mode)
(guix-prettify-supported-p)
(guix-prettify-mode)))
;;;###autoload
(define-globalized-minor-mode global-guix-prettify-mode
guix-prettify-mode guix-prettify-turn-on)
;;;###autoload
(defalias 'guix-prettify-global-mode 'global-guix-prettify-mode)
(provide 'guix-prettify)
;;; guix-prettify.el ends here
-62
View File
@@ -1,62 +0,0 @@
;;; guix-profiles.el --- Guix profiles
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Code:
(defvar guix-user-profile
(expand-file-name "~/.guix-profile")
"User profile.")
(defvar guix-default-profile
(concat (or (getenv "NIX_STATE_DIR") "@guix_localstatedir@/guix")
"/profiles/per-user/"
(getenv "USER")
"/guix-profile")
"Default Guix profile.")
(defvar guix-current-profile guix-default-profile
"Current profile.")
(defun guix-profile-prompt (&optional default)
"Prompt for profile and return it.
Use DEFAULT as a start directory. If it is nil, use
`guix-current-profile'."
(let* ((path (read-file-name "Profile: "
(file-name-directory
(or default guix-current-profile))))
(path (directory-file-name (expand-file-name path))))
(if (string= path guix-user-profile)
guix-default-profile
path)))
(defun guix-set-current-profile (path)
"Set `guix-current-profile' to PATH.
Interactively, prompt for PATH. With prefix, use
`guix-default-profile'."
(interactive
(list (if current-prefix-arg
guix-default-profile
(guix-profile-prompt))))
(setq guix-current-profile path)
(message "Current profile has been set to '%s'."
guix-current-profile))
(provide 'guix-profiles)
;;; guix-profiles.el ends here
-175
View File
@@ -1,175 +0,0 @@
;;; guix-utils.el --- General utility functions
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; This file is part of GNU Guix.
;; GNU Guix is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Guix is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides auxiliary general functions for guix.el package.
;;; Code:
(require 'cl-lib)
(defvar guix-true-string "Yes")
(defvar guix-false-string "")
(defvar guix-list-separator ", ")
(defvar guix-time-format "%F %T"
"String used to format time values.
For possible formats, see `format-time-string'.")
(defun guix-get-string (val &optional face)
"Convert VAL into a string and return it.
VAL can be an expression of any type.
If VAL is t/nil, it is replaced with
`guix-true-string'/`guix-false-string'.
If VAL is list, its elements are concatenated using
`guix-list-separator'.
If FACE is non-nil, propertize returned string with this FACE."
(let ((str (cond
((stringp val) val)
((null val) guix-false-string)
((eq t val) guix-true-string)
((numberp val) (number-to-string val))
((listp val) (mapconcat #'guix-get-string
val guix-list-separator))
(t (prin1-to-string val)))))
(if (and val face)
(propertize str 'font-lock-face face)
str)))
(defun guix-get-time-string (seconds)
"Return formatted time string from SECONDS.
Use `guix-time-format'."
(format-time-string guix-time-format (seconds-to-time seconds)))
(defun guix-get-one-line (str)
"Return one-line string from a multi-line STR."
(replace-regexp-in-string "\n" " " str))
(defun guix-format-insert (val &optional face format)
"Convert VAL into a string and insert it at point.
If FACE is non-nil, propertize VAL with FACE.
If FORMAT is non-nil, format VAL with FORMAT."
(let ((str (guix-get-string val face)))
(insert (if format
(format format str)
str))))
(defun guix-mapinsert (function sequence separator)
"Like `mapconcat' but for inserting text.
Apply FUNCTION to each element of SEQUENCE, and insert SEPARATOR
at point between each FUNCTION call."
(when sequence
(funcall function (car sequence))
(mapc (lambda (obj)
(insert separator)
(funcall function obj))
(cdr sequence))))
(defun guix-insert-button (label &optional type &rest properties)
"Make button of TYPE with LABEL and insert it at point.
See `insert-text-button' for the meaning of PROPERTIES."
(if (null label)
(guix-format-insert nil)
(apply #'insert-text-button label
:type (or type 'button)
properties)))
(defun guix-split-insert (val &optional face col separator)
"Convert VAL into a string, split it and insert at point.
If FACE is non-nil, propertize returned string with this FACE.
If COL is non-nil and result string is a one-line string longer
than COL, split it into several short lines.
Separate inserted lines with SEPARATOR."
(if (null val)
(guix-format-insert nil)
(let ((strings (guix-split-string (guix-get-string val) col)))
(guix-mapinsert (lambda (str) (guix-format-insert str face))
strings
(or separator "")))))
(defun guix-split-string (str &optional col)
"Split string STR by lines and return list of result strings.
If COL is non-nil and STR is a one-line string longer than COL,
split it into several short lines."
(let ((strings (split-string str "\n *")))
(if (and col
(null (cdr strings)) ; if not multi-line
(> (length str) col))
(split-string (guix-get-filled-string str col) "\n")
strings)))
(defun guix-get-filled-string (str col)
"Return string by filling STR to column COL."
(with-temp-buffer
(insert str)
(let ((fill-column col))
(fill-region (point-min) (point-max)))
(buffer-string)))
(defun guix-completing-read-multiple (prompt table &optional predicate
require-match initial-input
hist def inherit-input-method)
"Same as `completing-read-multiple' but remove duplicates in result."
(cl-remove-duplicates
(completing-read-multiple prompt table predicate
require-match initial-input
hist def inherit-input-method)
:test #'string=))
(declare-function org-read-date "org" t)
(defun guix-read-date (prompt)
"Prompt for a date or time using `org-read-date'.
Return time value."
(require 'org)
(org-read-date nil t nil prompt))
(defun guix-get-key-val (alist &rest keys)
"Return value from ALIST by KEYS.
ALIST is alist of alists of alists ... which can be consecutively
accessed with KEYS."
(let ((val alist))
(dolist (key keys val)
(setq val (cdr (assq key val))))))
(defun guix-find-file (file)
"Find FILE if it exists."
(if (file-exists-p file)
(find-file file)
(message "File '%s' does not exist." file)))
;;; Diff
(defvar guix-diff-switches "-u"
"A string or list of strings specifying switches to be passed to diff.")
(defun guix-diff (old new &optional switches no-async)
"Same as `diff', but use `guix-diff-switches' as default."
(diff old new (or switches guix-diff-switches) no-async))
(provide 'guix-utils)
;;; guix-utils.el ends here
-198
View File
@@ -1,198 +0,0 @@
;;; guix.el --- Interface for GNU Guix package manager
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;; Package-Requires: ((geiser "0.3"))
;; Keywords: tools
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This package provides an interface for searching, listing and getting
;; information about Guix packages and generations; and for
;; installing/upgrading/removing packages.
;;; Code:
(require 'guix-base)
(require 'guix-list)
(require 'guix-info)
(require 'guix-utils)
(defgroup guix nil
"Interface for Guix package manager."
:prefix "guix-"
:group 'external)
(defcustom guix-list-single-package nil
"If non-nil, list a package even if it is the only matching result.
If nil, show a single package in the info buffer."
:type 'boolean
:group 'guix)
(defvar guix-search-params '(name synopsis description)
"Default list of package parameters for searching by regexp.")
(defvar guix-search-history nil
"A history of minibuffer prompts.")
(defun guix-get-show-packages (profile search-type &rest search-vals)
"Search for packages and show results.
If PROFILE is nil, use `guix-current-profile'.
See `guix-get-entries' for the meaning of SEARCH-TYPE and
SEARCH-VALS.
Results are displayed in the list buffer, unless a single package
is found and `guix-list-single-package' is nil."
(or profile (setq profile guix-current-profile))
(let ((packages (guix-get-entries profile guix-package-list-type
search-type search-vals
(guix-get-params-for-receiving
'list guix-package-list-type))))
(if (or guix-list-single-package
(cdr packages))
(guix-set-buffer profile packages 'list guix-package-list-type
search-type search-vals)
(let ((packages (guix-get-entries profile guix-package-info-type
search-type search-vals
(guix-get-params-for-receiving
'info guix-package-info-type))))
(guix-set-buffer profile packages 'info guix-package-info-type
search-type search-vals)))))
(defun guix-get-show-generations (profile search-type &rest search-vals)
"Search for generations and show results.
If PROFILE is nil, use `guix-current-profile'.
See `guix-get-entries' for the meaning of SEARCH-TYPE and
SEARCH-VALS."
(apply #'guix-get-show-entries
(or profile guix-current-profile)
'list 'generation search-type search-vals))
;;;###autoload
(defun guix-search-by-name (name &optional profile)
"Search for Guix packages by NAME.
NAME is a string with name specification. It may optionally contain
a version number. Examples: \"guile\", \"guile-2.0.11\".
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (read-string "Package name: " nil 'guix-search-history)
(and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-packages profile 'name name))
;;;###autoload
(defun guix-search-by-regexp (regexp &optional params profile)
"Search for Guix packages by REGEXP.
PARAMS are package parameters that should be searched.
If PARAMS are not specified, use `guix-search-params'.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (read-regexp "Regexp: " nil 'guix-search-history)
nil
(and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-packages profile 'regexp regexp
(or params guix-search-params)))
;;;###autoload
(defun guix-installed-packages (&optional profile)
"Display information about installed Guix packages.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-packages profile 'installed))
;;;###autoload
(defun guix-obsolete-packages (&optional profile)
"Display information about obsolete Guix packages.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-packages profile 'obsolete))
;;;###autoload
(defun guix-all-available-packages (&optional profile)
"Display information about all available Guix packages.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-packages profile 'all-available))
;;;###autoload
(defun guix-newest-available-packages (&optional profile)
"Display information about the newest available Guix packages.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-packages profile 'newest-available))
;;;###autoload
(defun guix-generations (&optional profile)
"Display information about all generations.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-generations profile 'all))
;;;###autoload
(defun guix-last-generations (number &optional profile)
"Display information about last NUMBER generations.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (read-number "The number of last generations: ")
(and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-generations profile 'last number))
;;;###autoload
(defun guix-generations-by-time (from to &optional profile)
"Display information about generations created between FROM and TO.
FROM and TO should be time values.
If PROFILE is nil, use `guix-current-profile'.
Interactively with prefix, prompt for PROFILE."
(interactive
(list (guix-read-date "Find generations (from): ")
(guix-read-date "Find generations (to): ")
(and current-prefix-arg
(guix-profile-prompt))))
(guix-get-show-generations profile 'time
(float-time from)
(float-time to)))
(provide 'guix)
;;; guix.el ends here
-139
View File
@@ -1,139 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2015 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/>.
# Bash completion for Guix commands.
_guix_complete_available_package ()
{
local prefix="$1"
local packages="$(${COMP_WORDS[0]} package -A "^$prefix" | cut -f1)"
COMPREPLY=($(compgen -W "$packages" -- "$prefix"))
}
_guix_complete_installed_package ()
{
local prefix="$1"
local packages="$(${COMP_WORDS[0]} package -I "^$prefix" | cut -f1)"
COMPREPLY=($(compgen -W "$packages" -- "$prefix"))
}
_guix_complete_option ()
{
local options="$(${COMP_WORDS[0]} ${COMP_WORDS[1]} --help \
| grep '^ \+-' \
| sed -e's/^.*--\([a-zA-Z0-9_-]\+\)\(=\?\).*/--\1\2/g' )"
compopt -o nospace
COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[$word_count - 1]}"))
}
_guix_is_command ()
{
local word
local result="false"
for word in ${COMP_WORDS[*]}
do
if [ "$word" = "$1" ]
then
result=true
break
fi
done
$result
}
_guix_is_removing ()
{
local word
local result="false"
for word in ${COMP_WORDS[*]}
do
case "$word" in
--remove|--remove=*|-r)
result=true
break
;;
esac
done
$result
}
_guix_is_dash_L ()
{
[ "${COMP_WORDS[$COMP_CWORD - 1]}" = "-L" ] \
|| { case "${COMP_WORDS[$COMP_CWORD]}" in
--load-path=*) true;;
*) false;;
esac }
}
_guix_complete_file ()
{
# Let Readline complete file names.
compopt -o default
COMPREPLY=()
}
_guix_complete ()
{
local word_count=${#COMP_WORDS[*]}
local word_at_point="${COMP_WORDS[$COMP_CWORD]}"
if [ "$COMP_CWORD" -gt 1 ]
then
case "$word_at_point" in
-*)
_guix_complete_option "$word_at_point"
return
;;
esac
fi
case $COMP_CWORD in
1)
local subcommands="$(guix --help | grep '^ ' | cut -c 2-)"
COMPREPLY=($(compgen -W "$subcommands" -- "$word_at_point"))
;;
*)
if _guix_is_command "package"
then
if _guix_is_dash_L
then
_guix_complete_file
elif _guix_is_removing
then
_guix_complete_installed_package "$word_at_point"
else
_guix_complete_available_package "$word_at_point"
fi
elif _guix_is_command "system"
then
_guix_complete_file # TODO: complete sub-commands
elif _guix_is_command "hash"
then
_guix_complete_file
elif _guix_is_command "import" # TODO: complete sub-commands
then
_guix_complete_file
else
_guix_complete_available_package "$word_at_point"
fi
;;
esac
}
complete -F _guix_complete guix
+25
View File
@@ -0,0 +1,25 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZWoqJxYJKwYBBAHaRw8BAQdAtZriklnl31QZtFUquLh9zZkvD9ISy8LvIsxj
r3yLdD/NGWdvb2RvbGRwYXVsQGF1dGlzdGljaS5vcmfClgQTFgoAPhYhBI0QYLlr
uCkugptySa7UHMGTtwHiBQJlaionAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMB
Ah4BAheAAAoJEK7UHMGTtwHiUAgBAMYrBit4inzbz7KdG5S/PLLDHJTlftTGJFJK
SjVR+04LAQCCB3yctJKVQ5/vh0ZFen7JEoux5Vo7MvTlsoNYOyf4BM44BGVqKicS
CisGAQQBl1UBBQEBB0A9/mYMc/o3nBUqOIgmV19LurQYtPOBSeTVBFCPDPUVNQMB
CAfCeAQYFgoAIBYhBI0QYLlruCkugptySa7UHMGTtwHiBQJlaionAhsMAAoJEK7U
HMGTtwHivtYBAPwpUkeDhJgkKiqXV66HLnlEWPi3gW/5VTN5qda9ZBLlAQDCxDi0
DaGIjBbPHkqKEX4uRmtN2yFBKjIlPDz+YkEFBsYzBGkc/agWCSsGAQQB2kcPAQEH
QDzYI5IkjfX/2Hj5FM0r9QqDeOm319xxiO3YB+lnjp19zTBHaWFjb21vIExlaWRp
IDx0aGVyZXdhc2FAZmlzaGludGhlY2FsY3VsYXRvci5tZT7CmQQTFgoAQRYhBFDh
e+DSEMiD1nUxUEo9B+/QXEBFBQJpHP2oAhsDBQkFo5qABQsJCAcCAiICBhUKCQgL
AgQWAgMBAh4HAheAAAoJEEo9B+/QXEBF0K4BAKhYxsIiNUaYCcp46n6PY5dBT1e0
DCwDX4HZHqT4Eft3AP9R+ROt7bFu/LS/KepD/SVvX66PrHfPHFp974gHyqiDC8J1
BBAWCgAdFiEEjRBguWu4KS6Cm3JJrtQcwZO3AeIFAmkc/toACgkQrtQcwZO3AeJ7
UwD/dKLj2FJIOFk9WSaVY6XObqCtWYZ9xOzQrYsQMIS8F8EBAOV36k4kbLwpuvgd
6zjjyoeNEJLqAWpedddJowpE/3kIzjgEaRz9qBIKKwYBBAGXVQEFAQEHQJadfcFx
0NANcJ6yMU+u6QAr4cxaJINqydAtR44GEWg4AwEIB8J+BBgWCgAmFiEEUOF74NIQ
yIPWdTFQSj0H79BcQEUFAmkc/agCGwwFCQWjmoAACgkQSj0H79BcQEWRlQD+Lxqi
tOzsAjGMeoj3IdAbLcqjb0XfHmRlohkrZaOOZ64BAKk8Lr60fw967oa0wgvjuNDJ
F3++09Bhv8aN1NJFT/wC
=B3ji
-----END PGP PUBLIC KEY BLOCK-----
+23
View File
@@ -0,0 +1,23 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZ6ZvYBYJKwYBBAHaRw8BAQdAPCr0v0TSV+TqyrzkzBYzGn2WcISQg/U3azeZ
Oo5JKmW0IVN0ZXZlIEdlb3JnZSA8c3RldmVAZnV0dXJpbGUubmV0PoiRBBMWCgA5
AhsBAheABAsJCAcFFQoJCAsEFgIDAQIeBRYhBNG9Hre2Va7OC6ePlElAfn6JypsH
BQJnpnTqAhkBAAoJEElAfn6JypsH4qAA/2pBKJz8oHjc0oGU6sZounN49yQXxRwe
gEJQBgTFdwwTAQCwTH+jmClGrLiZvQ7e9B8BPKVHHsy/dYiNq1NBEbGtDrQgU3Rl
dmUgR2VvcmdlIDxndWl4QGZ1dHVyaWxlLm5ldD6IjgQTFgoANgIbAQQLCQgHBRUK
CQgLBBYCAwECHgUCF4AWIQTRvR63tlWuzgunj5RJQH5+icqbBwUCZ6Z06gAKCRBJ
QH5+icqbB2JlAQCe55IEtSZrEOnJyxBTxrMJ5yvHYMjlOEQL/iBPoQGI7wEArqtX
mnEoP5yqizN7w1VPtlHK9/f2G1KeY5pNwSchxQO4OARnpngSEgorBgEEAZdVAQUB
AQdADQwagCoUtjddSYyLMimjsAOdgXtB9E4Vd00tEKOGI1UDAQgHiH4EGBYKACYW
IQTRvR63tlWuzgunj5RJQH5+icqbBwUCZ6Z4EgIbDAUJBaOagAAKCRBJQH5+icqb
B2ZNAQDeHHWhcMAg4OP/QJ+n6yLCiCFNSmcQF3Rbap4bhZDS5QEAnOhj8n6UIz2L
8LeJSGfeygcOKF4zXUOvgKSdQ+W+VQm4MwRnpnpDFgkrBgEEAdpHDwEBB0C+Ca99
GZl2q4Ys2pDoSXevmSIjNc+2QLfFAs9q8oeeeIj1BBgWCgAmAhsCFiEE0b0et7ZV
rs4Lp4+USUB+fonKmwcFAmensL8FCQWk0PwAgXYgBBkWCgAdFiEECAesdt/oQwNt
X1h59R1KFtzub6cFAmemekMACgkQ9R1KFtzub6fCuAEA1hT6JamlCyYf6gwGVp6i
JCgPETtJkXBEmC7SfP8Vdm4A/jjhzX6uBKHi3NHC1ddg65y27flMCNSBKk7PRXOC
W3MFCRBJQH5+icqbBwZGAP41zEb+B6vWPr1qu0EUnWjuzvJ6SFpA29Soo2cGC8Om
fQD+IH7b1o6FjPM1wypGoYcqtDJrbu2XTm5cvPq24bRnNAI=
=pdD+
-----END PGP PUBLIC KEY BLOCK-----
+13
View File
@@ -0,0 +1,13 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEaG18eRYJKwYBBAHaRw8BAQdASa/U2vPjyirIBNdWZu3TpMU/2gHiPezdWwle
EmNS+XHNIkdhYnJpZWwgV2lja2kgPGdhYnJpZWxAZXJsaWtvbi5jaD7CkwQTFgoA
OxYhBOQmfNH8PulZfwdC+cyY6fBDMP1/BQJobXx5AhsDBQsJCAcCAiICBhUKCQgL
AgQWAgMBAh4HAheAAAoJEMyY6fBDMP1//fgA/084FmSOXIosWtcdAidA8ZtIX/Z1
S1IPCCmDs+MwDUvLAQDqqvyg8An32ybyBz7ZbSMG3vuP9IWqgDdVJQlc3R2yCs44
BGhtfHkSCisGAQQBl1UBBQEBB0B7puMePYJoW2OgiXStEQWNdaB8mrE7gUDDHimo
A8zaRQMBCAfCeAQYFgoAIBYhBOQmfNH8PulZfwdC+cyY6fBDMP1/BQJobXx5AhsM
AAoJEMyY6fBDMP1/DLwA/0y2hyBG16AJNwt16qlt1WAoOv8rstRiv+c7NUiEeHKN
AP9OpGrGXgNcNxSBVKCJoF6fpukRuHUdp2jYkHT3vy2HAw==
=FRjL
-----END PGP PUBLIC KEY BLOCK-----
+72
View File
@@ -0,0 +1,72 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
joMvXAA=
=rqfr
-----END PGP PUBLIC KEY BLOCK-----
-682
View File
@@ -1,682 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
# Copyright © 2013, 2014, 2015 Mark H Weaver <mhw@netris.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/>.
# Definitions for the GNU System: package modules, patches, bootstrap
# binaries.
GNU_SYSTEM_MODULES = \
gnu.scm \
gnu/artwork.scm \
gnu/packages.scm \
gnu/packages/aarddict.scm \
gnu/packages/abiword.scm \
gnu/packages/acct.scm \
gnu/packages/acl.scm \
gnu/packages/admin.scm \
gnu/packages/adns.scm \
gnu/packages/algebra.scm \
gnu/packages/aidc.scm \
gnu/packages/apl.scm \
gnu/packages/apr.scm \
gnu/packages/asciidoc.scm \
gnu/packages/aspell.scm \
gnu/packages/attr.scm \
gnu/packages/audacity.scm \
gnu/packages/audio.scm \
gnu/packages/autogen.scm \
gnu/packages/autotools.scm \
gnu/packages/avahi.scm \
gnu/packages/avr.scm \
gnu/packages/backup.scm \
gnu/packages/base.scm \
gnu/packages/bash.scm \
gnu/packages/bdw-gc.scm \
gnu/packages/bioinformatics.scm \
gnu/packages/bittorrent.scm \
gnu/packages/bison.scm \
gnu/packages/boost.scm \
gnu/packages/bootstrap.scm \
gnu/packages/busybox.scm \
gnu/packages/calcurse.scm \
gnu/packages/ccache.scm \
gnu/packages/cdrom.scm \
gnu/packages/certs.scm \
gnu/packages/check.scm \
gnu/packages/cmake.scm \
gnu/packages/code.scm \
gnu/packages/commencement.scm \
gnu/packages/compression.scm \
gnu/packages/conkeror.scm \
gnu/packages/cook.scm \
gnu/packages/cpio.scm \
gnu/packages/cppi.scm \
gnu/packages/cross-base.scm \
gnu/packages/crypto.scm \
gnu/packages/cryptsetup.scm \
gnu/packages/cups.scm \
gnu/packages/curl.scm \
gnu/packages/cursynth.scm \
gnu/packages/cyrus-sasl.scm \
gnu/packages/databases.scm \
gnu/packages/datamash.scm \
gnu/packages/dc.scm \
gnu/packages/debug.scm \
gnu/packages/dejagnu.scm \
gnu/packages/dictionaries.scm \
gnu/packages/disk.scm \
gnu/packages/djvu.scm \
gnu/packages/dns.scm \
gnu/packages/docbook.scm \
gnu/packages/doxygen.scm \
gnu/packages/dwm.scm \
gnu/packages/ebook.scm \
gnu/packages/ed.scm \
gnu/packages/elf.scm \
gnu/packages/emacs.scm \
gnu/packages/enchant.scm \
gnu/packages/engineering.scm \
gnu/packages/enlightenment.scm \
gnu/packages/fcitx.scm \
gnu/packages/feh.scm \
gnu/packages/file.scm \
gnu/packages/firmware.scm \
gnu/packages/fish.scm \
gnu/packages/flashing-tools.scm \
gnu/packages/flex.scm \
gnu/packages/fltk.scm \
gnu/packages/fonts.scm \
gnu/packages/fontutils.scm \
gnu/packages/freedesktop.scm \
gnu/packages/freeipmi.scm \
gnu/packages/ftp.scm \
gnu/packages/fribidi.scm \
gnu/packages/fvwm.scm \
gnu/packages/game-development.scm \
gnu/packages/games.scm \
gnu/packages/gawk.scm \
gnu/packages/gcal.scm \
gnu/packages/gcc.scm \
gnu/packages/gd.scm \
gnu/packages/gdb.scm \
gnu/packages/gdbm.scm \
gnu/packages/geeqie.scm \
gnu/packages/gettext.scm \
gnu/packages/ghostscript.scm \
gnu/packages/gimp.scm \
gnu/packages/gkrellm.scm \
gnu/packages/gl.scm \
gnu/packages/glib.scm \
gnu/packages/gnome.scm \
gnu/packages/gnucash.scm \
gnu/packages/gnunet.scm \
gnu/packages/gnupg.scm \
gnu/packages/gnustep.scm \
gnu/packages/gnutls.scm \
gnu/packages/gnuzilla.scm \
gnu/packages/gnu-pw-mgr.scm \
gnu/packages/gperf.scm \
gnu/packages/gprolog.scm \
gnu/packages/gps.scm \
gnu/packages/graphics.scm \
gnu/packages/graphviz.scm \
gnu/packages/groff.scm \
gnu/packages/grub.scm \
gnu/packages/grue-hunter.scm \
gnu/packages/gsasl.scm \
gnu/packages/gstreamer.scm \
gnu/packages/gtk.scm \
gnu/packages/guile.scm \
gnu/packages/guile-wm.scm \
gnu/packages/gv.scm \
gnu/packages/gxmessage.scm \
gnu/packages/haskell.scm \
gnu/packages/hugs.scm \
gnu/packages/hurd.scm \
gnu/packages/ibus.scm \
gnu/packages/icu4c.scm \
gnu/packages/idutils.scm \
gnu/packages/image.scm \
gnu/packages/imagemagick.scm \
gnu/packages/indent.scm \
gnu/packages/inkscape.scm \
gnu/packages/irssi.scm \
gnu/packages/iso-codes.scm \
gnu/packages/java.scm \
gnu/packages/jemalloc.scm \
gnu/packages/jrnl.scm \
gnu/packages/julia.scm \
gnu/packages/kde.scm \
gnu/packages/key-mon.scm \
gnu/packages/language.scm \
gnu/packages/less.scm \
gnu/packages/lesstif.scm \
gnu/packages/libcanberra.scm \
gnu/packages/libdaemon.scm \
gnu/packages/libedit.scm \
gnu/packages/libevent.scm \
gnu/packages/libffcall.scm \
gnu/packages/libffi.scm \
gnu/packages/libftdi.scm \
gnu/packages/calendar.scm \
gnu/packages/libidn.scm \
gnu/packages/libphidget.scm \
gnu/packages/libreoffice.scm \
gnu/packages/libsigsegv.scm \
gnu/packages/libunistring.scm \
gnu/packages/libusb.scm \
gnu/packages/libunwind.scm \
gnu/packages/libupnp.scm \
gnu/packages/lightning.scm \
gnu/packages/links.scm \
gnu/packages/linux.scm \
gnu/packages/lirc.scm \
gnu/packages/lisp.scm \
gnu/packages/llvm.scm \
gnu/packages/lout.scm \
gnu/packages/lsh.scm \
gnu/packages/lsof.scm \
gnu/packages/lua.scm \
gnu/packages/lxqt.scm \
gnu/packages/lynx.scm \
gnu/packages/m4.scm \
gnu/packages/man.scm \
gnu/packages/mail.scm \
gnu/packages/make-bootstrap.scm \
gnu/packages/maths.scm \
gnu/packages/mc.scm \
gnu/packages/mcrypt.scm \
gnu/packages/messaging.scm \
gnu/packages/mg.scm \
gnu/packages/miscfiles.scm \
gnu/packages/mit-krb5.scm \
gnu/packages/moe.scm \
gnu/packages/moreutils.scm \
gnu/packages/mpd.scm \
gnu/packages/mp3.scm \
gnu/packages/mpi.scm \
gnu/packages/multiprecision.scm \
gnu/packages/music.scm \
gnu/packages/mtools.scm \
gnu/packages/nano.scm \
gnu/packages/ncdu.scm \
gnu/packages/ncurses.scm \
gnu/packages/netpbm.scm \
gnu/packages/nettle.scm \
gnu/packages/networking.scm \
gnu/packages/ninja.scm \
gnu/packages/node.scm \
gnu/packages/noweb.scm \
gnu/packages/ntp.scm \
gnu/packages/nutrition.scm \
gnu/packages/nvi.scm \
gnu/packages/ocaml.scm \
gnu/packages/ocr.scm \
gnu/packages/onc-rpc.scm \
gnu/packages/openbox.scm \
gnu/packages/openldap.scm \
gnu/packages/openssl.scm \
gnu/packages/orpheus.scm \
gnu/packages/ots.scm \
gnu/packages/package-management.scm \
gnu/packages/parallel.scm \
gnu/packages/patchutils.scm \
gnu/packages/pciutils.scm \
gnu/packages/pcre.scm \
gnu/packages/pdf.scm \
gnu/packages/pem.scm \
gnu/packages/perl.scm \
gnu/packages/photo.scm \
gnu/packages/pkg-config.scm \
gnu/packages/plotutils.scm \
gnu/packages/polkit.scm \
gnu/packages/popt.scm \
gnu/packages/pth.scm \
gnu/packages/pulseaudio.scm \
gnu/packages/pumpio.scm \
gnu/packages/pretty-print.scm \
gnu/packages/protobuf.scm \
gnu/packages/python.scm \
gnu/packages/qemu.scm \
gnu/packages/qt.scm \
gnu/packages/ratpoison.scm \
gnu/packages/rdesktop.scm \
gnu/packages/rdf.scm \
gnu/packages/readline.scm \
gnu/packages/rrdtool.scm \
gnu/packages/rsync.scm \
gnu/packages/ruby.scm \
gnu/packages/rush.scm \
gnu/packages/samba.scm \
gnu/packages/sawfish.scm \
gnu/packages/scanner.scm \
gnu/packages/scheme.scm \
gnu/packages/screen.scm \
gnu/packages/sdl.scm \
gnu/packages/search.scm \
gnu/packages/serveez.scm \
gnu/packages/shishi.scm \
gnu/packages/skribilo.scm \
gnu/packages/slang.scm \
gnu/packages/slim.scm \
gnu/packages/smalltalk.scm \
gnu/packages/ssh.scm \
gnu/packages/stalonetray.scm \
gnu/packages/statistics.scm \
gnu/packages/swig.scm \
gnu/packages/sxiv.scm \
gnu/packages/synergy.scm \
gnu/packages/task-management.scm \
gnu/packages/tbb.scm \
gnu/packages/tcl.scm \
gnu/packages/tcsh.scm \
gnu/packages/telephony.scm \
gnu/packages/texinfo.scm \
gnu/packages/texlive.scm \
gnu/packages/textutils.scm \
gnu/packages/time.scm \
gnu/packages/tmux.scm \
gnu/packages/tor.scm \
gnu/packages/tre.scm \
gnu/packages/tv.scm \
gnu/packages/unrtf.scm \
gnu/packages/upnp.scm \
gnu/packages/uucp.scm \
gnu/packages/valgrind.scm \
gnu/packages/version-control.scm \
gnu/packages/video.scm \
gnu/packages/vim.scm \
gnu/packages/vpn.scm \
gnu/packages/vtk.scm \
gnu/packages/w3m.scm \
gnu/packages/wdiff.scm \
gnu/packages/web.scm \
gnu/packages/webkit.scm \
gnu/packages/weechat.scm \
gnu/packages/wget.scm \
gnu/packages/wicd.scm \
gnu/packages/wine.scm \
gnu/packages/wordnet.scm \
gnu/packages/wv.scm \
gnu/packages/wxwidgets.scm \
gnu/packages/xfig.scm \
gnu/packages/xiph.scm \
gnu/packages/xml.scm \
gnu/packages/xnee.scm \
gnu/packages/xdisorg.scm \
gnu/packages/xorg.scm \
gnu/packages/xfce.scm \
gnu/packages/yasm.scm \
gnu/packages/yubico.scm \
gnu/packages/zile.scm \
gnu/packages/zip.scm \
gnu/packages/zsh.scm \
\
gnu/services.scm \
gnu/services/avahi.scm \
gnu/services/base.scm \
gnu/services/databases.scm \
gnu/services/desktop.scm \
gnu/services/dmd.scm \
gnu/services/lirc.scm \
gnu/services/networking.scm \
gnu/services/ssh.scm \
gnu/services/xorg.scm \
\
gnu/system.scm \
gnu/system/file-systems.scm \
gnu/system/grub.scm \
gnu/system/install.scm \
gnu/system/linux.scm \
gnu/system/linux-initrd.scm \
gnu/system/locale.scm \
gnu/system/nss.scm \
gnu/system/shadow.scm \
gnu/system/vm.scm \
\
gnu/build/activation.scm \
gnu/build/file-systems.scm \
gnu/build/install.scm \
gnu/build/linux-boot.scm \
gnu/build/linux-initrd.scm \
gnu/build/linux-modules.scm \
gnu/build/vm.scm
patchdir = $(guilemoduledir)/gnu/packages/patches
dist_patch_DATA = \
gnu/packages/patches/abiword-explictly-cast-bools.patch \
gnu/packages/patches/abiword-link-plugins-against-backend.patch \
gnu/packages/patches/abiword-no-include-glib-internal-headers.patch \
gnu/packages/patches/abiword-pass-no-undefined-to-linker.patch \
gnu/packages/patches/abiword-use-proper-png-api.patch \
gnu/packages/patches/abiword-wmf-version-lookup-fix.patch \
gnu/packages/patches/aegis-constness-error.patch \
gnu/packages/patches/aegis-perl-tempdir1.patch \
gnu/packages/patches/aegis-perl-tempdir2.patch \
gnu/packages/patches/aegis-test-fixup-1.patch \
gnu/packages/patches/aegis-test-fixup-2.patch \
gnu/packages/patches/agg-am_c_prototype.patch \
gnu/packages/patches/alsa-lib-mips-atomic-fix.patch \
gnu/packages/patches/apr-skip-getservbyname-test.patch \
gnu/packages/patches/ath9k-htc-firmware-binutils.patch \
gnu/packages/patches/ath9k-htc-firmware-gcc.patch \
gnu/packages/patches/ath9k-htc-firmware-objcopy.patch \
gnu/packages/patches/audacity-fix-ffmpeg-binding.patch \
gnu/packages/patches/automake-skip-amhello-tests.patch \
gnu/packages/patches/avahi-localstatedir.patch \
gnu/packages/patches/avrdude-fix-libusb.patch \
gnu/packages/patches/bash-completion-directories.patch \
gnu/packages/patches/bowtie-fix-makefile.patch \
gnu/packages/patches/bigloo-gc-shebangs.patch \
gnu/packages/patches/binutils-ld-new-dtags.patch \
gnu/packages/patches/binutils-loongson-workaround.patch \
gnu/packages/patches/calibre-drop-unrar.patch \
gnu/packages/patches/calibre-no-updates-dialog.patch \
gnu/packages/patches/cdparanoia-fpic.patch \
gnu/packages/patches/chmlib-inttypes.patch \
gnu/packages/patches/clucene-pkgconfig.patch \
gnu/packages/patches/cmake-fix-tests.patch \
gnu/packages/patches/coreutils-dummy-man.patch \
gnu/packages/patches/cpio-CVE-2014-9112-pt1.patch \
gnu/packages/patches/cpio-CVE-2014-9112-pt2.patch \
gnu/packages/patches/cpio-CVE-2014-9112-pt3.patch \
gnu/packages/patches/cpio-CVE-2014-9112-pt4.patch \
gnu/packages/patches/cpio-CVE-2014-9112-pt5.patch \
gnu/packages/patches/cpio-gets-undeclared.patch \
gnu/packages/patches/cpufrequtils-fix-aclocal.patch \
gnu/packages/patches/crossmap-allow-system-pysam.patch \
gnu/packages/patches/cssc-gets-undeclared.patch \
gnu/packages/patches/cssc-missing-include.patch \
gnu/packages/patches/clucene-contribs-lib.patch \
gnu/packages/patches/cursynth-wave-rand.patch \
gnu/packages/patches/dbus-localstatedir.patch \
gnu/packages/patches/diffutils-gets-undeclared.patch \
gnu/packages/patches/dfu-programmer-fix-libusb.patch \
gnu/packages/patches/doxygen-test.patch \
gnu/packages/patches/doxygen-tmake.patch \
gnu/packages/patches/duplicity-piped-password.patch \
gnu/packages/patches/duplicity-test_selection-tmp.patch \
gnu/packages/patches/elfutils-tests-ptrace.patch \
gnu/packages/patches/emacs-exec-path.patch \
gnu/packages/patches/eudev-rules-directory.patch \
gnu/packages/patches/findutils-absolute-paths.patch \
gnu/packages/patches/flashrom-use-libftdi1.patch \
gnu/packages/patches/flex-bison-tests.patch \
gnu/packages/patches/fltk-shared-lib-defines.patch \
gnu/packages/patches/gawk-shell.patch \
gnu/packages/patches/gcc-arm-link-spec-fix.patch \
gnu/packages/patches/gcc-cross-environment-variables.patch \
gnu/packages/patches/gcc-libvtv-runpath.patch \
gnu/packages/patches/gcc-5.0-libvtv-runpath.patch \
gnu/packages/patches/geoclue-config.patch \
gnu/packages/patches/ghostscript-runpath.patch \
gnu/packages/patches/gitolite-openssh-6.8-compat.patch \
gnu/packages/patches/glib-tests-desktop.patch \
gnu/packages/patches/glib-tests-homedir.patch \
gnu/packages/patches/glib-tests-prlimit.patch \
gnu/packages/patches/glib-tests-timer.patch \
gnu/packages/patches/glib-tests-gapplication.patch \
gnu/packages/patches/glibc-bootstrap-system.patch \
gnu/packages/patches/glibc-ldd-x86_64.patch \
gnu/packages/patches/glibc-locales.patch \
gnu/packages/patches/gmp-arm-asm-nothumb.patch \
gnu/packages/patches/gnutls-fix-duplicate-manpages.patch \
gnu/packages/patches/gobject-introspection-absolute-shlib-path.patch \
gnu/packages/patches/gobject-introspection-cc.patch \
gnu/packages/patches/gobject-introspection-girepository.patch \
gnu/packages/patches/grep-CVE-2015-1345.patch \
gnu/packages/patches/grub-gets-undeclared.patch \
gnu/packages/patches/grub-freetype.patch \
gnu/packages/patches/guile-1.8-cpp-4.5.patch \
gnu/packages/patches/guile-arm-fixes.patch \
gnu/packages/patches/guile-default-utf8.patch \
gnu/packages/patches/guile-linux-syscalls.patch \
gnu/packages/patches/guile-relocatable.patch \
gnu/packages/patches/gtkglext-disable-disable-deprecated.patch \
gnu/packages/patches/hop-bigloo-4.0b.patch \
gnu/packages/patches/hop-linker-flags.patch \
gnu/packages/patches/icecat-CVE-2015-0797.patch \
gnu/packages/patches/icecat-CVE-2015-2708-pt1.patch \
gnu/packages/patches/icecat-CVE-2015-2708-pt2.patch \
gnu/packages/patches/icecat-CVE-2015-2708-pt3.patch \
gnu/packages/patches/icecat-CVE-2015-2708-pt4.patch \
gnu/packages/patches/icecat-CVE-2015-2710-pt1.patch \
gnu/packages/patches/icecat-CVE-2015-2710-pt2.patch \
gnu/packages/patches/icecat-CVE-2015-2710-pt3.patch \
gnu/packages/patches/icecat-CVE-2015-2713-pt1.patch \
gnu/packages/patches/icecat-CVE-2015-2713-pt2.patch \
gnu/packages/patches/icecat-CVE-2015-2716.patch \
gnu/packages/patches/irrlicht-mesa-10.patch \
gnu/packages/patches/jbig2dec-ignore-testtest.patch \
gnu/packages/patches/kmod-module-directory.patch \
gnu/packages/patches/lftp-dont-save-unknown-host-fingerprint.patch \
gnu/packages/patches/libarchive-CVE-2013-0211.patch \
gnu/packages/patches/libarchive-fix-lzo-test-case.patch \
gnu/packages/patches/libarchive-mtree-filename-length-fix.patch \
gnu/packages/patches/libbonobo-activation-test-race.patch \
gnu/packages/patches/libcanberra-sound-theme-freedesktop.patch \
gnu/packages/patches/libevent-dns-tests.patch \
gnu/packages/patches/liboop-mips64-deplibs-fix.patch \
gnu/packages/patches/libmad-mips-newgcc.patch \
gnu/packages/patches/libtheora-config-guess.patch \
gnu/packages/patches/libtool-skip-tests2.patch \
gnu/packages/patches/libssh-CVE-2014-0017.patch \
gnu/packages/patches/libvpx-fix-armhf-link.patch \
gnu/packages/patches/libvpx-fix-ssse3-quantize.patch \
gnu/packages/patches/libvpx-vp9-out-of-bounds-access.patch \
gnu/packages/patches/lirc-localstatedir.patch \
gnu/packages/patches/lm-sensors-hwmon-attrs.patch \
gnu/packages/patches/lua51-liblua-so.patch \
gnu/packages/patches/luajit-no_ldconfig.patch \
gnu/packages/patches/luajit-symlinks.patch \
gnu/packages/patches/luit-posix.patch \
gnu/packages/patches/m4-gets-undeclared.patch \
gnu/packages/patches/make-impure-dirs.patch \
gnu/packages/patches/mc-fix-ncurses-build.patch \
gnu/packages/patches/mcron-install.patch \
gnu/packages/patches/mhash-keygen-test-segfault.patch \
gnu/packages/patches/mit-krb5-init-fix.patch \
gnu/packages/patches/mpc123-initialize-ao.patch \
gnu/packages/patches/mplayer2-theora-fix.patch \
gnu/packages/patches/module-init-tools-moduledir.patch \
gnu/packages/patches/mupdf-buildsystem-fix.patch \
gnu/packages/patches/mutt-CVE-2014-9116.patch \
gnu/packages/patches/net-tools-bitrot.patch \
gnu/packages/patches/ngircd-handle-zombies.patch \
gnu/packages/patches/ngircd-no-dns-in-tests.patch \
gnu/packages/patches/ninja-tests.patch \
gnu/packages/patches/nss-pkgconfig.patch \
gnu/packages/patches/nvi-assume-preserve-path.patch \
gnu/packages/patches/nvi-dbpagesize-binpower.patch \
gnu/packages/patches/nvi-db4.patch \
gnu/packages/patches/openexr-missing-samples.patch \
gnu/packages/patches/openssl-runpath.patch \
gnu/packages/patches/orpheus-cast-errors-and-includes.patch \
gnu/packages/patches/ots-no-include-missing-file.patch \
gnu/packages/patches/patchelf-page-size.patch \
gnu/packages/patches/patchelf-rework-for-arm.patch \
gnu/packages/patches/patchutils-xfail-gendiff-tests.patch \
gnu/packages/patches/pavucontrol-sigsegv.patch \
gnu/packages/patches/perl-gd-options-passthrough-and-fontconfig.patch \
gnu/packages/patches/perl-module-pluggable-search.patch \
gnu/packages/patches/perl-net-amazon-s3-moose-warning.patch \
gnu/packages/patches/perl-no-sys-dirs.patch \
gnu/packages/patches/perl-tk-x11-discover.patch \
gnu/packages/patches/petsc-fix-threadcomm.patch \
gnu/packages/patches/pingus-sdl-libs-config.patch \
gnu/packages/patches/plotutils-libpng-jmpbuf.patch \
gnu/packages/patches/polkit-drop-test.patch \
gnu/packages/patches/portaudio-audacity-compat.patch \
gnu/packages/patches/procps-make-3.82.patch \
gnu/packages/patches/pulseaudio-fix-mult-test.patch \
gnu/packages/patches/pulseaudio-longer-test-timeout.patch \
gnu/packages/patches/pycairo-wscript.patch \
gnu/packages/patches/pybugz-encode-error.patch \
gnu/packages/patches/pybugz-stty.patch \
gnu/packages/patches/pyqt-configure.patch \
gnu/packages/patches/python-fix-tests.patch \
gnu/packages/patches/python-libffi-mips-n32-fix.patch \
gnu/packages/patches/python2-rdflib-drop-sparqlwrapper.patch \
gnu/packages/patches/python2-sqlite-3.8.4-test-fix.patch \
gnu/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \
gnu/packages/patches/qt4-ldflags.patch \
gnu/packages/patches/qt4-tests.patch \
gnu/packages/patches/qt5-conflicting-typedefs.patch \
gnu/packages/patches/qt5-runpath.patch \
gnu/packages/patches/ratpoison-shell.patch \
gnu/packages/patches/readline-link-ncurses.patch \
gnu/packages/patches/ripperx-libm.patch \
gnu/packages/patches/scheme48-tests.patch \
gnu/packages/patches/scotch-test-threading.patch \
gnu/packages/patches/sdl-libx11-1.6.patch \
gnu/packages/patches/serf-comment-style-fix.patch \
gnu/packages/patches/serf-deflate-buckets-test-fix.patch \
gnu/packages/patches/slim-session.patch \
gnu/packages/patches/slim-config.patch \
gnu/packages/patches/slim-sigusr1.patch \
gnu/packages/patches/soprano-find-clucene.patch \
gnu/packages/patches/subversion-sqlite-3.8.9-fix.patch \
gnu/packages/patches/superlu-dist-scotchmetis.patch \
gnu/packages/patches/tcsh-fix-autotest.patch \
gnu/packages/patches/teckit-cstdio.patch \
gnu/packages/patches/texi2html-document-encoding.patch \
gnu/packages/patches/texi2html-i18n.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-8140.patch \
gnu/packages/patches/unzip-CVE-2014-8141.patch \
gnu/packages/patches/util-linux-tests.patch \
gnu/packages/patches/upower-builddir.patch \
gnu/packages/patches/valgrind-glibc-2.21.patch \
gnu/packages/patches/vpnc-script.patch \
gnu/packages/patches/vtk-mesa-10.patch \
gnu/packages/patches/w3m-fix-compile.patch \
gnu/packages/patches/webkitgtk-2.4.8-gmutexlocker.patch \
gnu/packages/patches/weex-vacopy.patch \
gnu/packages/patches/wicd-template-instantiation.patch \
gnu/packages/patches/wicd-urwid-1.3.patch \
gnu/packages/patches/wmctrl-64-fix.patch \
gnu/packages/patches/wpa-supplicant-CVE-2015-1863.patch \
gnu/packages/patches/wpa-supplicant-2015-2-fix.patch \
gnu/packages/patches/wpa-supplicant-2015-3-fix.patch \
gnu/packages/patches/wpa-supplicant-2015-4-fix-pt1.patch \
gnu/packages/patches/wpa-supplicant-2015-4-fix-pt2.patch \
gnu/packages/patches/wpa-supplicant-2015-4-fix-pt3.patch \
gnu/packages/patches/wpa-supplicant-2015-4-fix-pt4.patch \
gnu/packages/patches/wpa-supplicant-2015-4-fix-pt5.patch \
gnu/packages/patches/xf86-video-ark-remove-mibstore.patch \
gnu/packages/patches/xf86-video-ast-remove-mibstore.patch \
gnu/packages/patches/xf86-video-geode-glibc-2.20.patch \
gnu/packages/patches/xf86-video-glint-remove-mibstore.patch \
gnu/packages/patches/xf86-video-i128-remove-mibstore.patch \
gnu/packages/patches/xf86-video-intel-compat-api.patch \
gnu/packages/patches/xf86-video-intel-glibc-2.20.patch \
gnu/packages/patches/xf86-video-mach64-glibc-2.20.patch \
gnu/packages/patches/xf86-video-mga-glibc-2.20.patch \
gnu/packages/patches/xf86-video-nv-remove-mibstore.patch \
gnu/packages/patches/xf86-video-openchrome-glibc-2.20.patch \
gnu/packages/patches/xf86-video-r128-glibc-2.20.patch \
gnu/packages/patches/xf86-video-siliconmotion-remove-mibstore.patch \
gnu/packages/patches/xf86-video-sis-fix-exa-crash.patch \
gnu/packages/patches/xf86-video-sis-update-api.patch \
gnu/packages/patches/xf86-video-tdfx-remove-mibstore.patch \
gnu/packages/patches/xf86-video-tga-remove-mibstore.patch \
gnu/packages/patches/xf86-video-trident-remove-mibstore.patch \
gnu/packages/patches/xf86-video-vmware-glibc-2.20.patch \
gnu/packages/patches/xfce4-panel-plugins.patch \
gnu/packages/patches/xmodmap-asprintf.patch \
gnu/packages/patches/zathura-plugindir-environment-variable.patch
MISC_DISTRO_FILES = \
gnu/packages/ld-wrapper.in
bootstrapdir = $(guilemoduledir)/gnu/packages/bootstrap
bootstrap_x86_64_linuxdir = $(bootstrapdir)/x86_64-linux
bootstrap_i686_linuxdir = $(bootstrapdir)/i686-linux
bootstrap_armhf_linuxdir = $(bootstrapdir)/armhf-linux
bootstrap_mips64el_linuxdir = $(bootstrapdir)/mips64el-linux
dist_bootstrap_x86_64_linux_DATA = \
gnu/packages/bootstrap/x86_64-linux/bash \
gnu/packages/bootstrap/x86_64-linux/mkdir \
gnu/packages/bootstrap/x86_64-linux/tar \
gnu/packages/bootstrap/x86_64-linux/xz
dist_bootstrap_i686_linux_DATA = \
gnu/packages/bootstrap/i686-linux/bash \
gnu/packages/bootstrap/i686-linux/mkdir \
gnu/packages/bootstrap/i686-linux/tar \
gnu/packages/bootstrap/i686-linux/xz
dist_bootstrap_armhf_linux_DATA = \
gnu/packages/bootstrap/armhf-linux/bash \
gnu/packages/bootstrap/armhf-linux/mkdir \
gnu/packages/bootstrap/armhf-linux/tar \
gnu/packages/bootstrap/armhf-linux/xz
dist_bootstrap_mips64el_linux_DATA = \
gnu/packages/bootstrap/mips64el-linux/bash \
gnu/packages/bootstrap/mips64el-linux/mkdir \
gnu/packages/bootstrap/mips64el-linux/tar \
gnu/packages/bootstrap/mips64el-linux/xz
# Big bootstrap binaries are not included in the tarball. Instead, they
# are downloaded.
nodist_bootstrap_x86_64_linux_DATA = \
gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz
nodist_bootstrap_i686_linux_DATA = \
gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz
nodist_bootstrap_armhf_linux_DATA = \
gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz
nodist_bootstrap_mips64el_linux_DATA = \
gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz
# Those files must remain executable, so they remain executable once
# imported into the store.
set-bootstrap-executable-permissions:
chmod +x $(DESTDIR)$(bootstrapdir)/*/{bash,mkdir,tar,xz}
DISTCLEANFILES = \
$(nodist_bootstrap_x86_64_linux_DATA) \
$(nodist_bootstrap_i686_linux_DATA) \
$(nodist_bootstrap_armhf_linux_DATA) \
$(nodist_bootstrap_mips64el_linux_DATA)
# Method to download a file from an external source.
DOWNLOAD_FILE = \
GUILE_LOAD_COMPILED_PATH="$(top_builddir):$$GUILE_LOAD_COMPILED_PATH" \
$(GUILE) --no-auto-compile -L "$(top_builddir)" -L "$(top_srcdir)" \
"$(top_srcdir)/build-aux/download.scm"
gnu/packages/bootstrap/x86_64-linux/guile-2.0.9.tar.xz:
$(MKDIR_P) `dirname "$@"`
$(DOWNLOAD_FILE) "$@" "037b103522a2d0d7d69c7ffd8de683dfe5bb4b59c1fafd70b4ffd397fd2f57f0"
gnu/packages/bootstrap/i686-linux/guile-2.0.9.tar.xz:
$(MKDIR_P) `dirname "$@"`
$(DOWNLOAD_FILE) "$@" "b757cd46bf13ecac83fb8e955fb50096ac2d17bb610ca8eb816f29302a00a846"
gnu/packages/bootstrap/armhf-linux/guile-2.0.11.tar.xz:
$(MKDIR_P) `dirname "$@"`
$(DOWNLOAD_FILE) "$@" "e551d05d4d385d6706ab8d574856a087758294dc90ab4c06e70a157a685e23d6"
gnu/packages/bootstrap/mips64el-linux/guile-2.0.9.tar.xz:
$(MKDIR_P) `dirname "$@"`
$(DOWNLOAD_FILE) "$@" "994680f0001346864aa2c2cc5110f380ee7518dcd701c614291682b8e948f73b"
-61
View File
@@ -1,61 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Joshua S. Grant <jgrant@parenthetical.io>
;;;
;;; 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)
#:export (use-package-modules
use-service-modules
use-system-modules))
;;; Commentary:
;;;
;;; This composite module re-exports core parts the (gnu …) public modules.
;;;
;;; Code:
(eval-when (eval load compile)
(begin
(define %public-modules
'((gnu system)
(gnu system file-systems)
(gnu system grub) ; 'grub-configuration'
(gnu system linux) ; 'base-pam-services'
(gnu system shadow) ; 'user-account'
(gnu system linux-initrd)
(gnu system nss)
(gnu services)
(gnu services base)
(gnu packages)
(gnu packages base)
(guix gexp))) ; so gexps can be used
(for-each (let ((i (module-public-interface (current-module))))
(lambda (m)
(module-use! i (resolve-interface m))))
%public-modules)))
(define-syntax-rule (use-package-modules module ...)
(use-modules (gnu packages module) ...))
(define-syntax-rule (use-service-modules module ...)
(use-modules (gnu services module) ...))
(define-syntax-rule (use-system-modules module ...)
(use-modules (gnu system module) ...))
;;; gnu.scm ends here
-40
View File
@@ -1,40 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 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 artwork)
#:use-module (guix packages)
#:use-module (guix git-download)
#:export (%artwork-repository))
;;; Commentary:
;;;
;;; Common place for the definition of the Guix artwork repository.
;;;
;;; Code:
(define %artwork-repository
(origin
(method git-fetch)
(uri (git-reference
(url "git://git.savannah.gnu.org/guix/guix-artwork.git")
(commit "6998d30")))
(sha256
(base32
"0k7j3pj9s3zqiqmfkapypssvzx3f12yr0cc2rbzxqfii0b4clp1j"))))
;;; artwork.scm ends here
-403
View File
@@ -1,403 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Mark H Weaver <mhw@netris.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 activation)
#:use-module (gnu build linux-boot)
#:use-module (guix build utils)
#:use-module (ice-9 ftw)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:export (activate-users+groups
activate-etc
activate-setuid-programs
activate-/bin/sh
activate-modprobe
activate-firmware
activate-ptrace-attach
activate-current-system))
;;; Commentary:
;;;
;;; This module provides "activation" helpers. Activation is the process that
;;; consists in setting up system-wide files and directories so that an
;;; 'operating-system' configuration becomes active.
;;;
;;; Code:
(define (enumerate thunk)
"Return the list of values returned by THUNK until it returned #f."
(let loop ((entry (thunk))
(result '()))
(if (not entry)
(reverse result)
(loop (thunk) (cons entry result)))))
(define (current-users)
"Return the passwd entries for all the currently defined user accounts."
(setpw)
(enumerate getpwent))
(define (current-groups)
"Return the group entries for all the currently defined user groups."
(setgr)
(enumerate getgrent))
(define* (add-group name #:key gid password system?
(log-port (current-error-port)))
"Add NAME as a user group, with the given numeric GID if specified."
;; Use 'groupadd' from the Shadow package.
(format log-port "adding group '~a'...~%" name)
(let ((args `(,@(if gid `("-g" ,(number->string gid)) '())
,@(if password `("-p" ,password) '())
,@(if system? `("--system") '())
,name)))
(zero? (apply system* "groupadd" args))))
(define %skeleton-directory
;; Directory containing skeleton files for new accounts.
;; Note: keep the trailing '/' so that 'scandir' enters it.
"/etc/skel/")
(define (dot-or-dot-dot? file)
(member file '("." "..")))
(define (make-file-writable file)
"Make FILE writable for its owner.."
(let ((stat (lstat file))) ;XXX: symlinks
(chmod file (logior #o600 (stat:perms stat)))))
(define* (copy-account-skeletons home
#:optional (directory %skeleton-directory))
"Copy the account skeletons from DIRECTORY to HOME."
(let ((files (scandir directory (negate dot-or-dot-dot?)
string<?)))
(mkdir-p home)
(for-each (lambda (file)
(let ((target (string-append home "/" file)))
(copy-file (string-append directory "/" file) target)
(make-file-writable target)))
files)))
(define* (make-skeletons-writable home
#:optional (directory %skeleton-directory))
"Make sure that the files that have been copied from DIRECTORY to HOME are
owner-writable in HOME."
(let ((files (scandir directory (negate dot-or-dot-dot?)
string<?)))
(for-each (lambda (file)
(let ((target (string-append home "/" file)))
(when (file-exists? target)
(make-file-writable target))))
files)))
(define* (add-user name group
#:key uid comment home shell password system?
(supplementary-groups '())
(log-port (current-error-port)))
"Create an account for user NAME part of GROUP, with the specified
properties. Return #t on success."
(format log-port "adding user '~a'...~%" name)
(if (and uid (zero? uid))
;; 'useradd' fails with "Cannot determine your user name" if the root
;; account doesn't exist. Thus, for bootstrapping purposes, create that
;; one manually.
(begin
(call-with-output-file "/etc/shadow"
(cut format <> "~a::::::::~%" name))
(call-with-output-file "/etc/passwd"
(cut format <> "~a:x:~a:~a:~a:~a:~a~%"
name "0" "0" comment home shell))
(chmod "/etc/shadow" #o600)
(copy-account-skeletons (or home "/root"))
#t)
;; Use 'useradd' from the Shadow package.
(let ((args `(,@(if uid `("-u" ,(number->string uid)) '())
"-g" ,(if (number? group) (number->string group) group)
,@(if (pair? supplementary-groups)
`("-G" ,(string-join supplementary-groups ","))
'())
,@(if comment `("-c" ,comment) '())
,@(if home
(if (file-exists? home)
`("-d" ,home) ; avoid warning from 'useradd'
`("-d" ,home "--create-home"))
'())
,@(if shell `("-s" ,shell) '())
,@(if password `("-p" ,password) '())
,@(if system? '("--system") '())
,name)))
(and (zero? (apply system* "useradd" args))
(begin
;; Since /etc/skel is a link to a directory in the store where
;; all files have the writable bit cleared, and since 'useradd'
;; preserves permissions when it copies them, explicitly make
;; them writable.
(make-skeletons-writable home)
#t)))))
(define* (modify-user name group
#:key uid comment home shell password system?
(supplementary-groups '())
(log-port (current-error-port)))
"Modify user account NAME to have all the given settings."
;; Use 'usermod' from the Shadow package.
(let ((args `(,@(if uid `("-u" ,(number->string uid)) '())
"-g" ,(if (number? group) (number->string group) group)
,@(if (pair? supplementary-groups)
`("-G" ,(string-join supplementary-groups ","))
'())
,@(if comment `("-c" ,comment) '())
;; Don't use '--move-home', so ignore HOME.
,@(if shell `("-s" ,shell) '())
,name)))
(zero? (apply system* "usermod" args))))
(define* (delete-user name #:key (log-port (current-error-port)))
"Remove user account NAME. Return #t on success. This may fail if NAME is
logged in."
(format log-port "deleting user '~a'...~%" name)
(zero? (system* "userdel" name)))
(define* (delete-group name #:key (log-port (current-error-port)))
"Remove group NAME. Return #t on success."
(format log-port "deleting group '~a'...~%" name)
(zero? (system* "groupdel" name)))
(define* (ensure-user name group
#:key uid comment home shell password system?
(supplementary-groups '())
(log-port (current-error-port))
#:rest rest)
"Make sure user NAME exists and has the relevant settings."
(if (false-if-exception (getpwnam name))
(apply modify-user name group rest)
(apply add-user name group rest)))
(define (activate-users+groups users groups)
"Make sure the accounts listed in USERS and the user groups listed in GROUPS
are all available.
Each item in USERS is a list of all the characteristics of a user account;
each item in GROUPS is a tuple with the group name, group password or #f, and
numeric gid or #f."
(define (touch file)
(close-port (open-file file "a0b")))
(define activate-user
(match-lambda
((name uid group supplementary-groups comment home shell password system?)
(let ((profile-dir (string-append "/var/guix/profiles/per-user/"
name)))
(ensure-user name group
#:uid uid
#:system? system?
#:supplementary-groups supplementary-groups
#:comment comment
#:home home
#:shell shell
#:password password)
(unless system?
;; Create the profile directory for the new account.
(let ((pw (getpwnam name)))
(mkdir-p profile-dir)
(chown profile-dir (passwd:uid pw) (passwd:gid pw))))))))
;; 'groupadd' aborts if the file doesn't already exist.
(touch "/etc/group")
;; Create the root account so we can use 'useradd' and 'groupadd'.
(activate-user (find (match-lambda
((name (? zero?) _ ...) #t)
(_ #f))
users))
;; Then create the groups.
(for-each (match-lambda
((name password gid system?)
(unless (false-if-exception (getgrnam name))
(add-group name
#:gid gid #:password password
#:system? system?))))
groups)
;; Create the other user accounts.
(for-each activate-user users)
;; Finally, delete extra user accounts and groups.
(for-each delete-user
(lset-difference string=?
(map passwd:name (current-users))
(match users
(((names . _) ...)
names))))
(for-each delete-group
(lset-difference string=?
(map group:name (current-groups))
(match groups
(((names . _) ...)
names)))))
(define (activate-etc etc)
"Install ETC, a directory in the store, as the source of static files for
/etc."
;; /etc is a mixture of static and dynamic settings. Here is where we
;; initialize it from the static part.
(define (rm-f file)
(false-if-exception (delete-file file)))
(format #t "populating /etc from ~a...~%" etc)
;; Create the /etc/ssl -> /run/current-system/profile/etc/ssl symlink. This
;; symlink, to a target outside of the store, probably doesn't belong in the
;; static 'etc' store directory. However, if it were to be put there,
;; beware that if /run/current-system/profile/etc/ssl doesn't exist at the
;; time of activation (e.g. when installing a fresh system), the call to
;; 'file-is-directory?' below will fail because it uses 'stat', not 'lstat'.
(rm-f "/etc/ssl")
(symlink "/run/current-system/profile/etc/ssl" "/etc/ssl")
(rm-f "/etc/static")
(symlink etc "/etc/static")
(for-each (lambda (file)
(let ((target (string-append "/etc/" file))
(source (string-append "/etc/static/" file)))
(rm-f target)
;; Things such as /etc/sudoers must be regular files, not
;; symlinks; furthermore, they could be modified behind our
;; back---e.g., with 'visudo'. Thus, make a copy instead of
;; symlinking them.
(if (file-is-directory? source)
(symlink source target)
(copy-file source target))
;; XXX: Dirty hack to meet sudo's expectations.
(when (string=? (basename target) "sudoers")
(chmod target #o440))))
(scandir etc (negate dot-or-dot-dot?)
;; The default is 'string-locale<?', but we don't have
;; it when run from the initrd's statically-linked
;; Guile.
string<?)))
(define %setuid-directory
;; Place where setuid programs are stored.
"/run/setuid-programs")
(define (link-or-copy source target)
"Attempt to make TARGET a hard link to SOURCE; if it fails, fall back to
copy SOURCE to TARGET."
(catch 'system-error
(lambda ()
(link source target))
(lambda args
;; Perhaps SOURCE and TARGET live in a different file system, so copy
;; SOURCE.
(copy-file source target))))
(define (activate-setuid-programs programs)
"Turn PROGRAMS, a list of file names, into setuid programs stored under
%SETUID-DIRECTORY."
(define (make-setuid-program prog)
(let ((target (string-append %setuid-directory
"/" (basename prog))))
(link-or-copy prog target)
(chown target 0 0)
(chmod target #o6555)))
(format #t "setting up setuid programs in '~a'...~%"
%setuid-directory)
(if (file-exists? %setuid-directory)
(for-each (compose delete-file
(cut string-append %setuid-directory "/" <>))
(scandir %setuid-directory
(lambda (file)
(not (member file '("." ".."))))
string<?))
(mkdir-p %setuid-directory))
(for-each make-setuid-program programs))
(define (activate-/bin/sh shell)
"Change /bin/sh to point to SHELL."
(symlink shell "/bin/sh.new")
(rename-file "/bin/sh.new" "/bin/sh"))
(define (activate-modprobe modprobe)
"Tell the kernel to use MODPROBE to load modules."
(call-with-output-file "/proc/sys/kernel/modprobe"
(lambda (port)
(display modprobe port))))
(define (activate-firmware directory)
"Tell the kernel to look for device firmware under DIRECTORY. This
mechanism bypasses udev: it allows Linux to handle firmware loading directly
by itself, without having to resort to a \"user helper\"."
(call-with-output-file "/sys/module/firmware_class/parameters/path"
(lambda (port)
(display directory port))))
(define (activate-ptrace-attach)
"Allow users to PTRACE_ATTACH their own processes.
This works around a regression introduced in the default \"security\" policy
found in Linux 3.4 onward that prevents users from attaching to their own
processes--see Yama.txt in the Linux source tree for the rationale. This
sounds like an unacceptable restriction for little or no security
improvement."
(let ((file "/proc/sys/kernel/yama/ptrace_scope"))
(when (file-exists? file)
(call-with-output-file file
(lambda (port)
(display 0 port))))))
(define %current-system
;; The system that is current (a symlink.) This is not necessarily the same
;; as the system we booted (aka. /run/booted-system) because we can re-build
;; a new system configuration and activate it, without rebooting.
"/run/current-system")
(define (boot-time-system)
"Return the '--system' argument passed on the kernel command line."
(find-long-option "--system" (linux-command-line)))
(define* (activate-current-system
#:optional (system (or (getenv "GUIX_NEW_SYSTEM")
(boot-time-system))))
"Atomically make SYSTEM the current system."
;; The 'GUIX_NEW_SYSTEM' environment variable is used as a way for 'guix
;; system reconfigure' to pass the file name of the new system.
(format #t "making '~a' the current system...~%" system)
;; Atomically make SYSTEM current.
(let ((new (string-append %current-system ".new")))
(symlink system new)
(rename-file new %current-system)))
;;; activation.scm ends here
-301
View File
@@ -1,301 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 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 file-systems)
#:use-module (guix build utils)
#:use-module (rnrs io ports)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
#:use-module (ice-9 rdelim)
#:use-module (system foreign)
#:autoload (system repl repl) (start-repl)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:export (disk-partitions
partition-label-predicate
find-partition-by-label
canonicalize-device-spec
MS_RDONLY
MS_NOSUID
MS_NODEV
MS_NOEXEC
MS_BIND
MS_MOVE
bind-mount
mount-flags->bit-mask
check-file-system
mount-file-system))
;;; Commentary:
;;;
;;; This modules provides tools to deal with disk partitions, and to mount and
;;; check file systems.
;;;
;;; Code:
;; Linux mount flags, from libc's <sys/mount.h>.
(define MS_RDONLY 1)
(define MS_NOSUID 2)
(define MS_NODEV 4)
(define MS_NOEXEC 8)
(define MS_REMOUNT 32)
(define MS_BIND 4096)
(define MS_MOVE 8192)
(define (bind-mount source target)
"Bind-mount SOURCE at TARGET."
(mount source target "" MS_BIND))
(define-syntax %ext2-endianness
;; Endianness of ext2 file systems.
(identifier-syntax (endianness little)))
;; Offset in bytes of interesting parts of an ext2 superblock. See
;; <http://www.nongnu.org/ext2-doc/ext2.html#DEF-SUPERBLOCK>.
;; TODO: Use "packed structs" from Guile-OpenGL or similar.
(define-syntax %ext2-sblock-magic (identifier-syntax 56))
(define-syntax %ext2-sblock-creator-os (identifier-syntax 72))
(define-syntax %ext2-sblock-uuid (identifier-syntax 104))
(define-syntax %ext2-sblock-volume-name (identifier-syntax 120))
(define (read-ext2-superblock device)
"Return the raw contents of DEVICE's ext2 superblock as a bytevector, or #f
if DEVICE does not contain an ext2 file system."
(define %ext2-magic
;; The magic bytes that identify an ext2 file system.
#xef53)
(define superblock-size
;; Size of the interesting part of an ext2 superblock.
264)
(define block
;; The superblock contents.
(make-bytevector superblock-size))
(call-with-input-file device
(lambda (port)
(seek port 1024 SEEK_SET)
;; Note: work around <http://bugs.gnu.org/17466>.
(and (eqv? superblock-size (get-bytevector-n! port block 0
superblock-size))
(let ((magic (bytevector-u16-ref block %ext2-sblock-magic
%ext2-endianness)))
(and (= magic %ext2-magic)
block))))))
(define (ext2-superblock-uuid sblock)
"Return the UUID of ext2 superblock SBLOCK as a 16-byte bytevector."
(let ((uuid (make-bytevector 16)))
(bytevector-copy! sblock %ext2-sblock-uuid uuid 0 16)
uuid))
(define (ext2-superblock-volume-name sblock)
"Return the volume name of SBLOCK as a string of at most 16 characters, or
#f if SBLOCK has no volume name."
(let ((bv (make-bytevector 16)))
(bytevector-copy! sblock %ext2-sblock-volume-name bv 0 16)
;; This is a Latin-1, nul-terminated string.
(let ((bytes (take-while (negate zero?) (bytevector->u8-list bv))))
(if (null? bytes)
#f
(list->string (map integer->char bytes))))))
(define (disk-partitions)
"Return the list of device names corresponding to valid disk partitions."
(define (partition? major minor)
(let ((marker (format #f "/sys/dev/block/~a:~a/partition" major minor)))
(catch 'system-error
(lambda ()
(not (zero? (call-with-input-file marker read))))
(lambda args
(if (= ENOENT (system-error-errno args))
#f
(apply throw args))))))
(call-with-input-file "/proc/partitions"
(lambda (port)
;; Skip the two header lines.
(read-line port)
(read-line port)
;; Read each subsequent line, and extract the last space-separated
;; field.
(let loop ((parts '()))
(let ((line (read-line port)))
(if (eof-object? line)
(reverse parts)
(match (string-tokenize line)
(((= string->number major) (= string->number minor)
blocks name)
(if (partition? major minor)
(loop (cons name parts))
(loop parts))))))))))
(define (partition-label-predicate label)
"Return a procedure that, when applied to a partition name such as \"sda1\",
return #t if that partition's volume name is LABEL."
(lambda (part)
(let* ((device (string-append "/dev/" part))
(sblock (catch 'system-error
(lambda ()
(read-ext2-superblock device))
(lambda args
;; When running on the hand-made /dev,
;; 'disk-partitions' could return partitions for which
;; we have no /dev node. Handle that gracefully.
(if (= ENOENT (system-error-errno args))
(begin
(format (current-error-port)
"warning: device '~a' not found~%"
device)
#f)
(apply throw args))))))
(and sblock
(let ((volume (ext2-superblock-volume-name sblock)))
(and volume
(string=? volume label)))))))
(define (find-partition-by-label label)
"Return the first partition found whose volume name is LABEL, or #f if none
were found."
(and=> (find (partition-label-predicate label)
(disk-partitions))
(cut string-append "/dev/" <>)))
(define* (canonicalize-device-spec spec #:optional (title 'any))
"Return the device name corresponding to SPEC. TITLE is a symbol, one of
the following:
• 'device', in which case SPEC is known to designate a device node--e.g.,
\"/dev/sda1\";
• 'label', in which case SPEC is known to designate a partition label--e.g.,
\"my-root-part\";
• 'any', in which case SPEC can be anything.
"
(define max-trials
;; Number of times we retry partition label resolution, 1 second per
;; trial. Note: somebody reported a delay of 16 seconds (!) before their
;; USB key would be detected by the kernel, so we must wait for at least
;; this long.
20)
(define canonical-title
;; The realm of canonicalization.
(if (eq? title 'any)
(if (string-prefix? "/" spec)
'device
'label)
title))
(case canonical-title
((device)
;; Nothing to do.
spec)
((label)
;; Resolve the label.
(let loop ((count 0))
(let ((device (find-partition-by-label spec)))
(or device
;; Some devices take a bit of time to appear, most notably USB
;; storage devices. Thus, wait for the device to appear.
(if (> count max-trials)
(error "failed to resolve partition label" spec)
(begin
(format #t "waiting for partition '~a' to appear...~%"
spec)
(sleep 1)
(loop (+ 1 count))))))))
;; TODO: Add support for UUIDs.
(else
(error "unknown device title" title))))
(define (check-file-system device type)
"Run a file system check of TYPE on DEVICE."
(define fsck
(string-append "fsck." type))
(let ((status (system* fsck "-v" "-p" "-C" "0" device)))
(match (status:exit-val status)
(0
#t)
(1
(format (current-error-port) "'~a' corrected errors on ~a; continuing~%"
fsck device))
(2
(format (current-error-port) "'~a' corrected errors on ~a; rebooting~%"
fsck device)
(sleep 3)
(reboot))
(code
(format (current-error-port) "'~a' exited with code ~a on ~a; spawning REPL~%"
fsck code device)
(start-repl)))))
(define (mount-flags->bit-mask flags)
"Return the number suitable for the 'flags' argument of 'mount' that
corresponds to the symbols listed in FLAGS."
(let loop ((flags flags))
(match flags
(('read-only rest ...)
(logior MS_RDONLY (loop rest)))
(('bind-mount rest ...)
(logior MS_BIND (loop rest)))
(('no-suid rest ...)
(logior MS_NOSUID (loop rest)))
(('no-dev rest ...)
(logior MS_NODEV (loop rest)))
(('no-exec rest ...)
(logior MS_NOEXEC (loop rest)))
(()
0))))
(define* (mount-file-system spec #:key (root "/root"))
"Mount the file system described by SPEC under ROOT. SPEC must have the
form:
(DEVICE TITLE MOUNT-POINT TYPE (FLAGS ...) OPTIONS CHECK?)
DEVICE, MOUNT-POINT, and TYPE must be strings; OPTIONS can be a string or #f;
FLAGS must be a list of symbols. CHECK? is a Boolean indicating whether to
run a file system check."
(match spec
((source title mount-point type (flags ...) options check?)
(let ((source (canonicalize-device-spec source title))
(mount-point (string-append root "/" mount-point))
(flags (mount-flags->bit-mask flags)))
(when check?
(check-file-system source type))
(mkdir-p mount-point)
(mount source mount-point type flags
(if options
(string->pointer options)
%null-pointer))
;; For read-only bind mounts, an extra remount is needed, as per
;; <http://lwn.net/Articles/281157/>, which still applies to Linux 4.0.
(when (and (= MS_BIND (logand flags MS_BIND))
(= MS_RDONLY (logand flags MS_RDONLY)))
(mount source mount-point type (logior MS_BIND MS_REMOUNT MS_RDONLY)
%null-pointer))))))
;;; file-systems.scm ends here
-202
View File
@@ -1,202 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 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 install)
#:use-module (guix build utils)
#:use-module (guix build store-copy)
#:use-module (srfi srfi-26)
#:use-module (ice-9 match)
#:export (install-grub
populate-root-file-system
reset-timestamps
register-closure
populate-single-profile-directory))
;;; Commentary:
;;;
;;; This module supports the installation of the GNU system on a hard disk.
;;; It is meant to be used both in a build environment (in derivations that
;;; build VM images), and on the bare metal (when really installing the
;;; system.)
;;;
;;; Code:
(define* (install-grub grub.cfg device mount-point)
"Install GRUB with GRUB.CFG on DEVICE, which is assumed to be mounted on
MOUNT-POINT.
Note that the caller must make sure that GRUB.CFG is registered as a GC root
so that the fonts, background images, etc. referred to by GRUB.CFG are not
GC'd."
(let* ((target (string-append mount-point "/boot/grub/grub.cfg"))
(pivot (string-append target ".new")))
(mkdir-p (dirname target))
;; Copy GRUB.CFG instead of just symlinking it, because symlinks won't
;; work when /boot is on a separate partition. Do that atomically.
(copy-file grub.cfg pivot)
(rename-file pivot target)
(unless (zero? (system* "grub-install" "--no-floppy"
"--boot-directory"
(string-append mount-point "/boot")
device))
(error "failed to install GRUB"))))
(define (evaluate-populate-directive directive target)
"Evaluate DIRECTIVE, an sexp describing a file or directory to create under
directory TARGET."
(let loop ((directive directive))
(catch 'system-error
(lambda ()
(match directive
(('directory name)
(mkdir-p (string-append target name)))
(('directory name uid gid)
(let ((dir (string-append target name)))
(mkdir-p dir)
(chown dir uid gid)))
(('directory name uid gid mode)
(loop `(directory ,name ,uid ,gid))
(chmod (string-append target name) mode))
((new '-> old)
(let try ()
(catch 'system-error
(lambda ()
(symlink old (string-append target new)))
(lambda args
;; When doing 'guix system init' on the current '/', some
;; symlinks may already exists. Override them.
(if (= EEXIST (system-error-errno args))
(begin
(delete-file (string-append target new))
(try))
(apply throw args))))))))
(lambda args
;; Usually we can only get here when installing to an existing root,
;; as with 'guix system init foo.scm /'.
(format (current-error-port)
"error: failed to evaluate directive: ~s~%"
directive)
(apply throw args)))))
(define (directives store)
"Return a list of directives to populate the root file system that will host
STORE."
`(;; Note: the store's GID is fixed precisely so we can set it here rather
;; than at activation time.
(directory ,store 0 30000 #o1775)
(directory "/etc")
(directory "/var/log") ; for dmd
(directory "/var/guix/gcroots")
(directory "/var/empty") ; for no-login accounts
(directory "/var/db") ; for dhclient, etc.
(directory "/var/run")
(directory "/run")
(directory "/mnt")
(directory "/var/guix/profiles/per-user/root" 0 0)
;; Link to the initial system generation.
("/var/guix/profiles/system" -> "system-1-link")
("/var/guix/gcroots/booted-system" -> "/run/booted-system")
("/var/guix/gcroots/current-system" -> "/run/current-system")
(directory "/bin")
(directory "/tmp" 0 0 #o1777) ; sticky bit
(directory "/var/tmp" 0 0 #o1777)
(directory "/var/lock" 0 0 #o1777)
(directory "/root" 0 0) ; an exception
(directory "/home" 0 0)))
(define (populate-root-file-system system target)
"Make the essential non-store files and directories on TARGET. This
includes /etc, /var, /run, /bin/sh, etc., and all the symlinks to SYSTEM."
(for-each (cut evaluate-populate-directive <> target)
(directives (%store-directory)))
;; Add system generation 1.
(false-if-exception (delete-file "/var/guix/profiles/system-1-link"))
(symlink system
(string-append target "/var/guix/profiles/system-1-link")))
(define (reset-timestamps directory)
"Reset the timestamps of all the files under DIRECTORY, so that they appear
as created and modified at the Epoch."
(display "clearing file timestamps...\n")
(for-each (lambda (file)
(let ((s (lstat file)))
;; XXX: Guile uses libc's 'utime' function (not 'futime'), so
;; the timestamp of symlinks cannot be changed, and there are
;; symlinks here pointing to /gnu/store, which is the host,
;; read-only store.
(unless (eq? (stat:type s) 'symlink)
(utime file 0 0 0 0))))
(find-files directory "")))
(define (register-closure store closure)
"Register CLOSURE in STORE, where STORE is the directory name of the target
store and CLOSURE is the name of a file containing a reference graph as used
by 'guix-register'. As a side effect, this resets timestamps on store files."
(let ((status (system* "guix-register" "--prefix" store
closure)))
(unless (zero? status)
(error "failed to register store items" closure))))
(define* (populate-single-profile-directory directory
#:key profile closure)
"Populate DIRECTORY with a store containing PROFILE, whose closure is given
in the file called CLOSURE (as generated by #:references-graphs.) DIRECTORY
is initialized to contain a single profile under /root pointing to PROFILE.
This is used to create the self-contained Guix tarball."
(define (scope file)
(string-append directory "/" file))
(define %root-profile
"/var/guix/profiles/per-user/root")
(define (mkdir-p* dir)
(mkdir-p (scope dir)))
(define (symlink* old new)
(symlink old (scope new)))
;; Populate the store.
(populate-store (list closure) directory)
(register-closure (canonicalize-path directory) closure)
;; XXX: 'guix-register' registers profiles as GC roots but the symlink
;; target uses $TMPDIR. Fix that.
(delete-file (scope "/var/guix/gcroots/profiles"))
(symlink* "/var/guix/profiles"
"/var/guix/gcroots/profiles")
;; Make root's profile, which makes it a GC root.
(mkdir-p* %root-profile)
(symlink* profile
(string-append %root-profile "/guix-profile-1-link"))
(symlink* (string-append %root-profile "/guix-profile-1-link")
(string-append %root-profile "/guix-profile"))
(mkdir-p* "/root")
(symlink* (string-append %root-profile "/guix-profile")
"/root/.guix-profile"))
;;; install.scm ends here
-434
View File
@@ -1,434 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015 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 linux-boot)
#:use-module (rnrs io ports)
#:use-module (system repl error-handling)
#:autoload (system repl repl) (start-repl)
#:autoload (system base compile) (compile-file)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (ice-9 match)
#:use-module (ice-9 ftw)
#:use-module (guix build utils)
#:use-module (gnu build linux-modules)
#:use-module (gnu build file-systems)
#:export (mount-essential-file-systems
linux-command-line
find-long-option
make-essential-device-nodes
configure-qemu-networking
bind-mount
device-number
boot-system))
;;; Commentary:
;;;
;;; Utility procedures useful in a Linux initial RAM disk (initrd). Note that
;;; many of these use procedures not yet available in vanilla Guile (`mount',
;;; `load-linux-module', etc.); these are provided by a Guile patch used in
;;; the GNU distribution.
;;;
;;; Code:
(define* (mount-essential-file-systems #:key (root "/"))
"Mount /proc and /sys under ROOT."
(define (scope dir)
(string-append root
(if (string-suffix? "/" root)
""
"/")
dir))
(unless (file-exists? (scope "proc"))
(mkdir (scope "proc")))
(mount "none" (scope "proc") "proc")
(unless (file-exists? (scope "sys"))
(mkdir (scope "sys")))
(mount "none" (scope "sys") "sysfs"))
(define (move-essential-file-systems root)
"Move currently mounted essential file systems to ROOT."
(for-each (lambda (dir)
(let ((target (string-append root dir)))
(unless (file-exists? target)
(mkdir target))
(mount dir target "" MS_MOVE)))
'("/proc" "/sys")))
(define (linux-command-line)
"Return the Linux kernel command line as a list of strings."
(string-tokenize
(call-with-input-file "/proc/cmdline"
get-string-all)))
(define (find-long-option option arguments)
"Find OPTION among ARGUMENTS, where OPTION is something like \"--load\".
Return the value associated with OPTION, or #f on failure."
(let ((opt (string-append option "=")))
(and=> (find (cut string-prefix? opt <>)
arguments)
(lambda (arg)
(substring arg (+ 1 (string-index arg #\=)))))))
(define* (make-disk-device-nodes base major #:optional (minor 0))
"Make the block device nodes around BASE (something like \"/root/dev/sda\")
with the given MAJOR number, starting with MINOR."
(mknod base 'block-special #o644 (device-number major minor))
(let loop ((i 1))
(when (< i 16)
(mknod (string-append base (number->string i))
'block-special #o644 (device-number major (+ minor i)))
(loop (+ i 1)))))
(define* (make-essential-device-nodes #:key (root "/"))
"Make essential device nodes under ROOT/dev."
;; The hand-made udev!
(define (scope dir)
(string-append root
(if (string-suffix? "/" root)
""
"/")
dir))
(unless (file-exists? (scope "dev"))
(mkdir (scope "dev")))
;; Make the device nodes for SCSI disks.
(make-disk-device-nodes (scope "dev/sda") 8)
(make-disk-device-nodes (scope "dev/sdb") 8 16)
(make-disk-device-nodes (scope "dev/sdc") 8 32)
(make-disk-device-nodes (scope "dev/sdd") 8 48)
;; SCSI CD-ROM devices (aka. "/dev/sr0" etc.).
(mknod (scope "dev/scd0") 'block-special #o644 (device-number 11 0))
(mknod (scope "dev/scd1") 'block-special #o644 (device-number 11 1))
;; The virtio (para-virtualized) block devices, as supported by QEMU/KVM.
(make-disk-device-nodes (scope "dev/vda") 252)
;; Memory (used by Xorg's VESA driver.)
(mknod (scope "dev/mem") 'char-special #o640 (device-number 1 1))
(mknod (scope "dev/kmem") 'char-special #o640 (device-number 1 2))
;; Inputs (used by Xorg.)
(unless (file-exists? (scope "dev/input"))
(mkdir (scope "dev/input")))
(mknod (scope "dev/input/mice") 'char-special #o640 (device-number 13 63))
(mknod (scope "dev/input/mouse0") 'char-special #o640 (device-number 13 32))
(mknod (scope "dev/input/event0") 'char-special #o640 (device-number 13 64))
;; System console. This node is magically created by the kernel on the
;; initrd's root, so don't try to create it in that case.
(unless (string=? root "/")
(mknod (scope "dev/console") 'char-special #o600
(device-number 5 1)))
;; TTYs.
(mknod (scope "dev/tty") 'char-special #o600
(device-number 5 0))
(chmod (scope "dev/tty") #o666)
(let loop ((n 0))
(and (< n 50)
(let ((name (format #f "dev/tty~a" n)))
(mknod (scope name) 'char-special #o600
(device-number 4 n))
(loop (+ 1 n)))))
;; Serial line.
(mknod (scope "dev/ttyS0") 'char-special #o660
(device-number 4 64))
;; Pseudo ttys.
(mknod (scope "dev/ptmx") 'char-special #o666
(device-number 5 2))
(chmod (scope "dev/ptmx") #o666)
;; Create /dev/pts; it will be mounted later, at boot time.
(unless (file-exists? (scope "dev/pts"))
(mkdir (scope "dev/pts")))
;; Rendez-vous point for syslogd.
(mknod (scope "dev/log") 'socket #o666 0)
(mknod (scope "dev/kmsg") 'char-special #o600 (device-number 1 11))
;; Other useful nodes, notably relied on by guix-daemon.
(for-each (match-lambda
((file major minor)
(mknod (scope file) 'char-special #o666
(device-number major minor))
(chmod (scope file) #o666)))
'(("dev/null" 1 3)
("dev/zero" 1 5)
("dev/full" 1 7)
("dev/random" 1 8)
("dev/urandom" 1 9)))
(symlink "/proc/self/fd" (scope "dev/fd"))
(symlink "/proc/self/fd/0" (scope "dev/stdin"))
(symlink "/proc/self/fd/1" (scope "dev/stdout"))
(symlink "/proc/self/fd/2" (scope "dev/stderr"))
;; Loopback devices.
(let loop ((i 0))
(when (< i 8)
(mknod (scope (string-append "dev/loop" (number->string i)))
'block-special #o660
(device-number 7 i))
(loop (+ 1 i))))
;; File systems in user space (FUSE).
(mknod (scope "dev/fuse") 'char-special #o666 (device-number 10 229)))
(define %host-qemu-ipv4-address
(inet-pton AF_INET "10.0.2.10"))
(define* (configure-qemu-networking #:optional (interface "eth0"))
"Setup the INTERFACE network interface and /etc/resolv.conf according to
QEMU's default networking settings (see net/slirp.c in QEMU for default
networking values.) Return #t if INTERFACE is up, #f otherwise."
(display "configuring QEMU networking...\n")
(let* ((sock (socket AF_INET SOCK_STREAM 0))
(address (make-socket-address AF_INET %host-qemu-ipv4-address 0))
(flags (network-interface-flags sock interface)))
(set-network-interface-address sock interface address)
(set-network-interface-flags sock interface (logior flags IFF_UP))
;; Hello! We used to create /etc/resolv.conf here, with "nameserver
;; 10.0.2.3\n". However, with Linux-libre 3.16, we're getting ENOSPC.
;; And since it's actually unnecessary, it's gone.
(logand (network-interface-flags sock interface) IFF_UP)))
(define (device-number major minor)
"Return the device number for the device with MAJOR and MINOR, for use as
the last argument of `mknod'."
(+ (* major 256) minor))
(define (pidof program)
"Return the PID of the first presumed instance of PROGRAM."
(let ((program (basename program)))
(find (lambda (pid)
(let ((exe (format #f "/proc/~a/exe" pid)))
(and=> (false-if-exception (readlink exe))
(compose (cut string=? program <>) basename))))
(filter-map string->number (scandir "/proc")))))
(define* (mount-root-file-system root type
#:key volatile-root? (unionfs "unionfs"))
"Mount the root file system of type TYPE at device ROOT. If VOLATILE-ROOT?
is true, mount ROOT read-only and make it a union with a writable tmpfs using
UNIONFS."
(define (mark-as-not-killable pid)
;; Tell the 'user-processes' dmd service that PID must be kept alive when
;; shutting down.
(mkdir-p "/root/etc/dmd")
(let ((port (open-file "/root/etc/dmd/do-not-kill" "a")))
(chmod port #o600)
(write pid port)
(newline port)
(close-port port)))
(if volatile-root?
(begin
(mkdir-p "/real-root")
(mount root "/real-root" type MS_RDONLY)
(mkdir-p "/rw-root")
(mount "none" "/rw-root" "tmpfs")
;; We want read-write /dev nodes.
(make-essential-device-nodes #:root "/rw-root")
;; Make /root a union of the tmpfs and the actual root. Use
;; 'max_files' to set a high RLIMIT_NOFILE for the unionfs process
;; itself. Failing to do that, we quickly run out of file
;; descriptors; see <http://bugs.gnu.org/17827>.
(unless (zero? (system* unionfs "-o"
"cow,allow_other,use_ino,suid,dev,max_files=65536"
"/rw-root=RW:/real-root=RO"
"/root"))
(error "unionfs failed"))
;; Make sure unionfs remains alive till the end. Because
;; 'fuse_daemonize' doesn't tell the PID of the forked daemon, we
;; have to resort to 'pidof' here.
(mark-as-not-killable (pidof unionfs)))
(begin
(check-file-system root type)
(mount root "/root" type)))
;; Make sure /root/etc/mtab is a symlink to /proc/self/mounts.
(false-if-exception
(delete-file "/root/etc/mtab"))
(symlink "/proc/self/mounts" "/root/etc/mtab"))
(define (switch-root root)
"Switch to ROOT as the root file system, in a way similar to what
util-linux' switch_root(8) does."
(move-essential-file-systems root)
(chdir root)
;; Since we're about to 'rm -rf /', try to make sure we're on an initrd.
;; TODO: Use 'statfs' to check the fs type, like klibc does.
(when (or (not (file-exists? "/init")) (directory-exists? "/home"))
(format (current-error-port)
"The root file system is probably not an initrd; \
bailing out.~%root contents: ~s~%" (scandir "/"))
(force-output (current-error-port))
(exit 1))
;; Delete files from the old root, without crossing mount points (assuming
;; there are no mount points in sub-directories.) That means we're leaving
;; the empty ROOT directory behind us, but that's OK.
(let ((root-device (stat:dev (stat "/"))))
(for-each (lambda (file)
(unless (member file '("." ".."))
(let* ((file (string-append "/" file))
(device (stat:dev (lstat file))))
(when (= device root-device)
(delete-file-recursively file)))))
(scandir "/")))
;; Make ROOT the new root.
(mount root "/" "" MS_MOVE)
(chroot ".")
(chdir "/")
(when (file-exists? "/dev/console")
;; Close the standard file descriptors since they refer to the old
;; /dev/console, and reopen them.
(let ((console (open-file "/dev/console" "r+b0")))
(for-each close-fdes '(0 1 2))
(dup2 (fileno console) 0)
(dup2 (fileno console) 1)
(dup2 (fileno console) 2)
(close-port console))))
(define* (boot-system #:key
(linux-modules '())
linux-module-directory
qemu-guest-networking?
volatile-root?
pre-mount
(mounts '()))
"This procedure is meant to be called from an initrd. Boot a system by
first loading LINUX-MODULES (a list of module names) from
LINUX-MODULE-DIRECTORY, then setting up QEMU guest networking if
QEMU-GUEST-NETWORKING? is true, calling PRE-MOUNT, mounting the file systems
specified in MOUNTS, and finally booting into the new root if any. The initrd
supports kernel command-line options '--load', '--root', and '--repl'.
Mount the root file system, specified by the '--root' command-line argument,
if any.
MOUNTS must be a list suitable for 'mount-file-system'.
When VOLATILE-ROOT? is true, the root file system is writable but any changes
to it are lost."
(define root-mount-point?
(match-lambda
((device _ "/" _ ...) #t)
(_ #f)))
(define root-fs-type
(or (any (match-lambda
((device _ "/" type _ ...) type)
(_ #f))
mounts)
"ext4"))
(define (lookup-module name)
(string-append linux-module-directory "/"
(ensure-dot-ko name)))
(display "Welcome, this is GNU's early boot Guile.\n")
(display "Use '--repl' for an initrd REPL.\n\n")
(call-with-error-handling
(lambda ()
(mount-essential-file-systems)
(let* ((args (linux-command-line))
(to-load (find-long-option "--load" args))
(root (find-long-option "--root" args)))
(when (member "--repl" args)
(start-repl))
(display "loading kernel modules...\n")
(current-module-debugging-port (current-output-port))
(for-each (cut load-linux-module* <>
#:lookup-module lookup-module)
(map lookup-module linux-modules))
(when qemu-guest-networking?
(unless (configure-qemu-networking)
(display "network interface is DOWN\n")))
;; Make /dev nodes.
(make-essential-device-nodes)
;; Prepare the real root file system under /root.
(unless (file-exists? "/root")
(mkdir "/root"))
(when (procedure? pre-mount)
;; Do whatever actions are needed before mounting the root file
;; system--e.g., installing device mappings. Error out when the
;; return value is false.
(unless (pre-mount)
(error "pre-mount actions failed")))
(if root
(mount-root-file-system (canonicalize-device-spec root)
root-fs-type
#:volatile-root? volatile-root?)
(mount "none" "/root" "tmpfs"))
(unless (file-exists? "/root/dev")
(mkdir "/root/dev")
(make-essential-device-nodes #:root "/root"))
;; Mount the specified file systems.
(for-each mount-file-system
(remove root-mount-point? mounts))
(if to-load
(begin
(switch-root "/root")
(format #t "loading '~a'...\n" to-load)
;; TODO: Remove /lib, /share, and /loader.go.
(primitive-load to-load)
(format (current-error-port)
"boot program '~a' terminated, rebooting~%"
to-load)
(sleep 2)
(reboot))
(begin
(display "no boot file passed via '--load'\n")
(display "entering a warm and cozy REPL\n")
(start-repl)))))))
;;; linux-initrd.scm ends here
-142
View File
@@ -1,142 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014 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 linux-initrd)
#:use-module (guix build utils)
#:use-module (guix build store-copy)
#:use-module (system base compile)
#:use-module (rnrs bytevectors)
#:use-module ((system foreign) #:select (sizeof))
#:use-module (ice-9 popen)
#:use-module (ice-9 ftw)
#:export (write-cpio-archive
build-initrd))
;;; Commentary:
;;;
;;; Tools to create Linux initial RAM disks ("initrds"). Initrds are
;;; essentially gzipped cpio archives, with a '/init' executable that the
;;; kernel runs at boot time.
;;;
;;; Code:
(define* (write-cpio-archive output directory
#:key
(compress? #t)
(cpio "cpio") (gzip "gzip"))
"Write a cpio archive containing DIRECTORY to file OUTPUT, using CPIO. When
COMPRESS? is true, compress it using GZIP. On success, return OUTPUT."
;; Note: don't use '--no-absolute-filenames' since that strips leading
;; slashes from symlink targets.
(let ((pipe (open-pipe* OPEN_WRITE cpio "-o" "-O" output
"-H" "newc" "--null")))
(define (print0 file)
(format pipe "~a\0" file))
;; Note: as per `ramfs-rootfs-initramfs.txt', always add directory entries
;; before the files that are inside of it: "The Linux kernel cpio
;; extractor won't create files in a directory that doesn't exist, so the
;; directory entries must go before the files that go in those
;; directories."
;; XXX: Use a deterministic order.
(file-system-fold (const #t)
(lambda (file stat result) ; leaf
(print0 file))
(lambda (dir stat result) ; down
(unless (string=? dir directory)
(print0 dir)))
(const #f) ; up
(const #f) ; skip
(const #f)
#f
directory)
(and (zero? (close-pipe pipe))
(or (not compress?)
(and (zero? (system* gzip "--best" output))
(rename-file (string-append output ".gz")
output))
output))))
(define (cache-compiled-file-name file)
"Return the file name of the in-cache .go file for FILE, relative to the
current directory.
This is similar to what 'compiled-file-name' in (system base compile) does."
(let loop ((file file))
(let ((target (false-if-exception (readlink file))))
(if target
(loop target)
(format #f ".cache/guile/ccache/~a-~a-~a-~a/~a"
(effective-version)
(if (eq? (native-endianness) (endianness little))
"LE"
"BE")
(sizeof '*)
(effective-version)
file)))))
(define (compile-to-cache file)
"Compile FILE to the cache."
(let ((compiled-file (cache-compiled-file-name file)))
(mkdir-p (dirname compiled-file))
(compile-file file
#:opts %auto-compilation-options
#:output-file compiled-file)))
(define* (build-initrd output
#:key
guile init
(references-graphs '())
(cpio "cpio")
(gzip "gzip"))
"Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script
at INIT, running GUILE. It contains all the items referred to by
REFERENCES-GRAPHS."
(mkdir "contents")
;; Copy the closures of all the items referenced in REFERENCES-GRAPHS.
(populate-store references-graphs "contents")
(with-directory-excursion "contents"
;; Make '/init'.
(symlink init "init")
;; Compile it.
(compile-to-cache "init")
;; Allow Guile to find out where it is (XXX). See
;; 'guile-relocatable.patch'.
(mkdir-p "proc/self")
(symlink (string-append guile "/bin/guile") "proc/self/exe")
(readlink "proc/self/exe")
;; Reset the timestamps of all the files that will make it in the initrd.
(for-each (lambda (file)
(unless (eq? 'symlink (stat:type (lstat file)))
(utime file 0 0 0 0)))
(find-files "." ".*"))
(write-cpio-archive output "."
#:cpio cpio #:gzip gzip))
(delete-file-recursively "contents"))
;;; linux-initrd.scm ends here
-166
View File
@@ -1,166 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 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 linux-modules)
#:use-module (guix elf)
#:use-module (rnrs io ports)
#:use-module (rnrs bytevectors)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (ice-9 vlist)
#:use-module (ice-9 match)
#:export (dot-ko
ensure-dot-ko
module-dependencies
recursive-module-dependencies
modules-loaded
module-loaded?
load-linux-module*
current-module-debugging-port))
;;; Commentary:
;;;
;;; Tools to deal with Linux kernel modules.
;;;
;;; Code:
(define current-module-debugging-port
(make-parameter (%make-void-port "w")))
(define (section-contents elf section)
"Return the contents of SECTION in ELF as a bytevector."
(let* ((modinfo (elf-section-by-name elf ".modinfo"))
(contents (make-bytevector (elf-section-size modinfo))))
(bytevector-copy! (elf-bytes elf) (elf-section-offset modinfo)
contents 0
(elf-section-size modinfo))
contents))
(define %not-nul
(char-set-complement (char-set #\nul)))
(define (nul-separated-string->list str)
"Split STR at occurrences of the NUL character and return the resulting
string list."
(string-tokenize str %not-nul))
(define (key=value->pair str)
"Assuming STR has the form \"KEY=VALUE\", return a pair like (KEY
. \"VALUE\")."
(let ((= (string-index str #\=)))
(cons (string->symbol (string-take str =))
(string-drop str (+ 1 =)))))
(define (modinfo-section-contents file)
"Return the contents of the '.modinfo' section of FILE as a list of
key/value pairs.."
(let* ((bv (call-with-input-file file get-bytevector-all))
(elf (parse-elf bv))
(modinfo (section-contents elf ".modinfo")))
(map key=value->pair
(nul-separated-string->list (utf8->string modinfo)))))
(define %not-comma
(char-set-complement (char-set #\,)))
(define (module-dependencies file)
"Return the list of modules that FILE depends on. The returned list
contains module names, not actual file names."
(let ((info (modinfo-section-contents file)))
(match (assq 'depends info)
(('depends . what)
(string-tokenize what %not-comma)))))
(define dot-ko
(cut string-append <> ".ko"))
(define (ensure-dot-ko name)
"Return NAME with a '.ko' prefix appended, unless it already has it."
(if (string-suffix? ".ko" name)
name
(dot-ko name)))
(define* (recursive-module-dependencies files
#:key (lookup-module dot-ko))
"Return the topologically-sorted list of file names of the modules depended
on by FILES, recursively. File names of modules are determined by applying
LOOKUP-MODULE to the module name."
(let loop ((files files)
(result '())
(visited vlist-null))
(match files
(()
(delete-duplicates (reverse result)))
((head . tail)
(let* ((visited? (vhash-assoc head visited))
(deps (if visited?
'()
(map lookup-module (module-dependencies head))))
(visited (if visited?
visited
(vhash-cons head #t visited))))
(loop (append deps tail)
(append result deps) visited))))))
(define %not-newline
(char-set-complement (char-set #\newline)))
(define (modules-loaded)
"Return the list of names of currently loaded Linux modules."
(let* ((contents (call-with-input-file "/proc/modules"
get-string-all))
(lines (string-tokenize contents %not-newline)))
(match (map string-tokenize lines)
(((modules . _) ...)
modules))))
(define (module-loaded? module)
"Return #t if MODULE is already loaded. MODULE must be a Linux module name,
not a file name."
(member module (modules-loaded)))
(define* (load-linux-module* file
#:key
(recursive? #t)
(lookup-module dot-ko))
"Load Linux module from FILE, the name of a `.ko' file. When RECURSIVE? is
true, load its dependencies first (à la 'modprobe'.) The actual files
containing modules depended on are obtained by calling LOOKUP-MODULE with the
module name."
(define (slurp module)
;; TODO: Use 'mmap' to reduce memory usage.
(call-with-input-file file get-bytevector-all))
(when recursive?
(for-each (cut load-linux-module* <> #:lookup-module lookup-module)
(map lookup-module (module-dependencies file))))
(format (current-module-debugging-port)
"loading Linux module from '~a'...~%" file)
(catch 'system-error
(lambda ()
(load-linux-module (slurp file)))
(lambda args
;; If this module was already loaded and we're in modprobe style, ignore
;; the error.
(unless (and recursive? (= EEXIST (system-error-errno args)))
(apply throw args)))))
;;; linux-modules.scm ends here
-241
View File
@@ -1,241 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014 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 vm)
#:use-module (guix build utils)
#:use-module (guix build store-copy)
#:use-module (gnu build linux-boot)
#:use-module (gnu build install)
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
#:use-module (srfi srfi-26)
#:export (qemu-command
load-in-linux-vm
format-partition
initialize-root-partition
initialize-partition-table
initialize-hard-disk))
;;; Commentary:
;;;
;;; This module provides supporting code to run virtual machines and build
;;; virtual machine images using QEMU.
;;;
;;; Code:
(define* (qemu-command #:optional (system %host-type))
"Return the default name of the QEMU command for SYSTEM."
(let ((cpu (substring %host-type 0
(string-index %host-type #\-))))
(string-append "qemu-system-"
(if (string-match "^i[3456]86$" cpu)
"i386"
cpu))))
(define* (load-in-linux-vm builder
#:key
output
(qemu (qemu-command)) (memory-size 512)
linux initrd
make-disk-image? (disk-image-size 100)
(disk-image-format "qcow2")
(references-graphs '()))
"Run BUILDER, a Scheme file, into a VM running LINUX with INITRD, and copy
the result to OUTPUT.
When MAKE-DISK-IMAGE? is true, OUTPUT will contain a VM image of
DISK-IMAGE-SIZE MiB resulting from the execution of BUILDER, which may access
it via /dev/hda.
REFERENCES-GRAPHS can specify a list of reference-graph files as produced by
the #:references-graphs parameter of 'derivation'."
(define image-file
(string-append "image." disk-image-format))
(when make-disk-image?
(unless (zero? (system* "qemu-img" "create" "-f" disk-image-format
image-file
(number->string disk-image-size)))
(error "qemu-img failed")))
(mkdir "xchg")
(match references-graphs
((graph-files ...)
;; Copy the reference-graph files under xchg/ so EXP can access it.
(map (lambda (file)
(copy-file file (string-append "xchg/" file)))
graph-files))
(_ #f))
(unless (zero?
(apply system* qemu "-enable-kvm" "-nographic" "-no-reboot"
"-m" (number->string memory-size)
"-net" "nic,model=virtio"
"-virtfs"
(string-append "local,id=store_dev,path="
(%store-directory)
",security_model=none,mount_tag=store")
"-virtfs"
(string-append "local,id=xchg_dev,path=xchg"
",security_model=none,mount_tag=xchg")
"-kernel" linux
"-initrd" initrd
"-append" (string-append "console=ttyS0 --load="
builder)
(if make-disk-image?
`("-drive" ,(string-append "file=" image-file
",if=virtio"))
'())))
(error "qemu failed" qemu))
(if make-disk-image?
(copy-file image-file output)
(begin
(mkdir output)
(copy-recursively "xchg" output))))
(define* (initialize-partition-table device partition-size
#:key
bootable?
(label-type "msdos")
(offset (expt 2 20)))
"Create on DEVICE a partition table of type LABEL-TYPE, with a single
partition of PARTITION-SIZE bytes starting at OFFSET bytes. When BOOTABLE? is
true, set the bootable flag on the partition. Return #t on success."
(format #t "creating partition table with a ~a B partition...\n"
partition-size)
(unless (zero? (apply system* "parted" device "mklabel" label-type
"mkpart" "primary" "ext2"
(format #f "~aB" offset)
(format #f "~aB" partition-size)
(if bootable?
'("set" "1" "boot" "on")
'())))
(error "failed to create partition table")))
(define MS_BIND 4096) ; <sys/mounts.h> again!
(define* (format-partition partition type
#:key label)
"Create a file system TYPE on PARTITION. If LABEL is true, use that as the
volume name."
(format #t "creating ~a partition...\n" type)
(unless (zero? (apply system* (string-append "mkfs." type)
"-F" partition
(if label
`("-L" ,label)
'())))
(error "failed to create partition")))
(define* (initialize-root-partition target-directory
#:key copy-closures? register-closures?
closures system-directory)
"Initialize the root partition mounted at TARGET-DIRECTORY."
(define target-store
(string-append target-directory (%store-directory)))
(when copy-closures?
;; Populate the store.
(populate-store (map (cut string-append "/xchg/" <>) closures)
target-directory))
;; Populate /dev.
(make-essential-device-nodes #:root target-directory)
;; Optionally, register the inputs in the image's store.
(when register-closures?
(unless copy-closures?
;; XXX: 'guix-register' wants to palpate the things it registers, so
;; bind-mount the store on the target.
(mkdir-p target-store)
(mount (%store-directory) target-store "" MS_BIND))
(display "registering closures...\n")
(for-each (lambda (closure)
(register-closure target-directory
(string-append "/xchg/" closure)))
closures)
(unless copy-closures?
(system* "umount" target-store)))
;; Add the non-store directories and files.
(display "populating...\n")
(populate-root-file-system system-directory target-directory))
(define (register-grub.cfg-root target grub.cfg)
"On file system TARGET, register GRUB.CFG as a GC root."
(let ((directory (string-append target "/var/guix/gcroots")))
(mkdir-p directory)
(symlink grub.cfg (string-append directory "/grub.cfg"))))
(define* (initialize-hard-disk device
#:key
system-directory
grub.cfg
disk-image-size
(file-system-type "ext4")
file-system-label
(closures '())
copy-closures?
(bootable? #t)
(register-closures? #t))
"Initialize DEVICE, a disk of DISK-IMAGE-SIZE bytes, with a FILE-SYSTEM-TYPE
partition with (optionally) FILE-SYSTEM-LABEL as its volume name, and with
GRUB installed. When BOOTABLE? is true, set the bootable flag on that
partition.
If REGISTER-CLOSURES? is true, register all of CLOSURES is the partition's
store. If COPY-CLOSURES? is true, copy all of CLOSURES to the partition.
SYSTEM-DIRECTORY is the name of the directory of the 'system' derivation."
(define target-directory
"/fs")
(define partition
(string-append device "1"))
(initialize-partition-table device
(- disk-image-size (* 5 (expt 2 20)))
#:bootable? bootable?)
(format-partition partition file-system-type
#:label file-system-label)
(display "mounting partition...\n")
(mkdir target-directory)
(mount partition target-directory file-system-type)
(initialize-root-partition target-directory
#:system-directory system-directory
#:copy-closures? copy-closures?
#:register-closures? register-closures?
#:closures closures)
(install-grub grub.cfg device target-directory)
;; Register GRUB.CFG as a GC root.
(register-grub.cfg-root target-directory grub.cfg)
;; 'guix-register' resets timestamps and everything, so no need to do it
;; once more in that case.
(unless register-closures?
(reset-timestamps target-directory))
(zero? (system* "umount" target-directory)))
;;; vm.scm ends here
-420
View File
@@ -1,420 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013 Mark H Weaver <mhw@netris.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 (gnu packages)
#:use-module (guix packages)
#:use-module (guix ui)
#:use-module (guix utils)
#:use-module ((guix ftp-client) #:select (ftp-open))
#:use-module (guix gnu-maintenance)
#:use-module (ice-9 ftw)
#:use-module (ice-9 vlist)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
#:use-module (srfi srfi-39)
#:export (search-patch
search-bootstrap-binary
%patch-path
%bootstrap-binaries-path
%package-module-path
fold-packages
find-packages-by-name
find-best-packages-by-name
find-newest-available-packages
package-direct-dependents
package-transitive-dependents
package-covering-dependents
check-package-freshness
specification->package))
;;; Commentary:
;;;
;;; General utilities for the software distribution---i.e., the modules under
;;; (gnu packages ...).
;;;
;;; Code:
;; By default, we store patches and bootstrap binaries alongside Guile
;; modules. This is so that these extra files can be found without
;; requiring a special setup, such as a specific installation directory
;; and an extra environment variable. One advantage of this setup is
;; that everything just works in an auto-compilation setting.
(define %bootstrap-binaries-path
(make-parameter
(map (cut string-append <> "/gnu/packages/bootstrap")
%load-path)))
(define (search-patch file-name)
"Search the patch FILE-NAME. Raise an error if not found."
(or (search-path (%patch-path) file-name)
(raise (condition
(&message (message (format #f (_ "~a: patch not found")
file-name)))))))
(define (search-bootstrap-binary file-name system)
"Search the bootstrap binary FILE-NAME for SYSTEM. Raise an error if not
found."
(or (search-path (%bootstrap-binaries-path)
(string-append system "/" file-name))
(raise (condition
(&message
(message
(format #f (_ "could not find bootstrap binary '~a' \
for system '~a'")
file-name system)))))))
(define %distro-root-directory
;; Absolute file name of the module hierarchy.
(dirname (search-path %load-path "guix.scm")))
(define %package-module-path
;; Search path for package modules. Each item must be either a directory
;; name or a pair whose car is a directory and whose cdr is a sub-directory
;; to narrow the search.
(let* ((not-colon (char-set-complement (char-set #\:)))
(environment (string-tokenize (or (getenv "GUIX_PACKAGE_PATH") "")
not-colon)))
;; Automatically add items from $GUIX_PACKAGE_PATH to Guile's search path.
(for-each (lambda (directory)
(set! %load-path (cons directory %load-path))
(set! %load-compiled-path
(cons directory %load-compiled-path)))
environment)
(make-parameter
(append environment `((,%distro-root-directory . "gnu/packages"))))))
(define %patch-path
;; Define it after '%package-module-path' so that '%load-path' contains user
;; directories, allowing patches in $GUIX_PACKAGE_PATH to be found.
(make-parameter
(map (lambda (directory)
(if (string=? directory %distro-root-directory)
(string-append directory "/gnu/packages/patches")
directory))
%load-path)))
(define* (scheme-files directory)
"Return the list of Scheme files found under DIRECTORY, recursively. The
returned list is sorted in alphabetical order."
;; Sort entries so that 'fold-packages' works in a deterministic fashion
;; regardless of details of the underlying file system.
(sort (file-system-fold (const #t) ; enter?
(lambda (path stat result) ; leaf
(if (string-suffix? ".scm" path)
(cons path result)
result))
(lambda (path stat result) ; down
result)
(lambda (path stat result) ; up
result)
(const #f) ; skip
(lambda (path stat errno result)
(warning (_ "cannot access `~a': ~a~%")
path (strerror errno))
result)
'()
directory
stat)
string<?))
(define file-name->module-name
(let ((not-slash (char-set-complement (char-set #\/))))
(lambda (file)
"Return the module name (a list of symbols) corresponding to FILE."
(map string->symbol
(string-tokenize (string-drop-right file 4) not-slash)))))
(define* (package-modules directory #:optional sub-directory)
"Return the list of modules that provide packages for the distribution.
Optionally, narrow the search to SUB-DIRECTORY."
(define prefix-len
(string-length directory))
(filter-map (lambda (file)
(let* ((file (substring file prefix-len))
(module (file-name->module-name file)))
(catch #t
(lambda ()
(resolve-interface module))
(lambda args
;; Report the error, but keep going.
(warn-about-load-error module args)
#f))))
(scheme-files (if sub-directory
(string-append directory "/" sub-directory)
directory))))
(define* (all-package-modules #:optional (path (%package-module-path)))
"Return the list of package modules found in PATH, a list of directories to
search."
(fold-right (lambda (spec result)
(match spec
((? string? directory)
(append (package-modules directory) result))
((directory . sub-directory)
(append (package-modules directory sub-directory)
result))))
'()
path))
(define (fold-packages proc init)
"Call (PROC PACKAGE RESULT) for each available package, using INIT as
the initial value of RESULT. It is guaranteed to never traverse the
same package twice."
(identity ; discard second return value
(fold2 (lambda (module result seen)
(fold2 (lambda (var result seen)
(if (and (package? var)
(not (vhash-assq var seen)))
(values (proc var result)
(vhash-consq var #t seen))
(values result seen)))
result
seen
(module-map (lambda (sym var)
(false-if-exception (variable-ref var)))
module)))
init
vlist-null
(all-package-modules))))
(define find-packages-by-name
(let ((packages (delay
(fold-packages (lambda (p r)
(vhash-cons (package-name p) p r))
vlist-null)))
(version>? (lambda (p1 p2)
(version>? (package-version p1) (package-version p2)))))
(lambda* (name #:optional version)
"Return the list of packages with the given NAME. If VERSION is not #f,
then only return packages whose version is prefixed by VERSION, sorted in
decreasing version order."
(let ((matching (sort (vhash-fold* cons '() name (force packages))
version>?)))
(if version
(filter (lambda (package)
(string-prefix? version (package-version package)))
matching)
matching)))))
(define find-newest-available-packages
(memoize
(lambda ()
"Return a vhash keyed by package names, and with
associated values of the form
(newest-version newest-package ...)
where the preferred package is listed first."
;; FIXME: Currently, the preferred package is whichever one
;; was found last by 'fold-packages'. Find a better solution.
(fold-packages (lambda (p r)
(let ((name (package-name p))
(version (package-version p)))
(match (vhash-assoc name r)
((_ newest-so-far . pkgs)
(case (version-compare version newest-so-far)
((>) (vhash-cons name `(,version ,p) r))
((=) (vhash-cons name `(,version ,p ,@pkgs) r))
((<) r)))
(#f (vhash-cons name `(,version ,p) r)))))
vlist-null))))
(define (find-best-packages-by-name name version)
"If version is #f, return the list of packages named NAME with the highest
version numbers; otherwise, return the list of packages named NAME and at
VERSION."
(if version
(find-packages-by-name name version)
(match (vhash-assoc name (find-newest-available-packages))
((_ version pkgs ...) pkgs)
(#f '()))))
(define* (vhash-refq vhash key #:optional (dflt #f))
"Look up KEY in the vhash VHASH, and return the value (if any) associated
with it. If KEY is not found, return DFLT (or `#f' if no DFLT argument is
supplied). Uses `eq?' for equality testing."
(or (and=> (vhash-assq key vhash) cdr)
dflt))
(define package-dependencies
(memoize
(lambda ()
"Return a vhash keyed by package, and with associated values that are a
list of packages that depend on that package."
(fold-packages
(lambda (package dag)
(fold
(lambda (in d)
;; Insert a graph edge from each of package's inputs to package.
(vhash-consq in
(cons package (vhash-refq d in '()))
(vhash-delq in d)))
dag
(match (package-direct-inputs package)
(((labels packages . _) ...)
packages) )))
vlist-null))))
(define (package-direct-dependents packages)
"Return a list of packages from the distribution that directly depend on the
packages in PACKAGES."
(delete-duplicates
(concatenate
(map (lambda (p)
(vhash-refq (package-dependencies) p '()))
packages))))
(define (package-transitive-dependents packages)
"Return the transitive dependent packages of the distribution packages in
PACKAGES---i.e. the dependents of those packages, plus their dependents,
recursively."
(let ((dependency-dag (package-dependencies)))
(fold-tree
cons '()
(lambda (node) (vhash-refq dependency-dag node))
;; Start with the dependents to avoid including PACKAGES in the result.
(package-direct-dependents packages))))
(define (package-covering-dependents packages)
"Return a minimal list of packages from the distribution whose dependencies
include all of PACKAGES and all packages that depend on PACKAGES."
(let ((dependency-dag (package-dependencies)))
(fold-tree-leaves
cons '()
(lambda (node) (vhash-refq dependency-dag node))
;; Start with the dependents to avoid including PACKAGES in the result.
(package-direct-dependents packages))))
(define %sigint-prompt
;; The prompt to jump to upon SIGINT.
(make-prompt-tag "interruptible"))
(define (call-with-sigint-handler thunk handler)
"Call THUNK and return its value. Upon SIGINT, call HANDLER with the signal
number in the context of the continuation of the call to this function, and
return its return value."
(call-with-prompt %sigint-prompt
(lambda ()
(sigaction SIGINT
(lambda (signum)
(sigaction SIGINT SIG_DFL)
(abort-to-prompt %sigint-prompt signum)))
(dynamic-wind
(const #t)
thunk
(cut sigaction SIGINT SIG_DFL)))
(lambda (k signum)
(handler signum))))
(define-syntax-rule (waiting exp fmt rest ...)
"Display the given message while EXP is being evaluated."
(let* ((message (format #f fmt rest ...))
(blank (make-string (string-length message) #\space)))
(display message (current-error-port))
(force-output (current-error-port))
(call-with-sigint-handler
(lambda ()
(dynamic-wind
(const #f)
(lambda () exp)
(lambda ()
;; Clear the line.
(display #\cr (current-error-port))
(display blank (current-error-port))
(display #\cr (current-error-port))
(force-output (current-error-port)))))
(lambda (signum)
(format (current-error-port) " interrupted by signal ~a~%" SIGINT)
#f))))
(define ftp-open*
;; Memoizing version of `ftp-open'. The goal is to avoid initiating a new
;; FTP connection for each package, esp. since most of them are to the same
;; server. This has a noticeable impact when doing "guix upgrade -u".
(memoize ftp-open))
(define (check-package-freshness package)
"Check whether PACKAGE has a newer version available upstream, and report
it."
;; TODO: Automatically inject the upstream version when desired.
(catch #t
(lambda ()
(when (false-if-exception (gnu-package? package))
(let ((name (package-name package))
(full-name (package-full-name package)))
(match (waiting (latest-release name
#:ftp-open ftp-open*
#:ftp-close (const #f))
(_ "looking for the latest release of GNU ~a...") name)
((? gnu-release? release)
(let ((latest-version
(string-append (gnu-release-package release) "-"
(gnu-release-version release))))
(when (version>? latest-version full-name)
(format (current-error-port)
(_ "~a: note: using ~a \
but ~a is available upstream~%")
(location->string (package-location package))
full-name latest-version))))
(_ #t)))))
(lambda (key . args)
;; Silently ignore networking errors rather than preventing
;; installation.
(case key
((getaddrinfo-error ftp-error) #f)
(else (apply throw key args))))))
(define (specification->package spec)
"Return a package matching SPEC. SPEC may be a package name, or a package
name followed by a hyphen and a version number. If the version number is not
present, return the preferred newest version."
(let-values (((name version)
(package-name->name+version spec)))
(match (find-best-packages-by-name name version)
((p) ; one match
p)
((p x ...) ; several matches
(warning (_ "ambiguous package specification `~a'~%") spec)
(warning (_ "choosing ~a from ~a~%")
(package-full-name p)
(location->string (package-location p)))
p)
(_ ; no matches
(if version
(leave (_ "~A: package not found for version ~a~%")
name version)
(leave (_ "~A: unknown package~%") name))))))
-70
View File
@@ -1,70 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
;;;
;;; 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 aarddict)
#:use-module ((guix licenses) #:select (gpl3))
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix build-system python)
#:use-module (gnu packages python)
#:use-module (gnu packages qt))
(define-public aarddict
(package
(name "aarddict")
(version "0.9.3")
(source
(origin
(method url-fetch)
(uri (string-append "https://github.com/aarddict/desktop/archive/"
version ".tar.gz"))
(file-name (string-append name "-" version ".tar.gz"))
(sha256
(base32
"12h7m0z7nd7rg8avpi9syd265k0rhh4vbdh464nq0jzdg8m9p28c"))))
(build-system python-build-system)
(inputs
`(("python2-pyicu" ,python2-pyicu)
("python2-pyqt-4" ,python2-pyqt-4)
("python2-setuptools" ,python2-setuptools)
("python2-simplejson" ,python2-simplejson)
("python2-sip" ,python2-sip)))
(arguments
`(#:python ,python-2 ; incompatible with Python 3
#:phases
(alist-cons-before
'build 'configure
;; Force data into the output instead of the python package.
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
(substitute* "setup.py"
(("sys.prefix") (string-append "'" out "'")))))
%standard-phases)))
(home-page "http://aarddict.org/index.html")
(synopsis
"Dictionary program and offline Wikipedia reader")
(description
"Aard Dictionary is a free, fast, easy to use word lookup program that
looks up words fast even with huge dictionaries like English Wikipedia;
looks up words in multiple dictionaries in multiple languages without
switching;
works great as offline Wikipedia reader;
is keyboard navigation friendly;
has efficient, highly compressed dictionary data storage format with
ability to verify data integrity built-in.")
(license gpl3)))
-106
View File
@@ -1,106 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 Marek Benc <merkur32@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu packages abiword)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix build-system gnu)
#:use-module (gnu packages)
#:use-module (gnu packages boost)
#:use-module (gnu packages compression)
#:use-module (gnu packages enchant)
#:use-module (gnu packages fribidi)
#:use-module (gnu packages fontutils)
#:use-module (gnu packages glib)
#:use-module (gnu packages gnome)
#:use-module (gnu packages gtk)
#:use-module (gnu packages image)
#:use-module (gnu packages ots)
#:use-module (gnu packages popt)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages readline)
#:use-module (gnu packages wv)
#:use-module (gnu packages xml))
(define-public abiword
(package
(name "abiword")
(version "2.8.6")
(source
(origin
(method url-fetch)
(uri
(string-append "http://abisource.org/downloads/" name "/" version
"/source/" name "-" version ".tar.gz"))
(sha256
(base32 "059sd2apxdmcacc4pll880i7vm18h0kyjsq299m1mz3c7ak8k46r"))
(patches
(list
(search-patch "abiword-wmf-version-lookup-fix.patch")
(search-patch "abiword-no-include-glib-internal-headers.patch")
(search-patch "abiword-explictly-cast-bools.patch")
(search-patch "abiword-use-proper-png-api.patch")
(search-patch "abiword-pass-no-undefined-to-linker.patch")
(search-patch "abiword-link-plugins-against-backend.patch")))))
(build-system gnu-build-system)
(arguments ;; NOTE: rsvg is disabled, since Abiword
`(#:configure-flags ;; supports it directly, and its BS is broken.
(list
"--enable-clipart" ;; TODO: The following plugins have unresolved
"--enable-templates" ;; dependencies: aiksaurus, grammar, wpg, gda,
(string-append ;; wordperfect, psion, mathview, goffice.
"--enable-plugins="
"applix " "babelfish " "bmp " "clarisworks " "collab " "command "
"docbook " "eml " "freetranslation " "garble " "gdict " "gimp "
"google " "hancom " "hrtext " "iscii " "kword " "latex "
"loadbindings " "mht " "mif " "mswrite " "opendocument "
"openwriter " "openxml " "opml " "ots " "paint " "passepartout "
"pdb " "pdf " "presentation " "s5 " "sdw " "t602 " "urldict "
"wikipedia " "wmf " "wml " "xslfo"))))
(inputs
`(("boost" ,boost)
("enchant" ,enchant)
("fontconfig" ,fontconfig)
("fribidi" ,fribidi)
("glib" ,glib)
("gtk+" ,gtk+-2)
("libglade" ,libglade)
("libgsf" ,libgsf)
("libjpeg" ,libjpeg)
("libpng" ,libpng)
("librsvg" ,librsvg)
("libwmf" ,libwmf)
("libxml2" ,libxml2)
("ots" ,ots)
("popt" ,popt)
("readline" ,readline)
("wv" ,wv)
("zlib" ,zlib)))
(native-inputs
`(("intltool" ,intltool)
("glib:bin" ,glib "bin")
("pkg-config" ,pkg-config)))
(home-page "http://abisource.org/")
(synopsis "Word processing program")
(description
"AbiWord is a word processing program. It is rapidly becoming a state
of the art word processor, with lots of features useful for your daily work,
personal needs, or for just some good old typing fun.")
(license license:gpl2+)))

Some files were not shown because too many files have changed in this diff Show More