mirror of
https://codeberg.org/guix/guix.git
synced 2026-04-28 14:43:51 +00:00
Compare commits
3 Commits
python-tea
...
wip-contai
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c2631658c | ||
|
|
054ee2038e | ||
|
|
e086dcfcf9 |
@@ -1,8 +0,0 @@
|
||||
[codespell]
|
||||
skip = guix/d3.v3.js, *.po, doc/*info, doc/*.de.*, doc/*.es.*, doc/*.fr.*, doc/*.it.*, doc/*.ko.*, doc/*.pt_BR.*, doc/*.ru.*, doc/*.sk.*, doc/*.sv.*, doc/*.zh_CN.*
|
||||
ignore-words-list = crate, debbugs, deriver
|
||||
write-changes = true
|
||||
# ask for confirmation, ask to choose from a list
|
||||
interactive = 3
|
||||
# Number of lines to show before and after for context
|
||||
context = 1
|
||||
672
.dir-locals.el
672
.dir-locals.el
@@ -1,182 +1,45 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2013,2014 Mark H Weaver <mhw@netris.org>
|
||||
;;; Copyright © 2014 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
||||
;;; Copyright © 2015 David Thompson <davet@gnu.org>
|
||||
;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
|
||||
;;; Copyright © 2017 Alex Kost <alezost@gmail.com>
|
||||
;;; Copyright © 2018-2020 Caleb Ristvedt <caleb.ristvedt@cune.org>
|
||||
;;; Copyright © 2020-2023, 2025 Maxim Cournoyer <maxim@guixotic.coop>
|
||||
;;; Copyright © 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com>
|
||||
;;; Copyright © 2020 Christine Lemmer-Webber <cwebber@dustycloud.org>
|
||||
;;; Copyright © 2022 Liliana Marie Prikler <liliana.prikler@gmail.com>
|
||||
;;; Copyright © 2022 Andrew Tropin <andrew@trop.in>
|
||||
;;; Copyright © 2022 Brian Cully <bjc@kublai.com>
|
||||
;;; Copyright © 2023 (unmatched-parenthesis <paren@disroot.org>
|
||||
;;; Copyright © 2024 Christopher Baines <mail@cbaines.net>
|
||||
;;; Copyright © 2024 Tomas Volf <~@wolfsden.cz>
|
||||
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
|
||||
;;; Copyright © 2025 David Elsing <david.elsing@posteo.net>
|
||||
;;; Copyright © 2025 Hilton Chain <hako@ultrarare.space>
|
||||
;;; 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/>.
|
||||
|
||||
;; Per-directory local variables for GNU Emacs 23 and later.
|
||||
|
||||
((nil
|
||||
. ((fill-column . 78)
|
||||
(tab-width . 8)
|
||||
(sentence-end-double-space . t)
|
||||
|
||||
;; For use with 'bug-reference-prog-mode'. Extra bug-reference
|
||||
;; configuration should be done in your Emacs user configuration file;
|
||||
;; refer to (info (guix) The Perfect Setup).
|
||||
;; For use with 'bug-reference-prog-mode'.
|
||||
(bug-reference-url-format . "http://bugs.gnu.org/%s")
|
||||
(bug-reference-bug-regexp
|
||||
. "\\(<https?://\\bugs\\.gnu\\.org/\\([0-9]+\\)>\\)")
|
||||
(bug-reference-url-format . "https://issues.guix.gnu.org/%s")
|
||||
|
||||
(eval . (add-to-list 'completion-ignored-extensions ".go"))
|
||||
|
||||
;; Emacs-Guix
|
||||
(eval . (setq-local guix-directory
|
||||
(locate-dominating-file default-directory
|
||||
".dir-locals.el")))
|
||||
;; Magit
|
||||
(eval . (with-eval-after-load 'git-commit
|
||||
(add-to-list 'git-commit-trailers "Change-Id")))
|
||||
|
||||
;; TempEl
|
||||
(eval . (with-eval-after-load
|
||||
'tempel
|
||||
(if (stringp tempel-path)
|
||||
(setq tempel-path (list tempel-path)))
|
||||
(let ((guix-tempel-snippets
|
||||
(concat
|
||||
(expand-file-name
|
||||
"etc/snippets/tempel"
|
||||
(locate-dominating-file default-directory
|
||||
".dir-locals.el"))
|
||||
"/*.eld")))
|
||||
(unless (member guix-tempel-snippets tempel-path)
|
||||
(add-to-list 'tempel-path guix-tempel-snippets)))))
|
||||
|
||||
;; YASnippet
|
||||
(eval . (with-eval-after-load
|
||||
'yasnippet
|
||||
(let ((guix-yasnippets
|
||||
(expand-file-name
|
||||
"etc/snippets/yas"
|
||||
(locate-dominating-file default-directory
|
||||
".dir-locals.el"))))
|
||||
(unless (member guix-yasnippets yas-snippet-dirs)
|
||||
(add-to-list 'yas-snippet-dirs guix-yasnippets)
|
||||
(yas-reload-all)))))
|
||||
|
||||
;; Geiser
|
||||
;; This allows automatically setting the `geiser-guile-load-path'
|
||||
;; variable when using various Guix checkouts (e.g., via git worktrees).
|
||||
(geiser-repl-per-project-p . t)
|
||||
(geiser-insert-actual-lambda . nil)))
|
||||
|
||||
. "<https?://\\(debbugs\\|bugs\\)\\.gnu\\.org/\\([0-9]+\\)>")))
|
||||
(c-mode . ((c-file-style . "gnu")))
|
||||
(emacs-lisp-mode . ((indent-tabs-mode . nil)))
|
||||
(texinfo-mode . ((indent-tabs-mode . nil)
|
||||
(fill-column . 72)))
|
||||
(scheme-mode
|
||||
.
|
||||
((indent-tabs-mode . nil)
|
||||
|
||||
;; Emacs 28 changed the behavior of 'lisp-fill-paragraph', which causes the
|
||||
;; first line of package descriptions to extrude past 'fill-column', and
|
||||
;; somehow that is deemed more correct upstream (see:
|
||||
;; https://issues.guix.gnu.org/56197).
|
||||
(eval . (progn
|
||||
(require 'lisp-mode)
|
||||
(defun emacs27-lisp-fill-paragraph (&optional justify)
|
||||
(interactive "P")
|
||||
(or (fill-comment-paragraph justify)
|
||||
(let ((paragraph-start
|
||||
(concat paragraph-start
|
||||
"\\|\\s-*\\([(;\"]\\|\\s-:\\|`(\\|#'(\\)"))
|
||||
(paragraph-separate
|
||||
(concat paragraph-separate "\\|\\s-*\".*[,\\.]$"))
|
||||
(fill-column (if (and (integerp emacs-lisp-docstring-fill-column)
|
||||
(derived-mode-p 'emacs-lisp-mode))
|
||||
emacs-lisp-docstring-fill-column
|
||||
fill-column)))
|
||||
(fill-paragraph justify))
|
||||
;; Never return nil.
|
||||
t))
|
||||
(setq-local fill-paragraph-function #'emacs27-lisp-fill-paragraph)))
|
||||
|
||||
;; 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 ?+ "'"))
|
||||
|
||||
(eval . (put 'eval-when 'scheme-indent-function 1))
|
||||
(eval . (put 'call-with-prompt 'scheme-indent-function 1))
|
||||
(eval . (put 'test-assert 'scheme-indent-function 1))
|
||||
(eval . (put 'test-assertm 'scheme-indent-function 1))
|
||||
(eval . (put 'test-equalm '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 'call-with-port 'scheme-indent-function 1))
|
||||
(eval . (put 'guard 'scheme-indent-function 1))
|
||||
(eval . (put 'lambda* 'scheme-indent-function 1))
|
||||
(eval . (put 'peekable-lambda 'scheme-indent-function 1))
|
||||
(eval . (put 'substitute* 'scheme-indent-function 1))
|
||||
(eval . (put 'match-record 'scheme-indent-function 3))
|
||||
(eval . (put 'match-record-lambda 'scheme-indent-function 2))
|
||||
(eval . (put 'with-fluids 'scheme-indent-function 2))
|
||||
|
||||
;; TODO: Contribute these to Emacs' scheme-mode.
|
||||
(eval . (put 'let-keywords 'scheme-indent-function 3))
|
||||
|
||||
;; 'modify-inputs' and its keywords.
|
||||
(eval . (put 'modify-inputs 'scheme-indent-function 1))
|
||||
(eval . (put 'replace 'scheme-indent-function 1))
|
||||
|
||||
;; 'modify-phases' and its keywords.
|
||||
(eval . (put 'modify-phases 'scheme-indent-function 1))
|
||||
(eval . (put 'replace 'scheme-indent-function 1))
|
||||
(eval . (put 'add-before 'scheme-indent-function 2))
|
||||
(eval . (put 'add-after 'scheme-indent-function 2))
|
||||
|
||||
(eval . (put 'modify-services 'scheme-indent-function 1))
|
||||
(eval . (put 'with-directory-excursion 'scheme-indent-function 1))
|
||||
(eval . (put 'with-file-lock 'scheme-indent-function 1))
|
||||
(eval . (put 'with-file-lock/no-wait 'scheme-indent-function 1))
|
||||
(eval . (put 'with-profile-lock 'scheme-indent-function 1))
|
||||
(eval . (put 'with-writable-file 'scheme-indent-function 2))
|
||||
|
||||
(eval . (put 'package/inherit '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-store/non-blocking 'scheme-indent-function 1))
|
||||
(eval . (put 'with-external-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 'call-with-gzip-input-port 'scheme-indent-function 1))
|
||||
(eval . (put 'call-with-gzip-output-port 'scheme-indent-function 1))
|
||||
(eval . (put 'call-with-lzip-input-port 'scheme-indent-function 1))
|
||||
(eval . (put 'call-with-lzip-output-port 'scheme-indent-function 1))
|
||||
(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))
|
||||
@@ -184,12 +47,7 @@
|
||||
(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 2))
|
||||
(eval . (put 'with-status-report 'scheme-indent-function 1))
|
||||
(eval . (put 'with-status-verbosity 'scheme-indent-function 1))
|
||||
(eval . (put 'with-build-handler 'scheme-indent-function 1))
|
||||
|
||||
(eval . (put 'mlambda 'scheme-indent-function 1))
|
||||
(eval . (put 'mlambdaq '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))
|
||||
@@ -197,505 +55,19 @@
|
||||
(eval . (put 'munless 'scheme-indent-function 1))
|
||||
(eval . (put 'mlet* 'scheme-indent-function 2))
|
||||
(eval . (put 'mlet 'scheme-indent-function 2))
|
||||
(eval . (put 'state-parameterize 'scheme-indent-function 2))
|
||||
(eval . (put 'store-parameterize '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))
|
||||
(eval . (put 'wrap-script 'scheme-indent-function 1))
|
||||
(eval . (put 'with-imported-modules 'scheme-indent-function 1))
|
||||
(eval . (put 'with-extensions 'scheme-indent-function 1))
|
||||
(eval . (put 'with-parameters 'scheme-indent-function 1))
|
||||
(eval . (put 'let-system 'scheme-indent-function 1))
|
||||
(eval . (put 'with-build-variables 'scheme-indent-function 2))
|
||||
|
||||
(eval . (put 'with-database 'scheme-indent-function 2))
|
||||
(eval . (put 'call-with-database 'scheme-indent-function 1))
|
||||
(eval . (put 'call-with-transaction 'scheme-indent-function 1))
|
||||
(eval . (put 'call-with-retrying-transaction 'scheme-indent-function 1))
|
||||
|
||||
(eval . (put 'call-with-container 'scheme-indent-function 1))
|
||||
(eval . (put 'container-excursion 'scheme-indent-function 1))
|
||||
(eval . (put 'eventually 'scheme-indent-function 1))
|
||||
|
||||
(eval . (put 'call-with-progress-reporter 'scheme-indent-function 1))
|
||||
(eval . (put 'with-repository 'scheme-indent-function 2))
|
||||
(eval . (put 'with-temporary-git-repository 'scheme-indent-function 2))
|
||||
(eval . (put 'with-served-git-repository 'scheme-indent-function 2))
|
||||
(eval . (put 'with-environment-variables 'scheme-indent-function 1))
|
||||
(eval . (put 'with-fresh-gnupg-setup 'scheme-indent-function 1))
|
||||
|
||||
(eval . (put 'with-paginated-output-port 'scheme-indent-function 1))
|
||||
|
||||
(eval . (put 'with-shepherd-action 'scheme-indent-function 3))
|
||||
|
||||
(eval . (put 'with-http-server 'scheme-indent-function 1))
|
||||
|
||||
;; Record constructors.
|
||||
;; URIs for origin methods.
|
||||
(eval . (put 'android-repo-reference 'scheme-indent-function 0))
|
||||
(eval . (put 'bzr-reference 'scheme-indent-function 0))
|
||||
(eval . (put 'cvs-reference 'scheme-indent-function 0))
|
||||
(eval . (put 'git-checkout 'scheme-indent-function 0))
|
||||
(eval . (put 'git-reference 'scheme-indent-function 0))
|
||||
(eval . (put 'hg-reference 'scheme-indent-function 0))
|
||||
(eval . (put 'svn-multi-reference 'scheme-indent-function 0))
|
||||
(eval . (put 'svn-reference 'scheme-indent-function 0))
|
||||
|
||||
;; guix/
|
||||
(eval . (put 'avahi-service 'scheme-indent-function 0))
|
||||
(eval . (put 'bag 'scheme-indent-function 0))
|
||||
(eval . (put 'build-status 'scheme-indent-function 0))
|
||||
(eval . (put 'build-system 'scheme-indent-function 0))
|
||||
(eval . (put 'channel 'scheme-indent-function 0))
|
||||
(eval . (put 'gnu-package-descriptor 'scheme-indent-function 0))
|
||||
(eval . (put 'graft 'scheme-indent-function 0))
|
||||
(eval . (put 'lint-checker 'scheme-indent-function 0))
|
||||
(eval . (put 'lint-warning 'scheme-indent-function 0))
|
||||
(eval . (put 'manifest-entry 'scheme-indent-function 0))
|
||||
(eval . (put 'manifest-pattern 'scheme-indent-function 0))
|
||||
(eval . (put 'manifest-transaction 'scheme-indent-function 0))
|
||||
(eval . (put 'node-type 'scheme-indent-function 0))
|
||||
(eval . (put 'origin 'scheme-indent-function 0))
|
||||
(eval . (put 'package 'scheme-indent-function 0))
|
||||
(eval . (put 'platform 'scheme-indent-function 0))
|
||||
(eval . (put 'profile 'scheme-indent-function 0))
|
||||
(eval . (put 'progress-reporter 'scheme-indent-function 0))
|
||||
(eval . (put 'search-path-specification 'scheme-indent-function 0))
|
||||
(eval . (put 'upstream-input 'scheme-indent-function 0))
|
||||
(eval . (put 'upstream-source 'scheme-indent-function 0))
|
||||
(eval . (put 'upstream-updater 'scheme-indent-function 0))
|
||||
|
||||
;; gnu/
|
||||
(eval . (put 'bootloader 'scheme-indent-function 0))
|
||||
(eval . (put 'bootloader-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'image 'scheme-indent-function 0))
|
||||
(eval . (put 'image-type 'scheme-indent-function 0))
|
||||
(eval . (put 'menu-entry 'scheme-indent-function 0))
|
||||
(eval . (put 'partition 'scheme-indent-function 0))
|
||||
|
||||
;; gnu/machine
|
||||
(eval . (put 'digital-ocean-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'environment-type 'scheme-indent-function 0))
|
||||
(eval . (put 'hetzner-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'machine 'scheme-indent-function 0))
|
||||
(eval . (put 'machine-ssh-configuration 'scheme-indent-function 0))
|
||||
|
||||
;; gnu/system
|
||||
(eval . (put 'boot-parameters 'scheme-indent-function 0))
|
||||
(eval . (put 'file-system 'scheme-indent-function 0))
|
||||
(eval . (put 'file-system-mapping 'scheme-indent-function 0))
|
||||
(eval . (put 'locale-definition 'scheme-indent-function 0))
|
||||
(eval . (put 'mapped-device 'scheme-indent-function 0))
|
||||
(eval . (put 'mapped-device-kind 'scheme-indent-function 0))
|
||||
(eval . (put 'name-service 'scheme-indent-function 0))
|
||||
(eval . (put 'name-service-switch 'scheme-indent-function 0))
|
||||
(eval . (put 'operating-system 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-entry 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-extension 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-service 'scheme-indent-function 0))
|
||||
(eval . (put 'privileged-program 'scheme-indent-function 0))
|
||||
(eval . (put 'subid-range 'scheme-indent-function 0))
|
||||
(eval . (put 'subids-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'subids-extension 'scheme-indent-function 0))
|
||||
(eval . (put 'swap-space 'scheme-indent-function 0))
|
||||
(eval . (put 'user-account 'scheme-indent-function 0))
|
||||
(eval . (put 'user-group 'scheme-indent-function 0))
|
||||
(eval . (put 'virtual-machine 'scheme-indent-function 0))
|
||||
|
||||
;; gnu/home
|
||||
(eval . (put 'home-bash-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-bash-extension 'scheme-indent-function 0))
|
||||
(eval . (put 'home-batsignal-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-beets-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-dbus-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-dotfiles-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-environment 'scheme-indent-function 0))
|
||||
(eval . (put 'home-fish-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-fish-extension 'scheme-indent-function 0))
|
||||
(eval . (put 'home-gpg-agent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-inputrc-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-kodi-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-mcron-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-msmtp-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-openssh-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-parcimonie-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-pipewire-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-redshift-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-shell-profile-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-shepherd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-ssh-agent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-unclutter-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-xdg-base-directories-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-xdg-mime-applications-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-xdg-user-directories-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-xmodmap-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-znc-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-zsh-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'home-zsh-extension 'scheme-indent-function 0))
|
||||
(eval . (put 'msmtp-account 'scheme-indent-function 0))
|
||||
(eval . (put 'msmtp-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openssh-host 'scheme-indent-function 0))
|
||||
(eval . (put 'point 'scheme-indent-function 0))
|
||||
(eval . (put 'proxy-jump 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-bar 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-border-color 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-color 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-input 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-mode 'scheme-indent-function 0))
|
||||
(eval . (put 'sway-output 'scheme-indent-function 0))
|
||||
(eval . (put 'xdg-desktop-action 'scheme-indent-function 0))
|
||||
(eval . (put 'xdg-desktop-entry 'scheme-indent-function 0))
|
||||
|
||||
;; gnu/services
|
||||
(eval . (put 'agate-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'agetty-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'alsa-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'anonip-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'apcupsd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'apcupsd-event-handlers 'scheme-indent-function 0))
|
||||
(eval . (put 'auditd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'autossh-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'avahi-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'backend-userroot-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'bffe-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'bitlbee-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'bluetooth-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'cachefilesd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'certbot-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'cgit-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'configuration-field 'scheme-indent-function 0))
|
||||
(eval . (put 'connman-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'connman-general-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'containerd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'cuirass-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'cuirass-remote-server-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'cuirass-remote-worker-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'cups-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'darkstat-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dbus-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dconf-keyfile 'scheme-indent-function 0))
|
||||
(eval . (put 'dconf-profile 'scheme-indent-function 0))
|
||||
(eval . (put 'debootstrap-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dhcp-client-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dhcpcd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dhcpd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dicod-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dict-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'directory-server-instance-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dnsmasq-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'docker-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dovecot-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'dropbear-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'earlyoom-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'elogind-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'enlightenment-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'exim-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ext-component-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fail2ban-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fail2ban-ignore-cache-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fail2ban-jail-action-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fail2ban-jail-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fail2ban-jail-filter-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fcgiwrap-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fifo-listener-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'file-database-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'files-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fprintd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'fstrim-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-cleaner-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-confd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-kvmd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-luxid-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-metad-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-mond-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-noded-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-os 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-os-variant 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-rapi-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-watcher-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ganeti-wconfd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gdm-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'geoclue-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'getmail-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'getmail-configuration-file 'scheme-indent-function 0))
|
||||
(eval . (put 'getmail-destination-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'getmail-options-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'getmail-retriever-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'git-daemon-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'git-http-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gitile-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gitolite-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gitolite-git-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gitolite-rc-file 'scheme-indent-function 0))
|
||||
(eval . (put 'gmnisrv-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gnome-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gnome-keyring-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gpm-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-agreety-session 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-gtkgreet-sway-session 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-terminal-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-user-session 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-wlgreet-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-wlgreet-session 'scheme-indent-function 0))
|
||||
(eval . (put 'greetd-wlgreet-sway-session 'scheme-indent-function 0))
|
||||
(eval . (put 'gss-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-build-coordinator-agent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-build-coordinator-agent-dynamic-auth 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-build-coordinator-agent-dynamic-auth-with-file 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-build-coordinator-agent-password-auth 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-build-coordinator-agent-password-file-auth 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-build-coordinator-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-data-service-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-extension 'scheme-indent-function 0))
|
||||
(eval . (put 'guix-publish-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'gvfs-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'host 'scheme-indent-function 0))
|
||||
(eval . (put 'hostapd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'hpcguix-web-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'httpd-config-file 'scheme-indent-function 0))
|
||||
(eval . (put 'httpd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'httpd-module 'scheme-indent-function 0))
|
||||
(eval . (put 'httpd-virtualhost 'scheme-indent-function 0))
|
||||
(eval . (put 'hurd-console-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'hurd-getty-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'hurd-vm-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'idmap-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'imap4d-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'inet-listener-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'inetd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'inetd-entry 'scheme-indent-function 0))
|
||||
(eval . (put 'inputattach-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'int-component-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ipfs-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'iptables-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'iwd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'iwd-general-settings 'scheme-indent-function 0))
|
||||
(eval . (put 'iwd-network-settings 'scheme-indent-function 0))
|
||||
(eval . (put 'iwd-scan-settings 'scheme-indent-function 0))
|
||||
(eval . (put 'iwd-settings 'scheme-indent-function 0))
|
||||
(eval . (put 'jami-account 'scheme-indent-function 0))
|
||||
(eval . (put 'jami-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'joycond-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'keepalived-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'kmscon-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-acl-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-key-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-keystore-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-policy-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-remote-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-resolver-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'knot-zone-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'krb5-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'krb5-realm 'scheme-indent-function 0))
|
||||
(eval . (put 'kwallet-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ladspa-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'laminar-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'libvirt-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'lightdm-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'lightdm-gtk-greeter-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'lightdm-seat-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'linux-builder-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'lirc-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'live-service 'scheme-indent-function 0))
|
||||
(eval . (put 'localed-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'location-access-control 'scheme-indent-function 0))
|
||||
(eval . (put 'log-cleanup-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'log-rotation 'scheme-indent-function 0))
|
||||
(eval . (put 'log-rotation-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'login-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'lsh-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'lxqt-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mailbox-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mate-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mcron-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'memcached-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'method-access-control 'scheme-indent-function 0))
|
||||
(eval . (put 'mingetty-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mod-muc-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'modem-manager-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mosquitto-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mpd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mpd-output 'scheme-indent-function 0))
|
||||
(eval . (put 'mpd-partition 'scheme-indent-function 0))
|
||||
(eval . (put 'mpd-plugin 'scheme-indent-function 0))
|
||||
(eval . (put 'mumble-server-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mumble-server-public-registration-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mumi-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mumi-package-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mympd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'mympd-ip-acl 'scheme-indent-function 0))
|
||||
(eval . (put 'mysql-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'namespace-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nar-herder-cached-compression-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nar-herder-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'network-address 'scheme-indent-function 0))
|
||||
(eval . (put 'network-link 'scheme-indent-function 0))
|
||||
(eval . (put 'network-manager-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'network-route 'scheme-indent-function 0))
|
||||
(eval . (put 'nfs-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nftables-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nginx-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nginx-location-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nginx-log-format-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nginx-named-location-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nginx-server-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nginx-upstream-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-channel 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-global 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-limits 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-operator 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-options 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-server 'scheme-indent-function 0))
|
||||
(eval . (put 'ngircd-ssl 'scheme-indent-function 0))
|
||||
(eval . (put 'nix-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nscd-cache 'scheme-indent-function 0))
|
||||
(eval . (put 'nscd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'nslcd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ntp-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ntp-server 'scheme-indent-function 0))
|
||||
(eval . (put 'oci-container-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'oci-image 'scheme-indent-function 0))
|
||||
(eval . (put 'opaque-cgit-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'opaque-cups-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'opaque-dovecot-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'opaque-prosody-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'opendht-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openntpd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'opensmtpd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openssh-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openvpn-ccd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openvpn-client-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openvpn-remote-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openvpn-server-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'openvswitch-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'operation-access-control 'scheme-indent-function 0))
|
||||
(eval . (put 'package-database-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pagekite-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-krb5-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-mount-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pam-mount-volume 'scheme-indent-function 0))
|
||||
(eval . (put 'passdb-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'patchwork-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'patchwork-database-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'patchwork-settings-module 'scheme-indent-function 0))
|
||||
(eval . (put 'pcscd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'php-fpm-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'php-fpm-dynamic-process-manager-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'php-fpm-on-demand-process-manager-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'php-fpm-static-process-manager-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pipefs-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'plasma-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'plugin-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'policy-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'polkit-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'postgresql-config-file 'scheme-indent-function 0))
|
||||
(eval . (put 'postgresql-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'postgresql-role 'scheme-indent-function 0))
|
||||
(eval . (put 'pounce-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'power-profiles-daemon-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'powertop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'prometheus-node-exporter-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'prosody-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'protocol-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'pulseaudio-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'qemu-binfmt-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'qemu-guest-agent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'quassel-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-auth-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-encoding-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-logging-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-rights-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-server-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'radicale-storage-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rasdaemon-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'readymedia-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'readymedia-media-directory 'scheme-indent-function 0))
|
||||
(eval . (put 'redis-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'repository-cgit-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'resize-file-system-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'restic-backup-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'restic-backup-job 'scheme-indent-function 0))
|
||||
(eval . (put 'rngd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rootless-podman-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rpcbind-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rshiny-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rspamd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rsync-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'rsync-module 'scheme-indent-function 0))
|
||||
(eval . (put 'samba-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'screen-locker-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'sddm-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'seatd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'service-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'service-type 'scheme-indent-function 0))
|
||||
(eval . (put 'shepherd-action 'scheme-indent-function 0))
|
||||
(eval . (put 'shepherd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'shepherd-service 'scheme-indent-function 0))
|
||||
(eval . (put 'slim-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'snuik-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'speakersafetyd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'spice-vdagent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'ssl-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'static-networking 'scheme-indent-function 0))
|
||||
(eval . (put 'strongswan-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'sugar-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'syncthing-config-file 'scheme-indent-function 0))
|
||||
(eval . (put 'syncthing-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'syncthing-device 'scheme-indent-function 0))
|
||||
(eval . (put 'syncthing-folder 'scheme-indent-function 0))
|
||||
(eval . (put 'syncthing-folder-device 'scheme-indent-function 0))
|
||||
(eval . (put 'sysctl-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'syslog-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'system-log-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'tailon-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'tailon-configuration-file 'scheme-indent-function 0))
|
||||
(eval . (put 'thermald-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'tlp-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'tor-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'tor-onion-service-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'tor-transport-plugin 'scheme-indent-function 0))
|
||||
(eval . (put 'transmission-daemon-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'udev-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'udisks-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'unattended-upgrade-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'unbound-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'unbound-remote 'scheme-indent-function 0))
|
||||
(eval . (put 'unbound-server 'scheme-indent-function 0))
|
||||
(eval . (put 'unbound-zone 'scheme-indent-function 0))
|
||||
(eval . (put 'unix-listener-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'upower-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'usb-modeswitch-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'userdb-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'varnish-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'virtlog-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'virtual-build-machine 'scheme-indent-function 0))
|
||||
(eval . (put 'virtualhost-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'vnstat-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'webssh-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'wesnothd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'whoogle-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'wireguard-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'wireguard-peer 'scheme-indent-function 0))
|
||||
(eval . (put 'wpa-supplicant-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'wsdd-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'xe-guest-utilities-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'xen-guest-agent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'xfce-desktop-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'xorg-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'xvnc-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'yggdrasil-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'zabbix-agent-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'zabbix-front-end-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'zabbix-server-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'zone-entry 'scheme-indent-function 0))
|
||||
(eval . (put 'zone-file 'scheme-indent-function 0))
|
||||
(eval . (put 'zram-device-configuration 'scheme-indent-function 0)))))
|
||||
;; 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))))
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
root = true
|
||||
|
||||
[*.{c,h,cpp,hpp,el,scm,ac,am,m4,po}{,.in}]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.{c,h,cpp,hpp,ac,am,m4,el,scm}{,.in}]
|
||||
max_line_length = 80
|
||||
|
||||
[*.{c,h,cpp,hpp,ac,m4,el,scm}{,.in}]
|
||||
indent_style = space
|
||||
|
||||
[*.{c,h,cpp,hpp}{,.in}]
|
||||
indent_size = 4
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
name: 'Bug Reporting'
|
||||
about: 'Please check whether the bug is already reported, on Codeberg or in the Guix issue tracker.'
|
||||
title: ''
|
||||
ref: ''
|
||||
labels:
|
||||
---
|
||||
<!--
|
||||
Describe the bug you encounter below.
|
||||
|
||||
Please provide the output of the command `guix describe`.
|
||||
-->
|
||||
`guix describe` outputs:
|
||||
```text
|
||||
|
||||
```
|
||||
@@ -1,22 +0,0 @@
|
||||
# Force the use of templates.
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Guix Issue Tracker (will stop accepting new submittions on January 1st, 2026)
|
||||
url: https://issues.guix.gnu.org/
|
||||
about: Submit patches and bug reports via email.
|
||||
|
||||
- name: Help Mailing List (help-guix@gnu.org)
|
||||
url: https://lists.gnu.org/mailman/listinfo/help-guix
|
||||
about: Subscribe to the Help mailing list to get support from the GNU Guix community via email. You can post messages in English though we also accept other languages.
|
||||
|
||||
- name: Development Mailing List (guix-devel@gnu.org)
|
||||
url: https://lists.gnu.org/mailman/listinfo/guix-devel
|
||||
about: Discussion about the development of GNU Guix.
|
||||
|
||||
- name: Security Mailing List (guix-security@gnu.org)
|
||||
url: https://lists.gnu.org/mailman/listinfo/guix-security
|
||||
about: Report security issues in Guix itself or in the packages it provides. Posting here allows Guix developers to address the problem before it is widely publicized.
|
||||
|
||||
- name: Contact - GNU Guix
|
||||
url: https://guix.gnu.org/en/contact/
|
||||
about: Communication channels of GNU Guix.
|
||||
@@ -1,65 +0,0 @@
|
||||
---
|
||||
name: 'Pull Request'
|
||||
about: 'Pull request template'
|
||||
title: ''
|
||||
ref: ''
|
||||
labels:
|
||||
---
|
||||
<!--
|
||||
Below is a checklist for package-related patches.
|
||||
|
||||
For details please refer to [the manual](https://guix.gnu.org/manual/devel/en/html_node/Submitting-Patches.html).
|
||||
|
||||
Common issues in the contribution process are also documented in the
|
||||
["Contributing" chapter](https://guix.gnu.org/manual/devel/en/html_node/Contributing.html)
|
||||
of the manual.
|
||||
|
||||
Tick a box by changing it from [ ] to [x].
|
||||
-->
|
||||
|
||||
- System(s) where you built it (successfully):
|
||||
- [ ] x86_64-linux
|
||||
- [ ] i686-linux
|
||||
- [ ] aarch64-linux
|
||||
- [ ] armhf-linux
|
||||
- [ ] powerpc64le-linux
|
||||
- [ ] riscv64-linux
|
||||
- [ ] x86_64-gnu
|
||||
- [ ] i586-gnu
|
||||
|
||||
- Package **update**
|
||||
- Closure size increase.
|
||||
```console
|
||||
$ guix size PACKAGE | tail -n1 # before
|
||||
total: ...
|
||||
$ ./pre-inst-env guix size PACKAGE | tail -n1 # after
|
||||
total: ...
|
||||
```
|
||||
- Build status of direct dependents (`./pre-inst-env guix build -k -P1 PACKAGE ...`):
|
||||
```text
|
||||
|
||||
```
|
||||
- Link to upstream release notes (if applicable):
|
||||
```text
|
||||
|
||||
```
|
||||
- Package **addition**
|
||||
- [ ] The packages includes tests when available.
|
||||
- [ ] Closure size given by `guix size`.
|
||||
- [ ] Fixed errors reported by `guix lint` (`./pre-inst-env guix lint PACKAGE ...`).
|
||||
- [ ] Verified cryptographic signature provided by upstream.
|
||||
- [ ] The packages don't use bundled copies of software.
|
||||
- [ ] Synopsis and description are written in conformance with [the guidelines](https://guix.gnu.org/manual/devel/en/html_node/Synopses-and-Descriptions.html).
|
||||
|
||||
- [ ] Commit messages follow [the "ChangeLog" style](https://www.gnu.org/prep/standards/html_node/Change-Logs.html).
|
||||
- [ ] The change doesn't break `guix pull` (`guix pull --url=/path/to/your/checkout --profile=/tmp/guix.master --disable-authentication`).
|
||||
|
||||
- Successfully cross-compiled to the following target(s) (this is optional):
|
||||
- [ ] x86_64-linux-gnu
|
||||
- [ ] i686-linux-gnu
|
||||
- [ ] aarch64-linux-gnu
|
||||
- [ ] arm-linux-gnueabihf
|
||||
- [ ] powerpc64le-linux-gnu
|
||||
- [ ] riscv64-linux-gnu
|
||||
- [ ] x86_64-pc-gnu
|
||||
- [ ] i586-pc-gnu
|
||||
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1,3 +0,0 @@
|
||||
*.scm diff=scheme
|
||||
*.scm.in diff=scheme
|
||||
*.texi diff=texinfo
|
||||
192
.gitignore
vendored
192
.gitignore
vendored
@@ -1,20 +1,9 @@
|
||||
*.eps
|
||||
*.go
|
||||
*.log
|
||||
*.mo
|
||||
*.pdf
|
||||
*.png
|
||||
*.tar.xz
|
||||
*.tmp
|
||||
*~
|
||||
.#*
|
||||
\#*\#
|
||||
,*
|
||||
/ABOUT-NLS
|
||||
/INSTALL
|
||||
/aclocal.m4
|
||||
/autom4te.cache
|
||||
/build-aux/ar-lib
|
||||
*.tmp
|
||||
*.go
|
||||
tmp
|
||||
*.log
|
||||
/build-aux/compile
|
||||
/build-aux/config.guess
|
||||
/build-aux/config.rpath
|
||||
@@ -25,67 +14,14 @@
|
||||
/build-aux/missing
|
||||
/build-aux/test-driver
|
||||
/build-aux/texinfo.tex
|
||||
/config.status
|
||||
/configure
|
||||
/doc/*.1
|
||||
/doc/.dirstamp
|
||||
/doc/contributing.*.texi
|
||||
/doc/guix*.aux
|
||||
/doc/guix*.cp
|
||||
/doc/guix*.cps
|
||||
/doc/guix*.fn
|
||||
/doc/guix*.fns
|
||||
/doc/guix*.html
|
||||
/doc/guix*.info
|
||||
/doc/guix*.info-[0-9]
|
||||
/doc/guix*.info-[0-9][0-9]
|
||||
/doc/guix*.ky
|
||||
/doc/guix*.pg
|
||||
/doc/guix*.toc
|
||||
/doc/guix*.t2p
|
||||
/doc/guix*.tp
|
||||
/doc/guix*.vr
|
||||
/doc/guix*.vrs
|
||||
/doc/guix.*.texi
|
||||
/doc/guix-cookbook.*.texi
|
||||
/doc/guix.aux
|
||||
/doc/guix.cp
|
||||
/doc/guix.cps
|
||||
/doc/guix.fn
|
||||
/doc/guix.fns
|
||||
/doc/guix.html
|
||||
/doc/guix.info
|
||||
/doc/guix.info-[0-9]
|
||||
/doc/guix.ky
|
||||
/doc/guix.pg
|
||||
/doc/guix.toc
|
||||
/doc/guix.t2p
|
||||
/doc/guix.tp
|
||||
/doc/guix.vr
|
||||
/doc/guix.vrs
|
||||
/doc/os-config-bare-bones.texi
|
||||
/doc/os-config-desktop.texi
|
||||
/doc/stamp-vti
|
||||
/doc/version.texi
|
||||
/doc/version-*.texi
|
||||
/etc/apparmor.d/tunables/guix
|
||||
/etc/committer.scm
|
||||
/etc/gnu-store.mount
|
||||
/etc/guix-daemon.cil
|
||||
/etc/guix-daemon.conf
|
||||
/etc/guix-daemon.service
|
||||
/etc/guix-publish.conf
|
||||
/etc/guix-publish.service
|
||||
/etc/guix-gc.service
|
||||
/etc/guix-gc.timer
|
||||
/etc/init.d/guix-daemon
|
||||
/etc/openrc/guix-daemon
|
||||
/guix-*
|
||||
/guix/config.scm
|
||||
/libformat.a
|
||||
/libstore.a
|
||||
/libutil.a
|
||||
/m4/*
|
||||
Makefile.in
|
||||
Makefile
|
||||
/autom4te.cache
|
||||
config.cache
|
||||
/aclocal.m4
|
||||
/config.status
|
||||
/ABOUT-NLS
|
||||
/m4/ChangeLog
|
||||
/m4/gettext.m4
|
||||
/m4/iconv.m4
|
||||
@@ -95,13 +31,6 @@
|
||||
/m4/nls.m4
|
||||
/m4/po.m4
|
||||
/m4/progtest.m4
|
||||
/nix/config.h
|
||||
/nix/config.h.in
|
||||
/po/doc/*.mo
|
||||
/po/doc/*.pot
|
||||
/po/guix/*.gmo
|
||||
/po/guix/*.insert-header
|
||||
/po/guix/*.mo
|
||||
/po/guix/ChangeLog
|
||||
/po/guix/Makefile.in.in
|
||||
/po/guix/Makevars.template
|
||||
@@ -110,15 +39,15 @@
|
||||
/po/guix/boldquot.sed
|
||||
/po/guix/en@boldquot.*
|
||||
/po/guix/en@quot.*
|
||||
/po/guix/guix.pot
|
||||
/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/packages/*.gmo
|
||||
/po/packages/*.insert-header
|
||||
/po/packages/*.mo
|
||||
/po/guix/guix.pot
|
||||
/po/guix/*.mo
|
||||
/po/guix/*.gmo
|
||||
/po/packages/ChangeLog
|
||||
/po/packages/Makefile.in.in
|
||||
/po/packages/Makevars.template
|
||||
@@ -127,37 +56,80 @@
|
||||
/po/packages/boldquot.sed
|
||||
/po/packages/en@boldquot.*
|
||||
/po/packages/en@quot.*
|
||||
/po/packages/guix-packages.pot
|
||||
/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
|
||||
/release-*
|
||||
/scripts/guix
|
||||
/t-*/
|
||||
/test-env
|
||||
/doc/.dirstamp
|
||||
/doc/guix.info
|
||||
/doc/guix.info-[0-9]
|
||||
/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
|
||||
/tests/**/*.trs
|
||||
/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
|
||||
Makefile
|
||||
Makefile.in
|
||||
config.cache
|
||||
stamp-h[0-9]
|
||||
.am[0-9]*/
|
||||
.dirstamp
|
||||
.deps
|
||||
tmp
|
||||
/doc/os-config-lightweight-desktop.texi
|
||||
/nix/scripts/download
|
||||
/.tarball-version
|
||||
/.version
|
||||
/doc/stamp-*
|
||||
/gnu/packages/bootstrap
|
||||
/gnu/packages/aux-files/guile-guile-launcher.o
|
||||
/guile
|
||||
.DS_Store
|
||||
.mumi/current-issue
|
||||
/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-config.el
|
||||
/doc/os-config-bare-bones.texi
|
||||
/doc/os-config-desktop.texi
|
||||
/doc/*.1
|
||||
/etc/guix-daemon.service
|
||||
/doc/images/bootstrap-graph.pdf
|
||||
/doc/images/coreutils-bag-graph.png
|
||||
/doc/images/coreutils-graph.png
|
||||
/doc/images/coreutils-size-map.eps
|
||||
/doc/images/service-graph.png
|
||||
/doc/images/service-graph.eps
|
||||
/doc/images/service-graph.pdf
|
||||
/doc/images/dmd-graph.png
|
||||
|
||||
@@ -1,131 +0,0 @@
|
||||
;; This file, which is best viewed as -*- Scheme -*-, lists the OpenPGP keys
|
||||
;; currently authorized to sign commits in this repository.
|
||||
|
||||
(authorizations
|
||||
(version 0)
|
||||
|
||||
(;; primary: "D963 A5A3 8A80 3D52 4461 F914 7483 0A27 6C32 8EC2"
|
||||
("2841 9AC6 5038 7440 C7E9 2FFA 2208 D209 58C1 DEB0"
|
||||
(name "abcdw"))
|
||||
("AD17 A21E F8AE D8F1 CC02 DBD9 F7D5 C9BF 765C 61E3"
|
||||
(name "andreas"))
|
||||
("27D5 86A4 F890 0854 329F F09F 1260 E464 82E6 3562"
|
||||
(name "apteryx"))
|
||||
("7F73 0343 F2F0 9F3C 77BF 79D3 2E25 EE8B 6180 2BB3"
|
||||
(name "arunisaac"))
|
||||
( ;; primary: "D0C2 EAC1 3310 822D 98DE B57C E9C5 A2D9 0898 A02F"
|
||||
"01FD 85F4 1A7B 7F82 0583 06A5 935E BE07 36DC 857E"
|
||||
(name "avp"))
|
||||
("5D54 CF25 57B2 38E8 8DC1 80A2 2D22 3241 0AB7 4043"
|
||||
(name "baleine"))
|
||||
( ;; primary: "34FF 38BC D151 25A6 E340 A0B5 3453 2F9F AFCA 8B8E"
|
||||
"A3A4 B419 0074 087C A7DE 5698 BC45 CA67 E2F8 D007"
|
||||
(name "bavier"))
|
||||
("3E89 EEE7 458E 720D 9754 E0B2 5E28 A33B 0B84 F577"
|
||||
(name "cbaines"))
|
||||
("3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5"
|
||||
(name "civodul"))
|
||||
("838A FE0D 55DC 074E 360F 943A 84B6 9CE6 F3F6 B767"
|
||||
(name "cnx"))
|
||||
("CCB8 1842 F9D7 058E CD67 377A BF5C DF4D F6BF 6682"
|
||||
(name "csantosb"))
|
||||
("510A 8628 E2A7 7678 8F8C 709C 4BC0 2592 5FF8 F4D3"
|
||||
(name "cwebber"))
|
||||
(;; primary: "295A F991 6F46 F8A1 34B0 29DA 8086 3842 F0FE D83B"
|
||||
"76CE C6B1 7274 B465 C02D B3D9 E71A 3554 2C30 BAA5"
|
||||
(name "dannym"))
|
||||
("8CCB A7F5 52B9 CBEA E1FB 2915 8328 C747 0FF1 D807"
|
||||
(name "dthompson"))
|
||||
("A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351"
|
||||
(name "efraim"))
|
||||
("5DBE 23D3 9053 6526 7F8C C76A FDB9 52BD 3F73 56D6"
|
||||
(name "ekaitz"))
|
||||
("50E1 7BE0 D210 C883 D675 3150 4A3D 07EF D05C 4045"
|
||||
(name "fishinthecalculator"))
|
||||
(;; primary: "D1BD 1EB7 B655 AECE 0BA7 8F94 4940 7E7E 89CA 9B07"
|
||||
"0807 AC76 DFE8 4303 6D5F 5879 F51D 4A16 DCEE 6FA7"
|
||||
(name "futurile"))
|
||||
("E426 7CD1 FC3E E959 7F07 42F9 CC98 E9F0 4330 FD7F"
|
||||
(name "gabber"))
|
||||
(;; primary: "2453 02B1 BAB1 F867 FDCA 96BC 8F3F 861F 82EB 7A9A"
|
||||
"CBC5 9C66 EC27 B971 7940 6B3E 6BE8 208A DF21 FE3F"
|
||||
(name "glv"))
|
||||
(;; primary: "220F 98D9 5E86 204C 0036 DA7B 6DEC 4360 408B 4185"
|
||||
"F4C2 D1DF 3FDE EA63 D1D3 0776 ACC6 6D09 CA52 8292"
|
||||
(name "hako"))
|
||||
("3D58 BE78 5C1B E400 E214 0755 43F4 B499 3A1F 9D20"
|
||||
(name "htgoebel"))
|
||||
( ;; primary: "FECD 9EBA FAAD 1831 7E05 DAC0 E55F 4198 D2A7 0CD7"
|
||||
"6980 A9B9 5202 AA11 EB1D 8922 8499 AC88 F1A7 1CF2"
|
||||
(name "ieure"))
|
||||
(;; primary: "66A5 6D9C 9A98 BE7F 719A B401 2652 5665 AE72 7D37"
|
||||
"0325 78A6 8298 94E7 2AA2 66F5 D415 BF25 3B51 5976"
|
||||
(name "iyzsong"))
|
||||
("1A85 8392 E331 EAFD B8C2 7FFB F3C1 A0D9 C1D6 5273"
|
||||
(name "janneke"))
|
||||
("3B1D 7F19 E36B B60C 0F5B 2CA9 A52A A2B4 77B6 DD35"
|
||||
(name "jgart"))
|
||||
(;; primary: "1BA4 08C5 8BF2 0EA7 3179 635A 865D C0A3 DED9 B5D0"
|
||||
"E31D 9DDE EBA5 4A14 8A20 4550 DA45 97F9 47B4 1025"
|
||||
(name "jlicht"))
|
||||
("8141 6036 E81A 5CF7 8F80 1071 ECFC 8398 8B4E 4B9F"
|
||||
(name "jonsger"))
|
||||
("3924 8CD8 41C6 3CC3 36DC AF2F 505E 40B9 1617 1A8A"
|
||||
(name "jpoiret"))
|
||||
("017D 74E2 7F58 5696 3801 781D F663 943E 08D8 092A"
|
||||
(name "lbraun"))
|
||||
("ACC2 3BA0 59F7 CCF4 08F0 43AD 442A 84B8 C70E 2F87"
|
||||
(name "lilyp"))
|
||||
("6840 722E EEE4 D3A6 4EE5 3EAC 6AAC 1963 757F 47FF"
|
||||
(name "lfam"))
|
||||
("D919 0965 CE03 199E AF28 B3BE 7CEF 2984 7562 C516"
|
||||
(name "mhw"))
|
||||
("B845 5B7F FAD5 E8E9 5DEF 4296 637B 0B13 8065 B68A"
|
||||
(name "monego"))
|
||||
("4008 6A7E 0252 9B60 31FB 8607 8354 7635 3176 9CA6"
|
||||
(name "mothacehe"))
|
||||
(;; primary: "F5BC 5534 C36F 0087 B39D 36EF 1C9D C4FE B9DB 7C4B"
|
||||
"F5DA 2032 4B87 3D0B 7A38 7672 0DB0 FF88 4F55 6D79"
|
||||
(name "nckx"))
|
||||
("ED0E F1C8 E126 BA83 1B48 5FE9 DA00 B4F0 48E9 2F2D"
|
||||
(name "ngz"))
|
||||
("514E 833A 8861 1207 4F98 F68A E447 3B6A 9C05 755D"
|
||||
(name "nmeum"))
|
||||
("002A AAA3 4208 F3F2 BBD7 CE14 EF6E B274 13CF EEF3"
|
||||
(name "oom"))
|
||||
("CEF4 CB91 4856 BA38 0A20 A7E2 3008 88CB 39C6 3817"
|
||||
(name "pelzflorian"))
|
||||
(;; primary: "7E9F 5BF6 1680 4367 127B 7A87 F9E6 9FB8 5A75 54F1"
|
||||
"A420 7B56 C255 109F 2CB3 157E 4990 97AE 5EA8 15D9"
|
||||
(name "podiki"))
|
||||
("BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC"
|
||||
(name "rekado"))
|
||||
(;; From commit cc51c03ff867d4633505354819c6d88af88bf919 (March 2020).
|
||||
;; See <https://lists.gnu.org/archive/html/guix-devel/2020-03/msg00070.html>.
|
||||
"F556 FD94 FB8F 8B87 79E3 6832 CBD0 CD51 38C1 9AFC"
|
||||
(name "roelj"))
|
||||
(;; From commit 2cbede5935eb6a40173bbdf30a9ad22bf7574c22 (Jan. 2020). See
|
||||
;; <https://lists.gnu.org/archive/html/guix-devel/2020-01/msg00499.html>.
|
||||
"1EFB 0909 1F17 D28C CBF9 B13A 53D4 57B2 D636 EE82"
|
||||
(name "roptat"))
|
||||
(;; primary: "3AC5 5D0E 1DA7 AF44 3868 11EE 213D C372 0E7A 023C"
|
||||
"6B51 071A 0FB1 52AD ED93 6360 0322 7982 69E4 71C3"
|
||||
(name "Rutherther"))
|
||||
("EAD1 89E4 799B 5E5E B20A 2A19 CDBC 0BD9 5943 A706"
|
||||
(name "SameExpert"))
|
||||
(;; primary: "D6B0 C593 DA8C 5EDC A44C 7A58 C336 91F7 1188 B004"
|
||||
"A02C 2D82 0EF4 B25B A6B5 1D90 2AC6 A5EC 1C35 7C59"
|
||||
(name "samplet"))
|
||||
("9847 81DE 689C 21C2 6418 0867 76D7 27BF F62C D2B5"
|
||||
(name "sharlatan"))
|
||||
("F494 72F4 7A59 00D5 C235 F212 89F9 6D48 08F3 59C7"
|
||||
(name "snape"))
|
||||
("6580 7361 3BFC C5C7 E2E4 5D45 DC51 8FC8 7F97 16AA"
|
||||
(name "vagrantc"))
|
||||
(;; primary: "C955 CC5D C048 7FB1 7966 40A9 199A F6A3 67E9 4ABB"
|
||||
"7238 7123 8EAC EB63 4548 5857 167F 8EA5 001A FA9C"
|
||||
(name "wigust"))
|
||||
("7EBE A494 60CE 5E2C 0875 7FDB 3B5A A993 E1A2 DFF0"
|
||||
(name "z572"))
|
||||
("705A 29B7 01EE 410E B6F9 236E 92F1 D22C 608E E7E5"
|
||||
(name "zimoun"))))
|
||||
@@ -1,7 +0,0 @@
|
||||
;; This is a Guix channel.
|
||||
|
||||
(channel
|
||||
(version 0)
|
||||
(news-file "etc/news.scm")
|
||||
(keyring-reference "keyring")
|
||||
(url "https://git.guix.gnu.org/guix.git")) ;the primary URL
|
||||
85
.mailmap
85
.mailmap
@@ -1,102 +1,29 @@
|
||||
# This list is used to avoid multiple name/email instances of the same
|
||||
# contributors reported by "git log" and "git shortlog" commands.
|
||||
|
||||
Adriano Peluso <catonano@gmail.com>
|
||||
Al McElrath <hello@yrns.org> <hello@atonesir.com>
|
||||
Alex Sassmannshausen <alex@pompo.co> <alex.sassmannshausen@gmail.com>
|
||||
Alexander I. Grafov <grafov@gmail.com>
|
||||
Alírio Eyng <alirioeyng@gmail.com>
|
||||
Amin Bandali <bandali@gnu.org> <mab@gnu.org>
|
||||
Amirouche Boubekki <amirouche@hypermove.net>
|
||||
Andreas Enge <andreas@enge.fr> <andreas.enge@inria.fr>
|
||||
Andreas Enge <andreas@enge.fr> <privat@xobs-novena>
|
||||
Andy Wingo <wingo@igalia.com> <wingo@pobox.com>
|
||||
Ben Woodcroft <donttrustben@gmail.com>
|
||||
Ben Woodcroft <donttrustben@gmail.com> <b.woodcroft@uq.edu.au>
|
||||
Ben Woodcroft <donttrustben@gmail.com> <donttrustben near gmail.com>
|
||||
Brett Gilio <brettg@gnu.org> <brettg@posteo.net>
|
||||
Christine Lemmer-Webber <cwebber@dustycloud.org>
|
||||
Ben Woodcroft <b.woodcroft@uq.edu.au> <donttrustben@gmail.com>
|
||||
Claes Wallin (韋嘉誠) <claes.wallin@greatsinodevelopment.com>
|
||||
Cyprien Nicolas <cyprien@nicolas.tf> <c.nicolas+gitorious@gmail.com>
|
||||
Daniel Pimentel <d4n1@d4n1.org> <d4n1@member.fsf.org>
|
||||
Danny Milosavljevic <dannym@scratchpost.org> <dannym+a@scratchpost.org>
|
||||
David Hashe <david.hashe@dhashe.com> <address@hidden>
|
||||
David Thompson <davet@gnu.org> <dthompson2@worcester.edu>
|
||||
David Thompson <davet@gnu.org> <dthompson@member.fsf.org>
|
||||
David Thompson <davet@gnu.org> <dthompson@vistahigherlearning.com>
|
||||
Deck Pickard <deck.r.pickard@gmail.com> <nebu@kipple>
|
||||
Eric Bavier <bavier@posteo.net> <ericbavier@gmail.com>
|
||||
Eric Bavier <bavier@posteo.net> <bavier@member.fsf.org>
|
||||
Eric Bavier <bavier@member.fsf.org> <ericbavier@gmail.com>
|
||||
Eric Dvorsak <eric@dvorsak.fr> <yenda1@gmail.com>
|
||||
Evgeny Pisemsky <mail@pisemsky.site> <evgeny@pisemsky.com>
|
||||
George Clemmer <myglc2@gmail.com>
|
||||
Giacomo Leidi <therewasa@fishinthecalculator.me> <goodoldpaul@autistici.org>
|
||||
ison <ison@airmail.cc> <ison111@protonmail.com>
|
||||
Ivan Vilata i Balaguer <ivan@selidor.net>
|
||||
Jakob L. Kreuze <zerodaysfordays@sdf.org> <zerodaysfordays@sdf.lonestar.org>
|
||||
Jeff Mickey <j@codemac.net> <jm@igneous.io>
|
||||
John Darrington <jmd@gnu.org> <john@darrington.wattle.id.au>
|
||||
John J. Foerch <jjfoerch@earthlink.net>
|
||||
Joshua Grant <tadni@riseup.net> <gzg@riseup.net>
|
||||
Joshua Grant <tadni@riseup.net> <jgrant@parenthetical.io>
|
||||
Joshua Grant <tadni@riseup.net> <tadnimi@gmail.com>
|
||||
Joshua Grant <tadni@riseup.net> <youlysses@riseup.net>
|
||||
Juliana Sims <juli@incana.org> <jtsims@protonmail.com>
|
||||
Kei Kebreau <kkebreau@posteo.net>
|
||||
Leo Famulari <leo@famulari.name> <lfamular@gmail.com>
|
||||
Liliana Marie Prikler <liliana.prikler@gmail.com>
|
||||
Liliana Marie Prikler <liliana.prikler@gmail.com> Leo Prikler <leo.prikler@student.tugraz.at>
|
||||
Ludovic Courtès <ludo@gnu.org> <ludovic.courtes@inria.fr>
|
||||
Marek Benc <dusxmt@gmx.com> <merkur32@gmail.com>
|
||||
Marius Bakke <marius@gnu.org> <mbakke@fastmail.com>
|
||||
Marius Bakke <marius@gnu.org> <m.bakke@warwick.ac.uk>
|
||||
Marius Bakke <marius@gnu.org> <marius.bakke@usit.uio.no>
|
||||
Marius Bakke <marius@gnu.org> <mbakke@berlin.guixsd.org>
|
||||
Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org>
|
||||
Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org>
|
||||
Mathieu Othacehe <m.othacehe@gmail.com>
|
||||
Mathieu Othacehe <mathieu.othacehe@parrot.com>
|
||||
Mathieu Othacehe <othacehe@gnu.org>
|
||||
Matthew James Kraai <kraai@ftbfs.org>
|
||||
Maxim Cournoyer <maxim@guixotic.coop> <maxim.cournoyer@gmail.com>
|
||||
Nguyễn Gia Phong <cnx@loang.net> <mcsinyx@disroot.org>
|
||||
Mathieu Lirzin <mthl@openmailbox.org> <mathieu.lirzin@openmailbox.org>
|
||||
Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
|
||||
nikita <nikita@n0.is>
|
||||
nikita <nikita@n0.is> ng0 <ng0@n0.is>
|
||||
nikita <nikita@n0.is> Nils Gillmann <ng0@n0.is>
|
||||
nikita <nikita@n0.is> Nils Gillmann <gillmann@infotropique.org>
|
||||
nikita <nikita@n0.is> ng0 <ng0@crash.cx>
|
||||
nikita <nikita@n0.is> <ng0@infotropique.org>
|
||||
nikita <nikita@n0.is> <ng0@no-reply.infotropique.org>
|
||||
nikita <nikita@n0.is> <ng0@no-reply.pragmatique.xyz>
|
||||
nikita <nikita@n0.is> <ng0@pragmatique.xyz>
|
||||
nikita <nikita@n0.is> <contact.ng0@cryptolab.net>
|
||||
nikita <nikita@n0.is> <ng0@we.make.ritual.n0.is>
|
||||
nikita <nikita@n0.is> <ngillmann@runbox.com>
|
||||
nikita <nikita@n0.is> <niasterisk@grrlz.net>
|
||||
nikita <nikita@n0.is> <ng@niasterisk.space>
|
||||
nikita <nikita@n0.is> <ng0@libertad.pw>
|
||||
Pierre Neidhardt <mail@ambrevar.xyz>
|
||||
Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr>
|
||||
Pjotr Prins <pjotr.guix@thebird.nl> <pjotr.public01@thebird.nl>
|
||||
Pjotr Prins <pjotr.guix@thebird.nl> <pjotr.public12@thebird.nl>
|
||||
Pjotr Prins <pjotr.guix@thebird.nl> <pjotr.public12@email>
|
||||
Raimon Grau <raimonster@gmail.com> <raimon@3scale.net>
|
||||
Raoul Jean Pierre Bonnal <ilpuccio.febo@gmail.com>
|
||||
Raymond Nicholson <rain1@openmailbox.org>
|
||||
Rene Saavedra <rennes@openmailbox.org>
|
||||
Pjotr Prins <pjotr.public01@thebird.nl>
|
||||
Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl>
|
||||
Ricardo Wurmus <rekado@elephly.net>
|
||||
Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de>
|
||||
宋文武 <iyzsong@envs.net> <iyzsong@gmail.com>
|
||||
宋文武 <iyzsong@envs.net> <iyzsong@member.fsf.org>
|
||||
Stefan Reichör <stefan@xsteve.at>
|
||||
Sou Bunnbu (宋文武) <iyzsong@gmail.com>
|
||||
Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
||||
Theodoros Foradis <theodoros.for@openmailbox.org> <theodoros@foradis.org>
|
||||
Thomas Danckaert <thomas.danckaert@gmail.com> <post@thomasdanckaert.be>
|
||||
Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com>
|
||||
Tomas Volf <~@wolfsden.cz> <wolf@wolfsden.cz>
|
||||
Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz>
|
||||
Vincent Legoll <vincent.legoll@gmail.com> <vincent.legoll@idgrilles.fr>
|
||||
Zheng Junjie <873216071@qq.com> Z572 <873216071@qq.com>
|
||||
Zheng Junjie <873216071@qq.com> Zheng Junjie <zhengjunjie@iscas.ac.cn>
|
||||
Zheng Junjie <873216071@qq.com> Zheng junjie <873216071@qq.com>
|
||||
@@ -1,3 +0,0 @@
|
||||
((debbugs-host . "debbugs.gnu.org")
|
||||
(patch-email-address . "guix-patches@gnu.org")
|
||||
(mumi-host . "issues.guix.gnu.org"))
|
||||
11
.patman
11
.patman
@@ -1,11 +0,0 @@
|
||||
# This config file allows for Patchwork integration with
|
||||
# https://patches.guix-patches.cbaines.net/.
|
||||
|
||||
[settings]
|
||||
project: guix-patches
|
||||
patchwork_url: https://patches.guix-patches.cbaines.net
|
||||
add_signoff: False
|
||||
# TODO: enable check_patch
|
||||
check_patch: False
|
||||
ignore_bad_tags: True
|
||||
keep_change_id: True
|
||||
103
CODE-OF-CONDUCT
103
CODE-OF-CONDUCT
@@ -1,103 +0,0 @@
|
||||
Important: to avoid polarizing/hurtful discussions in our public spaces, any
|
||||
matter pertaining to our use of this Code of Conduct should be brought
|
||||
privately to the Guix maintainers at guix-maintainers@gnu.org. Failure to do
|
||||
so will be considered as a violation of this Code of Conduct.
|
||||
|
||||
Contributor Covenant Code of Conduct
|
||||
|
||||
Our Pledge
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||
identity and orientation.
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
Our Standards
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall
|
||||
community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||
any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others’ private information, such as a physical or email address,
|
||||
without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
Enforcement Responsibilities
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
Scope
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
Enforcement
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
guix-maintainers@gnu.org.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
Enforcement Guidelines
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
1. Correction
|
||||
Community Impact: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
Consequence: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
2. Warning
|
||||
Community Impact: A violation through a single incident or series of
|
||||
actions.
|
||||
Consequence: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
3. Temporary Ban
|
||||
Community Impact: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
Consequence: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
4. Permanent Ban
|
||||
Community Impact: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
Consequence: A permanent ban from any sort of public interaction within the
|
||||
community.
|
||||
Attribution
|
||||
This Code of Conduct is adapted from the Contributor Covenant,
|
||||
version 2.1, available at
|
||||
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
|
||||
Community Impact Guidelines were inspired by
|
||||
Mozilla’s code of conduct enforcement ladder.
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
|
||||
502
CODEOWNERS
502
CODEOWNERS
@@ -1,502 +0,0 @@
|
||||
# This -*- conf -*- file was generated by './etc/teams.scm codeowners'.
|
||||
#
|
||||
# It describes the expected reviewers for a pull request based on the
|
||||
# changed files. Unlike what the name of the file suggests they don't
|
||||
# own the code (ownership is collective in this house!) but merely have
|
||||
# a good understanding of that area of the codebase and therefore are
|
||||
# usually suited as a reviewer.
|
||||
|
||||
gnu/packages/machine-learning\.scm @guix/ai
|
||||
|
||||
gnu/packages/audio\.scm @guix/audio
|
||||
gnu/packages/fluidplug\.scm @guix/audio
|
||||
gnu/packages/music\.scm @guix/audio
|
||||
gnu/packages/xiph\.scm @guix/audio
|
||||
|
||||
gnu/packages/elixir(-.+|)\.scm$ @guix/beam
|
||||
guix/build/mix-build-system\.scm @guix/beam
|
||||
guix/build-system/mix\.scm @guix/beam
|
||||
gnu/packages/erlang(-.+|)\.scm$ @guix/beam
|
||||
guix/build/rebar-build-system\.scm @guix/beam
|
||||
guix/build-system/rebar\.scm @guix/beam
|
||||
guix/import/hexpm\.scm @guix/beam
|
||||
guix/scripts/import/hexpm\.scm @guix/beam
|
||||
|
||||
gnu/packages/bioinformatics\.scm @guix/bioinformatics
|
||||
|
||||
gnu/packages/bootstrap\.scm @guix/bootstrap
|
||||
gnu/packages/commencement\.scm @guix/bootstrap
|
||||
gnu/packages/mes\.scm @guix/bootstrap
|
||||
|
||||
gnu/packages/assembly\.scm @guix/build-tools
|
||||
gnu/packages/autogen\.scm @guix/build-tools
|
||||
gnu/packages/autotools\.scm @guix/build-tools
|
||||
gnu/packages/bison\.scm @guix/build-tools
|
||||
gnu/packages/m4\.scm @guix/build-tools
|
||||
gnu/packages/oyacc\.scm @guix/build-tools
|
||||
gnu/packages/re2c\.scm @guix/build-tools
|
||||
|
||||
gnu/build-system/cmake\.scm @guix/cpp
|
||||
gnu/build/cmake-build-system\.scm @guix/cpp
|
||||
gnu/packages/c\.scm @guix/cpp
|
||||
gnu/packages/cmake\.scm @guix/cpp
|
||||
gnu/packages/cpp\.scm @guix/cpp
|
||||
gnu/packages/ninja\.scm @guix/cpp
|
||||
gnu/packages/valgrind\.scm @guix/cpp
|
||||
|
||||
etc/teams\.scm @guix/core
|
||||
guix/avahi\.scm @guix/core
|
||||
guix/base16\.scm @guix/core
|
||||
guix/base32\.scm @guix/core
|
||||
guix/base64\.scm @guix/core
|
||||
guix/bzr-download\.scm @guix/core
|
||||
guix/cache\.scm @guix/core
|
||||
guix/channels\.scm @guix/core
|
||||
guix/ci\.scm @guix/core
|
||||
guix/colors\.scm @guix/core
|
||||
guix/combinators\.scm @guix/core
|
||||
guix/config\.scm @guix/core
|
||||
guix/cpio\.scm @guix/core
|
||||
guix/cpu\.scm @guix/core
|
||||
guix/cve\.scm @guix/core
|
||||
guix/cvs-download\.scm @guix/core
|
||||
guix/deprecation\.scm @guix/core
|
||||
guix/derivations\.scm @guix/core
|
||||
guix/describe\.scm @guix/core
|
||||
guix/diagnostics\.scm @guix/core
|
||||
guix/discovery\.scm @guix/core
|
||||
guix/docker\.scm @guix/core
|
||||
guix/download\.scm @guix/core
|
||||
guix/elf\.scm @guix/core
|
||||
guix/fossil-download\.scm @guix/core
|
||||
guix/ftp-client\.scm @guix/core
|
||||
guix/gexp\.scm @guix/core
|
||||
guix/git-authenticate\.scm @guix/core
|
||||
guix/git-download\.scm @guix/core
|
||||
guix/git\.scm @guix/core
|
||||
guix/glob\.scm @guix/core
|
||||
guix/gnu-maintenance\.scm @guix/core
|
||||
guix/gnupg\.scm @guix/core
|
||||
guix/grafts\.scm @guix/core
|
||||
guix/graph\.scm @guix/core
|
||||
guix/hash\.scm @guix/core
|
||||
guix/hg-download\.scm @guix/core
|
||||
guix/http-client\.scm @guix/core
|
||||
guix/i18n\.scm @guix/core
|
||||
guix/inferior\.scm @guix/core
|
||||
guix/ipfs\.scm @guix/core
|
||||
guix/least-authority\.scm @guix/core
|
||||
guix/licenses\.scm @guix/core
|
||||
guix/lint\.scm @guix/core
|
||||
guix/man-db\.scm @guix/core
|
||||
guix/memoization\.scm @guix/core
|
||||
guix/modules\.scm @guix/core
|
||||
guix/monad-repl\.scm @guix/core
|
||||
guix/monads\.scm @guix/core
|
||||
guix/narinfo\.scm @guix/core
|
||||
guix/nar\.scm @guix/core
|
||||
guix/openpgp\.scm @guix/core
|
||||
guix/packages\.scm @guix/core
|
||||
guix/pki\.scm @guix/core
|
||||
guix/platform\.scm @guix/core
|
||||
guix/profiles\.scm @guix/core
|
||||
guix/profiling\.scm @guix/core
|
||||
guix/progress\.scm @guix/core
|
||||
guix/quirks\.scm @guix/core
|
||||
guix/read-print\.scm @guix/core
|
||||
guix/records\.scm @guix/core
|
||||
guix/remote\.scm @guix/core
|
||||
guix/remote-procedures\.scm @guix/core
|
||||
guix/repl\.scm @guix/core
|
||||
guix/search-paths\.scm @guix/core
|
||||
guix/self\.scm @guix/core
|
||||
guix/serialization\.scm @guix/core
|
||||
guix/sets\.scm @guix/core
|
||||
guix/ssh\.scm @guix/core
|
||||
guix/status\.scm @guix/core
|
||||
guix/store\.scm @guix/core
|
||||
guix/substitutes\.scm @guix/core
|
||||
guix/svn-download\.scm @guix/core
|
||||
guix/swh\.scm @guix/core
|
||||
guix/tests\.scm @guix/core
|
||||
guix/transformations\.scm @guix/core
|
||||
guix/ui\.scm @guix/core
|
||||
guix/upstream\.scm @guix/core
|
||||
guix/utils\.scm @guix/core
|
||||
guix/workers\.scm @guix/core
|
||||
guix/platforms/ @guix/core
|
||||
guix/scripts/ @guix/core
|
||||
guix/store/ @guix/core
|
||||
nix/ @guix/core
|
||||
|
||||
gnu/packages/base\.scm @guix/core-packages
|
||||
gnu/packages/bootstrap\.scm @guix/core-packages
|
||||
gnu/packages/commencement\.scm @guix/core-packages
|
||||
gnu/packages/cross-base\.scm @guix/core-packages
|
||||
gnu/packages/gcc\.scm @guix/core-packages
|
||||
gnu/packages/guile\.scm @guix/core-packages
|
||||
gnu/packages/ld-wrapper\.in @guix/core-packages
|
||||
gnu/packages/make-bootstrap\.scm @guix/core-packages
|
||||
gnu/packages/multiprecision\.scm @guix/core-packages
|
||||
guix/build/gnu-build-system\.scm @guix/core-packages
|
||||
guix/build/utils\.scm @guix/core-packages
|
||||
guix/build-system/gnu\.scm @guix/core-packages
|
||||
|
||||
gnu/packages/(.*-|)crypto\.scm$ @guix/crypto
|
||||
gnu/packages/cryptsetup\.scm @guix/crypto
|
||||
gnu/packages/cybersecurity\.scm @guix/crypto
|
||||
gnu/packages/gnupg\.scm @guix/crypto
|
||||
gnu/packages/nettle\.scm @guix/crypto
|
||||
gnu/packages/password-utils\.scm @guix/crypto
|
||||
gnu/packages/security-token\.scm @guix/crypto
|
||||
gnu/packages/ssh\.scm @guix/crypto
|
||||
gnu/packages/tls\.scm @guix/crypto
|
||||
gnu/packages/vpn\.scm @guix/crypto
|
||||
|
||||
gnu/packages/debian\.scm @guix/debian
|
||||
|
||||
\.texi$ @guix/documentation
|
||||
doc/build\.scm @guix/documentation
|
||||
gnu/system/examples/bare-bones\.tmpl @guix/documentation
|
||||
gnu/system/examples/lightweight-desktop\.tmpl @guix/documentation
|
||||
gnu/system/examples/desktop\.tmpl @guix/documentation
|
||||
|
||||
gnu/packages/electronics\.scm @guix/electronics
|
||||
gnu/packages/hdl\.scm @guix/electronics
|
||||
gnu/packages/libftdi\.scm @guix/electronics
|
||||
gnu/packages/engineering\.scm @guix/electronics
|
||||
gnu/packages/flashing-tools\.scm @guix/electronics
|
||||
|
||||
gnu/packages/aux-files/emacs/guix-emacs\.el @guix/emacs
|
||||
gnu/packages/aux-files/emacs/comp-integrity\.el @guix/emacs
|
||||
gnu/packages/emacs(-.+|)\.scm$ @guix/emacs
|
||||
gnu/packages/tree-sitter\.scm @guix/emacs
|
||||
guix/build/emacs-build-system\.scm @guix/emacs
|
||||
guix/build/emacs-utils\.scm @guix/emacs
|
||||
guix/build-system/emacs\.scm @guix/emacs
|
||||
guix/import/elpa\.scm @guix/emacs
|
||||
guix/scripts/import/elpa\.scm @guix/emacs
|
||||
tests/import/elpa\.scm @guix/emacs
|
||||
|
||||
gnu/packages/bootloaders\.scm @guix/embedded
|
||||
gnu/packages/coreboot\.scm @guix/embedded
|
||||
gnu/packages/firmware\.scm @guix/embedded
|
||||
|
||||
gnu/packages/emulators\.scm @guix/games
|
||||
gnu/packages/games\.scm @guix/games
|
||||
gnu/packages/game-development\.scm @guix/games
|
||||
gnu/packages/luanti\.scm @guix/games
|
||||
gnu/packages/esolangs\.scm @guix/games
|
||||
gnu/packages/motti\.scm @guix/games
|
||||
gnu/services/games\.scm @guix/games
|
||||
gnu/tests/games\.scm @guix/games
|
||||
guix/build/luanti-build-system\.scm @guix/games
|
||||
|
||||
etc/teams/gnome @guix/gnome
|
||||
gnu/packages/glib\.scm @guix/gnome
|
||||
gnu/packages/gstreamer\.scm @guix/gnome
|
||||
gnu/packages/gtk\.scm @guix/gnome
|
||||
gnu/packages/gnome\.scm @guix/gnome
|
||||
gnu/packages/gnome-circle\.scm @guix/gnome
|
||||
gnu/packages/gnome-xyz\.scm @guix/gnome
|
||||
gnu/packages/webkit\.scm @guix/gnome
|
||||
gnu/services/desktop\.scm @guix/gnome
|
||||
guix/build/glib-or-gtk-build-system\.scm @guix/gnome
|
||||
guix/build/meson-build-system\.scm @guix/gnome
|
||||
|
||||
gnu/packages/configuration-management\.scm @guix/go
|
||||
gnu/packages/golang(-.+|)\.scm$ @guix/go
|
||||
gnu/packages/syncthing\.scm @guix/go
|
||||
gnu/packages/terraform\.scm @guix/go
|
||||
guix/build-system/go\.scm @guix/go
|
||||
guix/build/go-build-system\.scm @guix/go
|
||||
guix/import/go\.scm @guix/go
|
||||
guix/scripts/import/go\.scm @guix/go
|
||||
tests/import/go\.scm @guix/go
|
||||
|
||||
gnu/packages/guile\.scm @guix/guile
|
||||
gnu/packages/guile-wm\.scm @guix/guile
|
||||
gnu/packages/guile-xyz\.scm @guix/guile
|
||||
guix/build-system/guile\.scm @guix/guile
|
||||
guix/build/guile-build-system\.scm @guix/guile
|
||||
|
||||
gnu/packages/hare\.scm @guix/hare
|
||||
gnu/packages/hare-apps\.scm @guix/hare
|
||||
gnu/packages/hare-xyz\.scm @guix/hare
|
||||
guix/build-system/hare\.scm @guix/hare
|
||||
guix/build/hare-build-system\.scm @guix/hare
|
||||
|
||||
gnu/packages/dhall\.scm @guix/haskell
|
||||
gnu/packages/haskell(-.+|)\.scm$ @guix/haskell
|
||||
gnu/packages/purescript\.scm @guix/haskell
|
||||
guix/build/haskell-build-system\.scm @guix/haskell
|
||||
guix/build-system/haskell\.scm @guix/haskell
|
||||
guix/import/cabal\.scm @guix/haskell
|
||||
guix/import/hackage\.scm @guix/haskell
|
||||
guix/import/stackage\.scm @guix/haskell
|
||||
guix/scripts/import/hackage\.scm @guix/haskell
|
||||
|
||||
(gnu|guix/scripts)/home(\.scm$|/) @guix/home
|
||||
tests/guix-home\.sh @guix/home
|
||||
tests/home-import\.scm @guix/home
|
||||
tests/home-services\.scm @guix/home
|
||||
|
||||
gnu/packages/fabric-management\.scm @guix/hpc
|
||||
gnu/packages/mpi\.scm @guix/hpc
|
||||
gnu/packages/oneapi\.scm @guix/hpc
|
||||
gnu/packages/opencl\.scm @guix/hpc
|
||||
gnu/packages/parallel\.scm @guix/hpc
|
||||
gnu/packages/rocm\.scm @guix/hpc
|
||||
gnu/packages/rocm-tools\.scm @guix/hpc
|
||||
gnu/packages/rocm-libs\.scm @guix/hpc
|
||||
gnu/packages/sycl\.scm @guix/hpc
|
||||
gnu/packages/tbb\.scm @guix/hpc
|
||||
gnu/packages/vulkan\.scm @guix/hpc
|
||||
|
||||
gnu/system/hurd\.scm @guix/hurd
|
||||
gnu/system/images/hurd\.scm @guix/hurd
|
||||
gnu/build/hurd-boot\.scm @guix/hurd
|
||||
gnu/services/hurd\.scm @guix/hurd
|
||||
gnu/packages/hurd\.scm @guix/hurd
|
||||
|
||||
gnu/installer(\.scm$|/) @guix/installer
|
||||
|
||||
gnu/packages/clojure\.scm @guix/java
|
||||
gnu/packages/java(-.+|)\.scm$ @guix/java
|
||||
gnu/packages/maven(-.+|)\.scm$ @guix/java
|
||||
guix/build/ant-build-system\.scm @guix/java
|
||||
guix/build/clojure-build-system\.scm @guix/java
|
||||
guix/build/clojure-utils\.scm @guix/java
|
||||
guix/build/java-utils\.scm @guix/java
|
||||
guix/build/maven-build-system\.scm @guix/java
|
||||
guix/build/maven/ @guix/java
|
||||
guix/build-system/ant\.scm @guix/java
|
||||
guix/build-system/clojure\.scm @guix/java
|
||||
guix/build-system/maven\.scm @guix/java
|
||||
|
||||
gnu/packages/node-xyz\.scm @guix/javascript
|
||||
gnu/packages/node\.scm @guix/javascript
|
||||
guix/build-system/node\.scm @guix/javascript
|
||||
guix/build/node-build-system\.scm @guix/javascript
|
||||
guix/import/npm-binary\.scm @guix/javascript
|
||||
guix/scripts/import/npm-binary\.scm @guix/javascript
|
||||
|
||||
gnu/packages/julia(-.+|)\.scm$ @guix/julia
|
||||
guix/build/julia-build-system\.scm @guix/julia
|
||||
guix/build-system/julia\.scm @guix/julia
|
||||
|
||||
gnu/packages/(kde)(-.+|)\.scm$ @guix/kde
|
||||
|
||||
gnu/build/linux-modules\.scm @guix/kernel
|
||||
gnu/packages/aux-files/linux-libre.*$ @guix/kernel
|
||||
gnu/packages/linux\.scm @guix/kernel
|
||||
gnu/tests/linux-modules\.scm @guix/kernel
|
||||
guix/build/linux-module-build-system\.scm @guix/kernel
|
||||
guix/build-system/linux-module\.scm @guix/kernel
|
||||
|
||||
gnu/packages/lisp(-.+|)\.scm$ @guix/lisp
|
||||
guix/build/asdf-build-system\.scm @guix/lisp
|
||||
guix/build/lisp-utils\.scm @guix/lisp
|
||||
guix/build-system/asdf\.scm @guix/lisp
|
||||
|
||||
gnu/packages/anthy\.scm @guix/localization
|
||||
gnu/packages/fcitx5\.scm @guix/localization
|
||||
gnu/packages/fonts\.scm @guix/localization
|
||||
gnu/packages/ibus\.scm @guix/localization
|
||||
|
||||
gnu/packages/lua\.scm @guix/lua
|
||||
gnu/packages/luanti\.scm @guix/lua
|
||||
|
||||
gnu/packages/lxqt\.scm @guix/lxqt
|
||||
|
||||
gnu/packages/mate\.scm @guix/mate
|
||||
|
||||
gnu/build/icecat-extension\.scm @guix/mozilla
|
||||
gnu/packages/browser-extensions\.scm @guix/mozilla
|
||||
gnu/packages/gnuzilla\.scm @guix/mozilla
|
||||
gnu/packages/librewolf\.scm @guix/mozilla
|
||||
gnu/packages/tor-browsers\.scm @guix/mozilla
|
||||
|
||||
gnu/packages/ocaml\.scm @guix/ocaml
|
||||
gnu/packages/coq\.scm @guix/ocaml
|
||||
gnu/packages/rocq\.scm @guix/ocaml
|
||||
guix/build/ocaml-build-system\.scm @guix/ocaml
|
||||
guix/build/dune-build-system\.scm @guix/ocaml
|
||||
guix/build-system/ocaml\.scm @guix/ocaml
|
||||
guix/build-system/dune\.scm @guix/ocaml
|
||||
guix/import/opam\.scm @guix/ocaml
|
||||
guix/scripts/import/opam\.scm @guix/ocaml
|
||||
tests/import/opam\.scm @guix/ocaml
|
||||
|
||||
gnu/packages/perl(-.+|)\.scm$ @guix/perl
|
||||
guix/build/perl-build-system\.scm @guix/perl
|
||||
guix/build/rakudo-build-system\.scm @guix/perl
|
||||
guix/build-system/perl\.scm @guix/perl
|
||||
guix/build-system/rakudo\.scm @guix/perl
|
||||
guix/import/cpan\.scm @guix/perl
|
||||
guix/scripts/import/cpan\.scm @guix/perl
|
||||
|
||||
gnu/packages/aux-files/python/.*\.py$ @guix/python
|
||||
gnu/packages/django\.scm @guix/python
|
||||
gnu/packages/jupyter\.scm @guix/python
|
||||
gnu/packages/python(-.+|)\.scm$ @guix/python
|
||||
gnu/packages/sphinx\.scm @guix/python
|
||||
gnu/packages/tryton\.scm @guix/python
|
||||
guix/build-system/pyproject\.scm @guix/python
|
||||
guix/build-system/python\.scm @guix/python
|
||||
guix/build/pyproject-build-system\.scm @guix/python
|
||||
guix/build/python-build-system\.scm @guix/python
|
||||
guix/build/toml\.scm @guix/python
|
||||
guix/import/pypi\.scm @guix/python
|
||||
guix/scripts/import/pypi\.scm @guix/python
|
||||
tests/import/pypi\.scm @guix/python
|
||||
tests/toml\.scm @guix/python
|
||||
|
||||
gnu/packages/benchmark\.scm @guix/qa-packages
|
||||
gnu/packages/check\.scm @guix/qa-packages
|
||||
gnu/packages/ci\.scm @guix/qa-packages
|
||||
gnu/packages/code\.scm @guix/qa-packages
|
||||
gnu/packages/debug\.scm @guix/qa-packages
|
||||
gnu/packages/dezyne\.scm @guix/qa-packages
|
||||
gnu/packages/libunwind\.scm @guix/qa-packages
|
||||
gnu/services/ci\.scm @guix/qa-packages
|
||||
gnu/tests/ci\.scm @guix/qa-packages
|
||||
|
||||
gnu/packages/qt\.scm @guix/qt
|
||||
guix/build-system/qt\.scm @guix/qt
|
||||
guix/build/qt-build-system\.scm @guix/qt
|
||||
guix/build/qt-utils\.scm @guix/qt
|
||||
|
||||
gnu/packages/bioconductor\.scm @guix/r
|
||||
gnu/packages/cran\.scm @guix/r
|
||||
guix/build/r-build-system\.scm @guix/r
|
||||
guix/build-system/r\.scm @guix/r
|
||||
guix/import/cran\.scm @guix/r
|
||||
guix/scripts/import/cran\.scm @guix/r
|
||||
tests/import/cran\.scm @guix/r
|
||||
|
||||
gnu/packages/chez\.scm @guix/racket
|
||||
gnu/packages/racket\.scm @guix/racket
|
||||
|
||||
NEWS @guix/release
|
||||
etc/manifests/release-minimal\.scm @guix/release
|
||||
etc/manifests/release-desktop\.scm @guix/release
|
||||
|
||||
gnu/packages/diffoscope\.scm @guix/reproduciblebuilds
|
||||
|
||||
gnu/packages/(ruby)(-.+|)\.scm$ @guix/ruby
|
||||
guix/build/ruby-build-system\.scm @guix/ruby
|
||||
guix/build-system/ruby\.scm @guix/ruby
|
||||
guix/import/gem\.scm @guix/ruby
|
||||
guix/scripts/import/gem\.scm @guix/ruby
|
||||
tests/import/gem\.scm @guix/ruby
|
||||
|
||||
gnu/packages/(crates|rust)(-.+|)\.scm$ @guix/rust
|
||||
gnu/packages/sequoia\.scm @guix/rust
|
||||
guix/build/cargo-build-system\.scm @guix/rust
|
||||
guix/build/cargo-utils\.scm @guix/rust
|
||||
guix/build-system/cargo\.scm @guix/rust
|
||||
guix/import/crate\.scm @guix/rust
|
||||
guix/import/crate/cargo-lock\.scm @guix/rust
|
||||
guix/scripts/import/crate\.scm @guix/rust
|
||||
tests/import/crate\.scm @guix/rust
|
||||
|
||||
gnu/packages/fortran(-.+|)\.scm$ @guix/science
|
||||
gnu/packages/algebra\.scm @guix/science
|
||||
gnu/packages/astronomy\.scm @guix/science
|
||||
gnu/packages/chemistry\.scm @guix/science
|
||||
gnu/packages/geo\.scm @guix/science
|
||||
gnu/packages/graph\.scm @guix/science
|
||||
gnu/packages/lean\.scm @guix/science
|
||||
gnu/packages/maths\.scm @guix/science
|
||||
gnu/packages/medical\.scm @guix/science
|
||||
gnu/packages/physics\.scm @guix/science
|
||||
gnu/packages/sagemath\.scm @guix/science
|
||||
gnu/packages/statistics\.scm @guix/science
|
||||
|
||||
gnu/packages/sugar\.scm @guix/sugar
|
||||
|
||||
gnu/packages/admin\.scm @guix/sysadmin
|
||||
gnu/packages/acl\.scm @guix/sysadmin
|
||||
gnu/packages/adns\.scm @guix/sysadmin
|
||||
gnu/packages/antivirus\.scm @guix/sysadmin
|
||||
gnu/packages/apparmor\.scm @guix/sysadmin
|
||||
gnu/packages/authentication\.scm @guix/sysadmin
|
||||
gnu/packages/cluster\.scm @guix/sysadmin
|
||||
gnu/packages/configuration-management\.scm @guix/sysadmin
|
||||
gnu/packages/databases\.scm @guix/sysadmin
|
||||
gnu/packages/distributed\.scm @guix/sysadmin
|
||||
gnu/packages/dns\.scm @guix/sysadmin
|
||||
gnu/packages/high-availability\.scm @guix/sysadmin
|
||||
gnu/packages/kerberos\.scm @guix/sysadmin
|
||||
gnu/packages/logging\.scm @guix/sysadmin
|
||||
gnu/packages/monitoring\.scm @guix/sysadmin
|
||||
gnu/packages/nfs\.scm @guix/sysadmin
|
||||
gnu/packages/openldap\.scm @guix/sysadmin
|
||||
gnu/packages/openstack\.scm @guix/sysadmin
|
||||
gnu/packages/prometheus\.scm @guix/sysadmin
|
||||
gnu/packages/rdesktop\.scm @guix/sysadmin
|
||||
gnu/packages/samba\.scm @guix/sysadmin
|
||||
gnu/packages/selinux\.scm @guix/sysadmin
|
||||
gnu/packages/storage\.scm @guix/sysadmin
|
||||
gnu/packages/task-runners\.scm @guix/sysadmin
|
||||
gnu/packages/terraform\.scm @guix/sysadmin
|
||||
gnu/packages/virtualization\.scm @guix/sysadmin
|
||||
gnu/packages/vnc\.scm @guix/sysadmin
|
||||
gnu/services/admin\.scm @guix/sysadmin
|
||||
gnu/services/authentication\.scm @guix/sysadmin
|
||||
gnu/services/databases\.scm @guix/sysadmin
|
||||
gnu/services/dns\.scm @guix/sysadmin
|
||||
gnu/services/high-availability\.scm @guix/sysadmin
|
||||
gnu/services/kerberos\.scm @guix/sysadmin
|
||||
gnu/services/monitoring\.scm @guix/sysadmin
|
||||
gnu/services/nfs\.scm @guix/sysadmin
|
||||
gnu/services/samba\.scm @guix/sysadmin
|
||||
gnu/services/virtualization\.scm @guix/sysadmin
|
||||
gnu/services/vnc\.scm @guix/sysadmin
|
||||
gnu/tests/databases\.scm @guix/sysadmin
|
||||
gnu/tests/dns\.scm @guix/sysadmin
|
||||
gnu/tests/high-availability\.scm @guix/sysadmin
|
||||
gnu/tests/monitoring\.scm @guix/sysadmin
|
||||
gnu/tests/nfs\.scm @guix/sysadmin
|
||||
gnu/tests/samba\.scm @guix/sysadmin
|
||||
gnu/tests/virtualization\.scm @guix/sysadmin
|
||||
gnu/tests/vnc\.scm @guix/sysadmin
|
||||
|
||||
gnu/build/jami-service\.scm @guix/telephony
|
||||
gnu/packages/jami\.scm @guix/telephony
|
||||
gnu/packages/linphone\.scm @guix/telephony
|
||||
gnu/packages/telephony\.scm @guix/telephony
|
||||
gnu/services/telephony\.scm @guix/telephony
|
||||
gnu/tests/data/jami-dummy-account\.dat @guix/telephony
|
||||
gnu/tests/telephony\.scm @guix/telephony
|
||||
tests/services/telephony\.scm @guix/telephony
|
||||
|
||||
gnu/packages/tex\.scm @guix/tex
|
||||
gnu/packages/texlive\.scm @guix/tex
|
||||
guix/build/texlive-build-system\.scm @guix/tex
|
||||
guix/build-system/texlive\.scm @guix/tex
|
||||
guix/import/texlive\.scm @guix/tex
|
||||
guix/scripts/import/texlive\.scm @guix/tex
|
||||
tests/import/texlive\.scm @guix/tex
|
||||
|
||||
etc/news\.scm @guix/translations
|
||||
po/ @guix/translations
|
||||
|
||||
gnu/packages/version-control\.scm @guix/vcs
|
||||
gnu/services/version-control\.scm @guix/vcs
|
||||
gnu/tests/version-control\.scm @guix/vcs
|
||||
guix/build/bzr\.scm @guix/vcs
|
||||
guix/build/cvs\.scm @guix/vcs
|
||||
guix/build/fossil\.scm @guix/vcs
|
||||
guix/build/git\.scm @guix/vcs
|
||||
guix/build/hg\.scm @guix/vcs
|
||||
guix/build/svn\.scm @guix/vcs
|
||||
|
||||
gnu/packages/xfce\.scm @guix/xfce
|
||||
|
||||
gnu/packages/zig\.scm @guix/zig
|
||||
gnu/packages/zig-xyz\.scm @guix/zig
|
||||
guix/build/zig-build-system\.scm @guix/zig
|
||||
guix/build-system/zig\.scm @guix/zig
|
||||
|
||||
37
HACKING
37
HACKING
@@ -2,10 +2,8 @@
|
||||
|
||||
#+TITLE: Hacking GNU Guix and Its Incredible Distro
|
||||
|
||||
Copyright © 2012, 2013, 2014, 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
|
||||
Copyright © 2015, 2017 Mathieu Lirzin <mthl@gnu.org>
|
||||
Copyright © 2017 Leo Famulari <leo@famulari.name>
|
||||
Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
|
||||
Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
|
||||
Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
@@ -13,8 +11,33 @@ Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
|
||||
|
||||
* Contributing
|
||||
|
||||
See the manual for useful hacking information, either by running
|
||||
See the manual for useful hacking informations, either by running
|
||||
|
||||
info -f doc/guix.info "Contributing"
|
||||
info -f doc/guix.info "(guix) Contributing"
|
||||
|
||||
or by checking the [[https://guix.gnu.org/manual/devel/en/html_node/Contributing.html][web copy of the manual]].
|
||||
or by checking the [[http://www.gnu.org/software/guix/manual/guix.html#Contributing][web copy of the manual]].
|
||||
|
||||
* 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, it’s OK to commit,
|
||||
if you’re 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 didn’t receive any reply
|
||||
after two weeks, and if you’re confident, it’s OK to commit.
|
||||
|
||||
That last part is subject to being adjusted, allowing individuals to commit
|
||||
directly on non-controversial changes on parts they’re familiar with.
|
||||
|
||||
1314
Makefile.am
1314
Makefile.am
File diff suppressed because it is too large
Load Diff
120
README
120
README
@@ -1,46 +1,69 @@
|
||||
-*- mode: org -*-
|
||||
|
||||
[[https://www.gnu.org/software/guix/][GNU Guix]] (IPA: /ɡiːks/) is a purely functional package manager, and
|
||||
associated free software distribution, for the [[https://www.gnu.org/gnu/gnu.html][GNU system]]. In addition
|
||||
[[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 [[https://www.gnu.org/software/guile/][Guile]] Scheme APIs, including a high-level embedded
|
||||
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.
|
||||
|
||||
GNU Guix can be used on top of an already-installed GNU/Linux distribution, or
|
||||
it can be used standalone (we call that “Guix System”).
|
||||
A user-land free software distribution for GNU/Linux comes as part of
|
||||
Guix.
|
||||
|
||||
Guix is based on the [[https://nixos.org/nix/][Nix]] package manager.
|
||||
Guix is based on the [[http://nixos.org/nix/][Nix]] package manager.
|
||||
|
||||
|
||||
* Requirements
|
||||
|
||||
If you are building Guix from source, please see the manual for build
|
||||
instructions and requirements, either by running:
|
||||
GNU Guix currently depends on the following packages:
|
||||
|
||||
info -f doc/guix.info "Requirements"
|
||||
- [[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.
|
||||
|
||||
or by checking the [[https://guix.gnu.org/manual/en/html_node/Requirements.html][web copy of the manual]].
|
||||
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 "Installation"
|
||||
info -f doc/guix.info "(guix) Installation"
|
||||
|
||||
or by checking the [[https://guix.gnu.org/manual/en/html_node/Installation.html][web copy of the manual]].
|
||||
or by checking the [[http://www.gnu.org/software/guix/manual/guix.html#Installation][web copy of the manual]].
|
||||
|
||||
* Building from Git
|
||||
For information on installation from a Git checkout, please see the section
|
||||
"Building from Git" in the manual.
|
||||
|
||||
For information on building Guix from a Git checkout, please see the relevant
|
||||
section in the manual, either by running
|
||||
* Installing Guix from Guix
|
||||
|
||||
info -f doc/guix.info "Building from Git"
|
||||
You can re-build and re-install Guix using a system that already runs Guix.
|
||||
To do so:
|
||||
|
||||
or by checking the [[https://guix.gnu.org/manual/en/html_node/Building-from-Git.html][web_copy of the manual]].
|
||||
- Start a shell with the development environment for Guix:
|
||||
|
||||
guix environment guix
|
||||
|
||||
- Re-run the 'configure' script passing it the option
|
||||
'--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
|
||||
|
||||
@@ -50,23 +73,43 @@ the promise of a build; it is stored as a text file under
|
||||
`derivation' primitive, as well as higher-level wrappers such as
|
||||
`build-expression->derivation'.
|
||||
|
||||
Guix does remote procedure calls (RPCs) to the build daemon (the =guix-daemon=
|
||||
command), which in turn performs builds and accesses to the store on its
|
||||
behalf. The RPCs are implemented in the (guix store) module.
|
||||
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://codeberg.org/guix/guix/.
|
||||
GNU Guix is hosted at https://savannah.gnu.org/projects/guix/.
|
||||
|
||||
Please email mailto:help-guix@gnu.org for questions. Bug reports should be
|
||||
submitted via https://codeberg.org/guix/guix/issues/. Email
|
||||
mailto:gnu-system-discuss@gnu.org for general issues regarding the GNU system.
|
||||
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.libera.chat.
|
||||
Join #guix on irc.freenode.net.
|
||||
|
||||
* Guix & Nix
|
||||
|
||||
GNU Guix is based on [[https://nixos.org/nix/][the Nix package manager]]. It implements the same
|
||||
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.
|
||||
@@ -89,7 +132,7 @@ 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 [[https://nixos.org/nixpkgs][Nixpkgs]] distribution, package composition happens at
|
||||
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
|
||||
@@ -98,28 +141,13 @@ but exposes all the API as Scheme.
|
||||
|
||||
* Related software
|
||||
|
||||
- [[https://nixos.org][Nix, Nixpkgs, and NixOS]], functional package manager and associated
|
||||
- [[http://nixos.org][Nix, Nixpkgs, and NixOS]], functional package manager and associated
|
||||
software distribution, are the inspiration of Guix
|
||||
- [[https://www.gnu.org/software/stow/][GNU Stow]] builds around the idea of one directory per prefix, and a
|
||||
- [[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
|
||||
- [[https://www.pvv.ntnu.no/~arnej/store/storedoc_6.html][STORE]] shares the same idea
|
||||
- [[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 [[https://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
|
||||
- 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
|
||||
|
||||
* Copyright Notices
|
||||
|
||||
GNU Guix is made available under the GNU GPL version 3 or later license, and
|
||||
authors retain their copyright. For copyright notices, we adhere to the
|
||||
guidance documented in (info "(maintain) Copyright Notices"), and explicitly
|
||||
allow ranges instead of individual years. Here's an example of the preferred
|
||||
style used for copyright notices in source file headers:
|
||||
|
||||
#+begin_comment
|
||||
Copyright © 2019-2023, 2025 Your Name <your@email.com>
|
||||
#+end_comment
|
||||
|
||||
Meaning there were copyright-able changes made for the years 2019, 2020, 2021,
|
||||
2022, 2023 and 2025.
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
README
|
||||
4
ROADMAP
4
ROADMAP
@@ -23,7 +23,7 @@ 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
|
||||
the Libera Chat IRC network!
|
||||
Freenode!
|
||||
|
||||
* Features scheduled for 1.0
|
||||
|
||||
@@ -77,6 +77,6 @@ the Libera Chat IRC network!
|
||||
+ build containers like guix-daemon does
|
||||
+ provide a Plash-like interface in Bash
|
||||
- daemon rewritten in Guile
|
||||
- more shepherd integration
|
||||
- more dmd integration
|
||||
+ monitor network interfaces and start/stop events based on that
|
||||
+ include a DHCP client written in Scheme
|
||||
|
||||
5
THANKS
5
THANKS
@@ -14,7 +14,6 @@ infrastructure help:
|
||||
Alexandru Cojocaru <xojoc@gmx.com>
|
||||
Aleix Conchillo Flaqué <aconchillo@gmail.com>
|
||||
Malcolm Cook <MEC@stowers.org>
|
||||
Thomas Danckaert <thomas.danckaert@gmail.com>
|
||||
Rafael Ferreira <rafael.f.f1@gmail.com>
|
||||
Christian Grothoff <christian@grothoff.org>
|
||||
Eric Hanchrow <eric.hanchrow@gmail.com>
|
||||
@@ -26,7 +25,6 @@ infrastructure help:
|
||||
Daniel Kochmański <dkochmanski@hellsgate.pl>
|
||||
Matthew Lien <bluet@bluet.org>
|
||||
Dave Love <fx@gnu.org>
|
||||
Chris Marusich <cmmarusich@gmail.com>
|
||||
Niels Möller <nisse@lysator.liu.se>
|
||||
Cyprien Nicolas <cyprien@nicolas.tf>
|
||||
Yutaka Niibe <gniibe@fsij.org>
|
||||
@@ -41,9 +39,8 @@ infrastructure help:
|
||||
Thomas Schwinge <thomas@codesourcery.com>
|
||||
Alexander Shendi <Alexander.Shendi@web.de>
|
||||
Alen Skondro <askondro@gmail.com>
|
||||
Jan Synáček <jan.synacek@gmail.com>
|
||||
Matthias Wachs <wachs@net.in.tum.de>
|
||||
Christine Lemmer-Webber <cwebber@dustycloud.org>
|
||||
Christopher Allan Webber <cwebber@dustycloud.org>
|
||||
Philip Woods <elzairthesorcerer@gmail.com>
|
||||
|
||||
GNU Guix also includes non-software works. Thanks to the following
|
||||
|
||||
51
TODO
51
TODO
@@ -4,12 +4,18 @@
|
||||
#+STARTUP: content hidestars
|
||||
|
||||
Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
|
||||
Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||
|
||||
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
|
||||
@@ -68,6 +74,11 @@ per-package priorities, etc.
|
||||
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
|
||||
|
||||
@@ -84,41 +95,3 @@ Problems include that current glibc releases do not build on GNU/Hurd.
|
||||
In addition, there haven’t been stable releases of GNU Mach, MiG, and
|
||||
Hurd, which would be a pre-condition.
|
||||
|
||||
* Installer
|
||||
** Fix impossibility to restart on error after cow-store has been started
|
||||
See https://lists.gnu.org/archive/html/guix-devel/2018-12/msg00161.html.
|
||||
- Force reboot upon installer failure
|
||||
- Unshare the installer process
|
||||
- Run the installer process in a separate namespace
|
||||
** Partitioning
|
||||
*** Add RAID support
|
||||
*** Add more partitioning schemes
|
||||
The actual schemes are taken from Debian Installer but some are not
|
||||
implemented yet: like "Separate partitions for /home /var and /tmp".
|
||||
*** Replace wait page "Partition formatting is in progress, please wait"
|
||||
Create a new waiting page describing what's being done:
|
||||
|
||||
[ 20% ]
|
||||
Running mkfs.ext4 on /dev/sda2 ...
|
||||
|
||||
[ 40% ]
|
||||
Running mkfs.ext4 on /dev/sda3 ...
|
||||
*** Add a confirmation page before formatting/partitioning
|
||||
** Desktop environments
|
||||
*** Allow for no desktop environments
|
||||
Propose to choose between "headless server" and "lightweight X11" in a new
|
||||
page.
|
||||
*** Add services selection feature
|
||||
Add a services page to the configuration. Ask for services to be installed
|
||||
like SSH, bluetooth, TLP in a checkbox list?
|
||||
** Locale and keymap
|
||||
*** Try to guess user locale and keymap by probing BIOS or HW (dmidecode)
|
||||
** Timezone
|
||||
*** Regroup everything in one single page
|
||||
Under the form:
|
||||
(UTC + 1) Europe/Paris
|
||||
(UTC + 2) Africa/Cairo
|
||||
...
|
||||
** Display issue
|
||||
*** Investigate display issue described here:
|
||||
https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00305.html
|
||||
|
||||
30
bootstrap
30
bootstrap
@@ -2,32 +2,4 @@
|
||||
# Create the build system.
|
||||
|
||||
set -e -x
|
||||
|
||||
# Generate stubs for translations.
|
||||
langs=`find po/doc -type f -name 'guix-manual*.po' \
|
||||
| sed -e 's,.*/guix-manual\.,,;s,\.po$,,'`
|
||||
for lang in ${langs}; do
|
||||
if [ ! -e "doc/guix.${lang}.texi" ]; then
|
||||
echo "@setfilename guix.${lang}.info" > "doc/guix.${lang}.texi"
|
||||
echo "@include version-${lang}.texi" >> "doc/guix.${lang}.texi"
|
||||
# Ensure .po file is newer.
|
||||
touch "po/doc/guix-manual.${lang}.po"
|
||||
fi
|
||||
done
|
||||
langs=`find po/doc -type f -name 'guix-cookbook*.po' \
|
||||
| sed -e 's,.*/guix-cookbook\.,,;s,\.po$,,'`
|
||||
for lang in ${langs}; do
|
||||
if [ ! -e "doc/guix-cookbook.${lang}.texi" ]; then
|
||||
echo "@setfilename guix-cookbook.${lang}.info" > "doc/guix-cookbook.${lang}.texi"
|
||||
# Ensure .po file is newer.
|
||||
touch "po/doc/guix-cookbook.${lang}.po"
|
||||
fi
|
||||
done
|
||||
|
||||
autoreconf -vfi
|
||||
|
||||
# Replace Automake's build-aux/mdate-sh with build-aux/mdate-from-git, our
|
||||
# own, reproducible version.
|
||||
chmod +w build-aux/mdate-sh
|
||||
rm -f build-aux/mdate-sh
|
||||
ln -s mdate-from-git.scm build-aux/mdate-sh
|
||||
exec autoreconf -vfi
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2014, 2016-2021, 2025 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
@@ -19,17 +19,7 @@
|
||||
(define-module (build-self)
|
||||
#:use-module (gnu)
|
||||
#:use-module (guix)
|
||||
#:use-module (guix ui)
|
||||
#:use-module (guix config)
|
||||
#:use-module (guix modules)
|
||||
#:use-module ((guix self) #:select (make-config.scm))
|
||||
#:use-module (srfi srfi-1)
|
||||
#:use-module (srfi srfi-19)
|
||||
#:use-module (srfi srfi-34)
|
||||
#:use-module (srfi srfi-35)
|
||||
#:use-module (rnrs io ports)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (ice-9 popen)
|
||||
#:export (build))
|
||||
|
||||
;;; Commentary:
|
||||
@@ -46,301 +36,57 @@
|
||||
;;;
|
||||
;;; Code:
|
||||
|
||||
(define (date-version-string)
|
||||
"Return the current date and hour in UTC timezone, for use as a poor
|
||||
person's version identifier."
|
||||
;; XXX: Replace with a Git commit id.
|
||||
(date->string (current-date 0) "~Y~m~d.~H"))
|
||||
|
||||
;; 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 guile-gcrypt
|
||||
;; The 'guile-gcrypt' package from the host Guix.
|
||||
(match (find-best-packages-by-name "guile-gcrypt" #f)
|
||||
((package . _)
|
||||
package)))
|
||||
(define libgcrypt
|
||||
(first (find-best-packages-by-name "libgcrypt" #f)))
|
||||
|
||||
(define* (build-program source version
|
||||
#:optional (guile-version (effective-version))
|
||||
#:key (pull-version 0) (channel-metadata #f)
|
||||
built-in-builders)
|
||||
"Return a program that computes the derivation to build Guix from SOURCE.
|
||||
If BUILT-IN-BUILDERS is provided, it should be a list of
|
||||
strings and this will be used instead of the builtin builders provided by the
|
||||
build daemon, from within the generated build program."
|
||||
(define select?
|
||||
;; Select every module but (guix config) and non-Guix modules.
|
||||
;; Also exclude (guix channels): it is autoloaded by (guix describe), but
|
||||
;; only for peripheral functionality.
|
||||
(match-lambda
|
||||
(('guix 'config) #f)
|
||||
(('guix 'channels) #f)
|
||||
(('guix 'build 'download) #f) ;autoloaded by (guix download)
|
||||
(('guix _ ...) #t)
|
||||
(('gnu _ ...) #t)
|
||||
(_ #f)))
|
||||
(define guile-json
|
||||
(first (find-best-packages-by-name "guile-json" #f)))
|
||||
|
||||
(define fake-gcrypt-hash
|
||||
;; Fake (gcrypt hash) module; see below.
|
||||
(scheme-file "hash.scm"
|
||||
#~(define-module (gcrypt hash)
|
||||
#:export (sha1 sha256))))
|
||||
|
||||
(define fake-git
|
||||
(scheme-file "git.scm" #~(define-module (git))))
|
||||
|
||||
;; The actual build procedure.
|
||||
|
||||
(with-imported-modules `(((guix config)
|
||||
=> ,(make-config.scm))
|
||||
|
||||
;; To avoid relying on 'with-extensions', which was
|
||||
;; introduced in 0.15.0, provide a fake (gcrypt
|
||||
;; hash) just so that we can build modules, and
|
||||
;; adjust %LOAD-PATH later on.
|
||||
((gcrypt hash) => ,fake-gcrypt-hash)
|
||||
|
||||
;; (guix git-download) depends on (git) but only
|
||||
;; for peripheral functionality. Provide a dummy
|
||||
;; (git) to placate it.
|
||||
((git) => ,fake-git)
|
||||
|
||||
,@(source-module-closure `((guix store)
|
||||
(guix self)
|
||||
(guix derivations)
|
||||
(gnu packages bootstrap))
|
||||
(list source)
|
||||
#:select? select?))
|
||||
(gexp->script "compute-guix-derivation"
|
||||
#~(begin
|
||||
(use-modules (ice-9 match))
|
||||
|
||||
;; To avoid lots of readlink calls
|
||||
(fluid-set! %file-port-name-canonicalization #f)
|
||||
|
||||
(eval-when (expand load eval)
|
||||
;; (gnu packages …) modules are going to be looked up
|
||||
;; under SOURCE. (guix config) is looked up in FRONT.
|
||||
(match (command-line)
|
||||
((_ source _ ...)
|
||||
(match %load-path
|
||||
((front _ ...)
|
||||
(unless (string=? front source) ;already done?
|
||||
(set! %load-path
|
||||
(list source
|
||||
(string-append #$guile-gcrypt
|
||||
"/share/guile/site/"
|
||||
(effective-version))
|
||||
front)))))))
|
||||
|
||||
;; Only load Guile-Gcrypt, our own modules, or those
|
||||
;; of Guile.
|
||||
(set! %load-compiled-path
|
||||
(cons (string-append #$guile-gcrypt "/lib/guile/"
|
||||
(effective-version)
|
||||
"/site-ccache")
|
||||
%load-compiled-path))
|
||||
|
||||
;; Disable position recording to save time and space
|
||||
;; when loading the package modules.
|
||||
(read-disable 'positions))
|
||||
|
||||
(use-modules (guix store)
|
||||
(guix self)
|
||||
(guix derivations)
|
||||
(srfi srfi-1))
|
||||
|
||||
(match (command-line)
|
||||
((_ source system version protocol-version
|
||||
build-output)
|
||||
;; The current input port normally wraps a file
|
||||
;; descriptor connected to the daemon, or it is
|
||||
;; connected to /dev/null. In the former case, reuse
|
||||
;; the connection such that we inherit build options
|
||||
;; such as substitute URLs and so on; in the latter
|
||||
;; case, attempt to open a new connection.
|
||||
(let* ((proto (string->number protocol-version))
|
||||
(store (if (integer? proto)
|
||||
(port->connection
|
||||
(duplicate-port
|
||||
(current-input-port)
|
||||
"w+0")
|
||||
#:version proto
|
||||
#:built-in-builders
|
||||
'#$built-in-builders)
|
||||
(open-connection
|
||||
#:built-in-builders
|
||||
'#$built-in-builders)))
|
||||
(sock (socket AF_UNIX SOCK_STREAM 0)))
|
||||
;; Connect to BUILD-OUTPUT and send it the raw
|
||||
;; build output.
|
||||
(connect sock AF_UNIX build-output)
|
||||
|
||||
(when (integer? proto)
|
||||
;; port->connection doesn't setup buffering, so
|
||||
;; do this here
|
||||
(setvbuf (store-connection-socket store)
|
||||
'block
|
||||
%default-store-connection-buffer-size))
|
||||
|
||||
(display
|
||||
(and=>
|
||||
;; Silence autoload warnings and the likes.
|
||||
(parameterize ((current-warning-port
|
||||
(%make-void-port "w"))
|
||||
(current-build-output-port sock))
|
||||
(run-with-store store
|
||||
(guix-derivation source version
|
||||
#$guile-version
|
||||
#:channel-metadata
|
||||
'#$channel-metadata
|
||||
#:pull-version
|
||||
#$pull-version)
|
||||
#:system system))
|
||||
derivation-file-name))))))
|
||||
#:module-path (list source))))
|
||||
|
||||
(define (proxy input output)
|
||||
"Dump the contents of INPUT to OUTPUT until EOF is reached on INPUT.
|
||||
Display a spinner when nothing happens."
|
||||
(define spin
|
||||
(circular-list "-" "\\" "|" "/" "-" "\\" "|" "/"))
|
||||
|
||||
(setvbuf input 'block 16384)
|
||||
(let loop ((spin spin))
|
||||
(match (select (list input) '() '() 1)
|
||||
((() () ())
|
||||
(when (isatty? (current-error-port))
|
||||
(display (string-append "\b" (car spin))
|
||||
(current-error-port))
|
||||
(force-output (current-error-port)))
|
||||
(loop (cdr spin)))
|
||||
(((_) () ())
|
||||
;; Read from INPUT as much as can be read without blocking.
|
||||
(let ((bv (get-bytevector-some input)))
|
||||
(unless (eof-object? bv)
|
||||
(put-bytevector output bv)
|
||||
(loop spin)))))))
|
||||
|
||||
(define (call-with-clean-environment thunk)
|
||||
(let ((env (environ)))
|
||||
(dynamic-wind
|
||||
(lambda ()
|
||||
(environ '()))
|
||||
thunk
|
||||
(lambda ()
|
||||
(environ env)))))
|
||||
|
||||
(define-syntax-rule (with-clean-environment exp ...)
|
||||
"Evaluate EXP in a context where zero environment variables are defined."
|
||||
(call-with-clean-environment (lambda () exp ...)))
|
||||
(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?
|
||||
(version (date-version-string)) channel-metadata
|
||||
system
|
||||
(pull-version 0)
|
||||
|
||||
;; For the standalone Guix, default to Guile 3.0. For old
|
||||
;; versions of 'guix pull' (pre-0.15.0), we have to use the
|
||||
;; same Guile as the current one.
|
||||
(guile-version (if (> pull-version 0)
|
||||
"3.0"
|
||||
(effective-version)))
|
||||
built-in-builders
|
||||
(define* (build source #:key verbose?
|
||||
#:allow-other-keys
|
||||
#:rest rest)
|
||||
"Return a derivation that unpacks SOURCE into STORE and compiles Scheme
|
||||
files."
|
||||
;; Avoid lots of readlink calls
|
||||
(fluid-set! %file-port-name-canonicalization #f)
|
||||
(define builder
|
||||
#~(begin
|
||||
(use-modules (guix build pull))
|
||||
|
||||
;; Build the build program and then use it as a trampoline to build from
|
||||
;; SOURCE.
|
||||
(mlet %store-monad ((build (build-program source version guile-version
|
||||
#:channel-metadata channel-metadata
|
||||
#:pull-version pull-version
|
||||
#:built-in-builders
|
||||
built-in-builders))
|
||||
(system (if system (return system) (current-system)))
|
||||
(home -> (getenv "HOME"))
|
||||
(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)))
|
||||
|
||||
;; Note: Use the deprecated names here because the
|
||||
;; caller might be Guix <= 0.16.0.
|
||||
(port ((store-lift nix-server-socket)))
|
||||
(major ((store-lift nix-server-major-version)))
|
||||
(minor ((store-lift nix-server-minor-version))))
|
||||
(mbegin %store-monad
|
||||
;; Before 'with-build-handler' was implemented and used, we had to
|
||||
;; explicitly call 'show-what-to-build*'.
|
||||
(munless (module-defined? (resolve-module '(guix store))
|
||||
'with-build-handler)
|
||||
(show-what-to-build* (list build)))
|
||||
(built-derivations (list build))
|
||||
(build-guix #$output #$source
|
||||
|
||||
;; Use the port beneath the current store as the stdin of BUILD. This
|
||||
;; way, we know 'open-pipe*' will not close it on 'exec'. If PORT is
|
||||
;; not a file port (e.g., it's an SSH channel), then the subprocess's
|
||||
;; stdin will actually be /dev/null.
|
||||
(let* ((sock (socket AF_UNIX SOCK_STREAM 0))
|
||||
(node (let ((file (string-append (or (getenv "TMPDIR") "/tmp")
|
||||
"/guix-build-output-"
|
||||
(number->string (getpid)))))
|
||||
(bind sock AF_UNIX file)
|
||||
(listen sock 1)
|
||||
file))
|
||||
(pipe (with-input-from-port port
|
||||
(lambda ()
|
||||
;; Make sure BUILD is not influenced by
|
||||
;; $GUILE_LOAD_PATH & co.
|
||||
(with-clean-environment
|
||||
(setenv "GUILE_WARN_DEPRECATED" "no") ;be quiet and drive
|
||||
(setenv "COLUMNS" "120") ;show wider backtraces
|
||||
(when home
|
||||
;; Inherit HOME so that 'xdg-directory' works.
|
||||
(setenv "HOME" home))
|
||||
(open-pipe* OPEN_READ
|
||||
(derivation->output-path build)
|
||||
source system version
|
||||
(if (file-port? port)
|
||||
(number->string
|
||||
(logior major minor))
|
||||
"none")
|
||||
node))))))
|
||||
(format (current-error-port) "Computing Guix derivation for '~a'... "
|
||||
system)
|
||||
;; 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)))
|
||||
|
||||
;; Wait for a connection on SOCK and proxy build output so it can be
|
||||
;; processed according to the settings currently in effect (build
|
||||
;; traces, verbosity level, and so on).
|
||||
(match (accept sock)
|
||||
((port . _)
|
||||
(close-port sock)
|
||||
(delete-file node)
|
||||
(proxy port (current-build-output-port))))
|
||||
(gexp->derivation "guix-latest" builder
|
||||
#:modules '((guix build pull)
|
||||
(guix build utils))
|
||||
|
||||
;; Now that the build output connection was closed, read the result, a
|
||||
;; derivation file name, from PIPE.
|
||||
(let ((str (get-string-all pipe))
|
||||
(status (close-pipe pipe)))
|
||||
(match str
|
||||
((? eof-object?)
|
||||
(error "build program failed" (list build status)))
|
||||
((? derivation-path? drv)
|
||||
(mbegin %store-monad
|
||||
(return (newline (current-error-port)))
|
||||
((store-lift add-temp-root) drv)
|
||||
(return (read-derivation-from-file drv))))
|
||||
("#f"
|
||||
;; Unsupported PULL-VERSION.
|
||||
(return #f))
|
||||
((? string? str)
|
||||
(raise (condition
|
||||
(&message
|
||||
(message (format #f "You found a bug: the program '~a'
|
||||
failed to compute the derivation for Guix (version: ~s; system: ~s;
|
||||
host version: ~s; pull-version: ~s).
|
||||
Please report the COMPLETE output above to <~a>.~%"
|
||||
(derivation->output-path build)
|
||||
version system %guix-version pull-version
|
||||
%guix-bug-report-address))))))))))))
|
||||
;; 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
|
||||
|
||||
53
build-aux/check-available-binaries.scm
Normal file
53
build-aux/check-available-binaries.scm
Normal file
@@ -0,0 +1,53 @@
|
||||
;;; 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)
|
||||
(ice-9 format))
|
||||
|
||||
(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)))
|
||||
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(let* ((total (map derivation->output-path total))
|
||||
(available (substitutable-paths store total))
|
||||
(missing (lset-difference string=? total available)))
|
||||
(if (null? missing)
|
||||
(format (current-error-port) "~a packages found substitutable~%"
|
||||
(length total))
|
||||
(format (current-error-port)
|
||||
"~a packages are not substitutable:~%~{ ~a~%~}~%"
|
||||
(length missing) missing))
|
||||
(exit (null? missing))))))
|
||||
@@ -1,82 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2020 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/>.
|
||||
|
||||
;;;
|
||||
;;; Validate 'etc/news.scm'.
|
||||
;;;
|
||||
|
||||
(use-modules (git)
|
||||
(guix git)
|
||||
(guix ui)
|
||||
(guix channels)
|
||||
(srfi srfi-26)
|
||||
(ice-9 match))
|
||||
|
||||
;; XXX: These two things are currently private.
|
||||
(define read-channel-news (@@ (guix channels) read-channel-news))
|
||||
(define channel-news-entries (cut struct-ref <> 0))
|
||||
|
||||
(define (all-the-news directory)
|
||||
"Return the <channel-news> read from DIRECTORY, a checkout of the 'guix'
|
||||
channel."
|
||||
(call-with-input-file (string-append directory "/etc/news.scm")
|
||||
read-channel-news))
|
||||
|
||||
(define (validate-texinfo str type language)
|
||||
"Parse STR as a Texinfo fragment and raise an error if that fails."
|
||||
(catch #t
|
||||
(lambda ()
|
||||
(texi->plain-text str))
|
||||
(lambda (key . args)
|
||||
(print-exception (current-error-port) #f key args)
|
||||
(report-error (G_ "the Texinfo snippet below is invalid (~a, ~a):~%")
|
||||
type language)
|
||||
(display str (current-error-port))
|
||||
(exit 1))))
|
||||
|
||||
(define (validate-news-entry repository entry)
|
||||
"Validate ENTRY, a <channel-news-entry>, making sure it refers to an
|
||||
existent commit of REPOSITORY and contains only valid Texinfo."
|
||||
(catch 'git-error
|
||||
(lambda ()
|
||||
(let ((commit (commit-lookup repository
|
||||
(string->oid
|
||||
(channel-news-entry-commit entry)))))
|
||||
(for-each (match-lambda
|
||||
((language . title)
|
||||
(validate-texinfo title 'title language)))
|
||||
(channel-news-entry-title entry))
|
||||
(for-each (match-lambda
|
||||
((language . body)
|
||||
(validate-texinfo body 'body language)))
|
||||
(channel-news-entry-body entry))))
|
||||
(lambda (key error . rest)
|
||||
(if (= GIT_ENOTFOUND (git-error-code error))
|
||||
(leave (G_ "commit '~a' of entry '~a' does not exist~%")
|
||||
(channel-news-entry-commit entry)
|
||||
(channel-news-entry-title entry))
|
||||
(apply throw key error rest)))))
|
||||
|
||||
(let* ((this-directory (dirname (current-filename)))
|
||||
(top-directory (string-append this-directory "/.."))
|
||||
(entries (channel-news-entries (all-the-news top-directory))))
|
||||
(with-repository top-directory repository
|
||||
(for-each (cut validate-news-entry repository <>)
|
||||
entries)
|
||||
(info (G_ "All ~a channel news entries are valid.~%")
|
||||
(length entries))))
|
||||
@@ -1,5 +1,5 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
@@ -17,11 +17,10 @@
|
||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;;
|
||||
;;; Check whether important binaries are available.
|
||||
;;; Check whether important binaries are available at hydra.gnu.org.
|
||||
;;;
|
||||
|
||||
(use-modules (guix store)
|
||||
(guix grafts)
|
||||
(guix packages)
|
||||
(guix derivations)
|
||||
(guix ui)
|
||||
@@ -33,31 +32,26 @@
|
||||
(define (final-inputs store system)
|
||||
"Return the list of outputs directories of the final inputs for SYSTEM."
|
||||
(append-map (match-lambda
|
||||
((or (name package) (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. Likewise, 'bash:include' depends on
|
||||
;; bootstrap-binaries via its 'Makefile.inc' (FIXME).
|
||||
(filter-map (match-lambda
|
||||
(("debug" . directory)
|
||||
(if (string=? "glibc" (package-name package))
|
||||
#f
|
||||
directory))
|
||||
(("include" . directory)
|
||||
(if (string=? "bash" (package-name package))
|
||||
#f
|
||||
directory))
|
||||
((_ . directory) directory))
|
||||
(derivation->output-paths drv)))))
|
||||
(%final-inputs system)))
|
||||
((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 (G_ "'~a' refers to bootstrap inputs: ~s~%")
|
||||
(leave (_ "'~a' refers to bootstrap inputs: ~s~%")
|
||||
(substitutable-path substitute) references))))
|
||||
|
||||
(define (test-final-inputs store system)
|
||||
@@ -71,7 +65,7 @@ refer to the bootstrap tools."
|
||||
(string=? (substitutable-path substitute)
|
||||
dir))
|
||||
available)
|
||||
(leave (G_ "~a (system: ~a) has no substitute~%")
|
||||
(leave (_ "~a (system: ~a) has no substitute~%")
|
||||
dir system)))
|
||||
inputs)
|
||||
|
||||
@@ -83,4 +77,5 @@ refer to the bootstrap tools."
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
|
||||
(for-each (cut test-final-inputs store <>)
|
||||
%cuirass-supported-systems)))
|
||||
%hydra-supported-systems)))
|
||||
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
||||
;;; Copyright © 2016, 2017, 2019, 2020, 2021 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/>.
|
||||
|
||||
(use-modules (ice-9 format)
|
||||
(ice-9 match)
|
||||
(ice-9 threads)
|
||||
(srfi srfi-1)
|
||||
(guix build compile)
|
||||
(guix build utils))
|
||||
|
||||
(define host (getenv "host"))
|
||||
(define srcdir (getenv "srcdir"))
|
||||
|
||||
(define (relative-file file)
|
||||
(if (string-prefix? (string-append srcdir "/") file)
|
||||
(string-drop file (+ 1 (string-length srcdir)))
|
||||
file))
|
||||
|
||||
(define (file-mtime<? f1 f2)
|
||||
(< (stat:mtime (stat f1))
|
||||
(stat:mtime (stat f2))))
|
||||
|
||||
(define (scm->go file)
|
||||
(let* ((relative (relative-file file))
|
||||
(without-extension (string-drop-right relative 4)))
|
||||
(string-append without-extension ".go")))
|
||||
|
||||
(define (file-needs-compilation? file)
|
||||
(let ((go (scm->go file)))
|
||||
(or (not (file-exists? go))
|
||||
(file-mtime<? go file))))
|
||||
|
||||
(define* (parallel-job-count #:optional (flags (getenv "MAKEFLAGS")))
|
||||
"Return the number of parallel jobs as determined by FLAGS, the flags passed
|
||||
to 'make'."
|
||||
(match flags
|
||||
(#f (current-processor-count))
|
||||
(flags
|
||||
(let ((initial-flags (string-tokenize flags)))
|
||||
(let loop ((flags initial-flags))
|
||||
(match flags
|
||||
(()
|
||||
;; Note: GNU make prior to version 4.2 would hide "-j" flags from
|
||||
;; $MAKEFLAGS. Thus, check for a "--jobserver" flag here and
|
||||
;; assume we're using all cores if specified.
|
||||
(if (any (lambda (flag)
|
||||
(string-prefix? "--jobserver" flag))
|
||||
initial-flags)
|
||||
(current-processor-count) ;GNU make < 4.2
|
||||
1)) ;sequential make
|
||||
(("-j" (= string->number count) _ ...)
|
||||
(if (integer? count)
|
||||
count
|
||||
(current-processor-count)))
|
||||
((head tail ...)
|
||||
(if (string-prefix? "-j" head)
|
||||
(match (string-drop head 2)
|
||||
(""
|
||||
(current-processor-count))
|
||||
((= string->number count)
|
||||
(if (integer? count)
|
||||
count
|
||||
(current-processor-count))))
|
||||
(loop tail)))))))))
|
||||
|
||||
(define (parallel-job-count*)
|
||||
;; XXX: Work around memory requirements not sustainable on i686 above '-j4'
|
||||
;; or so: <https://bugs.gnu.org/40522>.
|
||||
(let ((count (parallel-job-count)))
|
||||
(if (string-prefix? "i686" %host-type)
|
||||
(min count 4)
|
||||
count)))
|
||||
|
||||
(define (% completed total)
|
||||
"Return the completion percentage of COMPLETED over TOTAL as an integer."
|
||||
(inexact->exact (round (* 100. (/ completed total)))))
|
||||
|
||||
;; Install a SIGINT handler to give unwind handlers in 'compile-file' an
|
||||
;; opportunity to run upon SIGINT and to remove temporary output files.
|
||||
(sigaction SIGINT
|
||||
(lambda args
|
||||
(exit 1)))
|
||||
|
||||
(match (command-line)
|
||||
((_ "--total" (= string->number grand-total)
|
||||
"--completed" (= string->number processed)
|
||||
. files)
|
||||
;; GRAND-TOTAL is the total number of .scm files in the project; PROCESSED
|
||||
;; is the total number of .scm files already compiled in previous
|
||||
;; invocations of this script.
|
||||
(catch #t
|
||||
(lambda ()
|
||||
(let* ((to-build (filter file-needs-compilation? files))
|
||||
(processed (+ processed
|
||||
(- (length files) (length to-build)))))
|
||||
(compile-files srcdir (getcwd) to-build
|
||||
#:workers (parallel-job-count*)
|
||||
#:host host
|
||||
#:report-load (lambda (file total completed)
|
||||
(when file
|
||||
(format #t "[~3d%] LOAD ~a~%"
|
||||
(% (+ 1 completed
|
||||
(* 2 processed))
|
||||
(* 2 grand-total))
|
||||
file)
|
||||
(force-output)))
|
||||
#:report-compilation (lambda (file total completed)
|
||||
(when file
|
||||
(format #t "[~3d%] GUILEC ~a~%"
|
||||
(% (+ total completed 1
|
||||
(* 2 processed))
|
||||
(* 2 grand-total))
|
||||
(scm->go file))
|
||||
(force-output))))))
|
||||
(lambda _
|
||||
(primitive-exit 1))
|
||||
(lambda args
|
||||
;; Try to report the error in an intelligible way.
|
||||
(let* ((stack (make-stack #t))
|
||||
(frame (if (> (stack-length stack) 1)
|
||||
(stack-ref stack 1) ;skip the 'throw' frame
|
||||
(stack-ref stack 0)))
|
||||
(ui (false-if-exception
|
||||
(resolve-module '(guix ui))))
|
||||
(report (and ui
|
||||
(false-if-exception
|
||||
(module-ref ui 'report-load-error)))))
|
||||
(if report
|
||||
(report (or (and=> (current-load-port) port-filename) "?.scm")
|
||||
args frame)
|
||||
(begin
|
||||
(print-exception (current-error-port) frame
|
||||
(car args) (cdr args))
|
||||
(display-backtrace stack (current-error-port)))))))))
|
||||
@@ -1,68 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2018 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 Guix using Guix.
|
||||
|
||||
(use-modules (srfi srfi-26))
|
||||
|
||||
;; Avoid lots of readlink calls
|
||||
(fluid-set! %file-port-name-canonicalization #f)
|
||||
|
||||
;; Add ~/.config/guix/current to the search path.
|
||||
(eval-when (expand load eval)
|
||||
(and=> (or (getenv "XDG_CONFIG_HOME")
|
||||
(and=> (getenv "HOME")
|
||||
(cut string-append <> "/.config/guix/current")))
|
||||
(lambda (current)
|
||||
(set! %load-path
|
||||
(cons (string-append current "/share/guile/site/"
|
||||
(effective-version))
|
||||
%load-path))
|
||||
(set! %load-compiled-path
|
||||
(cons (string-append current "/lib/guile/" (effective-version)
|
||||
"/site-ccache")
|
||||
%load-compiled-path)))))
|
||||
|
||||
(use-modules (guix) (guix ui)
|
||||
(guix git-download)
|
||||
(ice-9 match))
|
||||
|
||||
(match (command-line)
|
||||
((program source)
|
||||
;; The build procedure outputs to this port, so setup buffering to avoid
|
||||
;; one char per syscall.
|
||||
(setvbuf (current-error-port) 'line)
|
||||
|
||||
(with-error-handling
|
||||
(with-store store
|
||||
(let* ((script (string-append source "/build-aux/build-self.scm"))
|
||||
(build (primitive-load script))
|
||||
(git? (git-predicate source)))
|
||||
(run-with-store store
|
||||
;; TODO: Extract #:version and #:commit using Guile-Git.
|
||||
(mlet* %store-monad ((source (interned-file source "guix-source"
|
||||
#:select? git?
|
||||
#:recursive? #t))
|
||||
(drv (build source #:pull-version 1)))
|
||||
(mbegin %store-monad
|
||||
(show-what-to-build* (list drv))
|
||||
(built-derivations (list drv))
|
||||
(with-monad %store-monad
|
||||
(display (derivation->output-path drv))
|
||||
(newline)
|
||||
(return drv))))))))))
|
||||
@@ -1,26 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2021 Julien Lepiller <julien@lepiller.eu>
|
||||
;;;
|
||||
;;; 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/>.
|
||||
|
||||
;; Translate cross-references in a translated .texi manual.
|
||||
|
||||
(use-modules (guix build po)
|
||||
(ice-9 match))
|
||||
|
||||
(match (command-line)
|
||||
((program texi pofile)
|
||||
(translate-cross-references texi pofile)))
|
||||
@@ -1,108 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2016-2018, 2020, 2022 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
|
||||
;;; Copyright © 2021 Mathieu Othacehe <othacehe@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 program replicates the behavior of Cuirass's 'evaluate' process.
|
||||
;;; It displays the evaluated jobs on the standard output.
|
||||
|
||||
(use-modules (guix channels)
|
||||
(guix derivations)
|
||||
(guix git-download)
|
||||
(guix inferior)
|
||||
(guix packages)
|
||||
(guix store)
|
||||
(guix ui)
|
||||
((guix ui) #:select (build-notifier))
|
||||
(ice-9 match)
|
||||
(ice-9 pretty-print)
|
||||
(ice-9 threads))
|
||||
|
||||
(define %top-srcdir
|
||||
(and=> (assq-ref (current-source-location) 'filename)
|
||||
(lambda (file)
|
||||
(canonicalize-path
|
||||
(string-append (dirname file) "/../..")))))
|
||||
|
||||
(match (command-line)
|
||||
((command directory)
|
||||
(let ((real-build-things build-things))
|
||||
(with-store store
|
||||
;; The evaluation of Guix itself requires building a "trampoline"
|
||||
;; program, and possibly everything it depends on. Thus, allow builds
|
||||
;; but print a notification.
|
||||
(with-build-handler (build-notifier #:use-substitutes? #f)
|
||||
|
||||
;; Add %TOP-SRCDIR to the store with a proper Git predicate so we
|
||||
;; work from a clean checkout.
|
||||
(let ((source (add-to-store store "guix-source" #t
|
||||
"sha256" %top-srcdir
|
||||
#:select? (git-predicate %top-srcdir))))
|
||||
(define instances
|
||||
(list (checkout->channel-instance source)))
|
||||
|
||||
(define channels
|
||||
(map channel-instance-channel instances))
|
||||
|
||||
(define derivation
|
||||
;; Compute the derivation of Guix for COMMIT.
|
||||
(run-with-store store
|
||||
(channel-instances->derivation instances)))
|
||||
|
||||
;; TODO: Remove 'show-what-to-build' call when Cuirass' 'evaluate'
|
||||
;; scripts uses 'with-build-handler'.
|
||||
(show-what-to-build store (list derivation))
|
||||
(build-derivations store (list derivation))
|
||||
|
||||
|
||||
;; Evaluate jobs on a per-system basis for two reasons. It speeds
|
||||
;; up the evaluation speed as the evaluations can be performed
|
||||
;; concurrently. It also decreases the amount of memory needed per
|
||||
;; evaluation process.
|
||||
;;
|
||||
;; Fork inferior processes upfront before we have created any
|
||||
;; threads.
|
||||
(let ((inferiors (map (lambda _
|
||||
(open-inferior (derivation->output-path derivation)))
|
||||
%cuirass-supported-systems)))
|
||||
(n-par-for-each
|
||||
(min (length %cuirass-supported-systems)
|
||||
(current-processor-count))
|
||||
(lambda (system inferior)
|
||||
(with-store store
|
||||
(let ((channels (map channel-instance->sexp instances)))
|
||||
(inferior-eval '(use-modules (gnu ci)) inferior)
|
||||
(let ((jobs
|
||||
(inferior-eval-with-store
|
||||
inferior store
|
||||
`(lambda (store)
|
||||
(cuirass-jobs store
|
||||
'((subset . all)
|
||||
(systems . ,(list system))
|
||||
(channels . ,channels))))))
|
||||
(file
|
||||
(string-append directory "/jobs-" system ".scm")))
|
||||
(close-inferior inferior)
|
||||
(call-with-output-file file
|
||||
(lambda (port)
|
||||
(pretty-print jobs port)))))))
|
||||
%cuirass-supported-systems
|
||||
inferiors)))))))
|
||||
(x
|
||||
(format (current-error-port) "Wrong command: ~a~%." x)
|
||||
(exit 1)))
|
||||
74
build-aux/download.scm
Normal file
74
build-aux/download.scm
Normal file
@@ -0,0 +1,74 @@
|
||||
;;; 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)))))))
|
||||
@@ -1,80 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if test "$#" -lt 1 || test "$#" -gt 2
|
||||
then
|
||||
echo "Usage: extract-syscall-ranges.sh FILENAME [abiname_regex]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
numbers_to_ranges()
|
||||
{
|
||||
if ! read number
|
||||
then
|
||||
printf '{}\n'
|
||||
return
|
||||
fi
|
||||
low="$number"
|
||||
high="$number"
|
||||
while true
|
||||
do
|
||||
if read number
|
||||
then
|
||||
if test "$number" -eq "$((high + 1))"
|
||||
then
|
||||
high="$number"
|
||||
else
|
||||
break
|
||||
fi
|
||||
else
|
||||
printf '{ {%d, %d} }\n' "$low" "$high"
|
||||
return
|
||||
fi
|
||||
done
|
||||
printf '{ {%d, %d}' "$low" "$high"
|
||||
low="$number"
|
||||
high="$number"
|
||||
while true
|
||||
do
|
||||
if read number
|
||||
then
|
||||
if test "$number" -eq "$((high + 1))"
|
||||
then
|
||||
high="$number"
|
||||
else
|
||||
printf ', {%d, %d}' "$low" "$high"
|
||||
low="$number"
|
||||
high="$number"
|
||||
fi
|
||||
else
|
||||
printf ', {%d, %d} }\n' "$low" "$high"
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
if test "$#" -eq 2
|
||||
then
|
||||
abi_regex="$2"
|
||||
getnumbers()
|
||||
{
|
||||
# delete comment lines and space-only lines
|
||||
sed -e '/^[[:space:]]*#/d ; /^[[:space:]]*$/d' |
|
||||
# filter to only include lines with target abi or "common"
|
||||
grep -E "^[0-9]+[[:space:]]+(common|(${abi_regex}))[[:space:]]" |
|
||||
# limit to only syscall number
|
||||
sed -e 's/\([0-9]\+\).*/\1/g'
|
||||
}
|
||||
else
|
||||
getnumbers()
|
||||
{
|
||||
# delete comment lines and space-only lines and limit to syscall number
|
||||
sed -e '/^[[:space:]]*#/d ; /^[[:space:]]*$/d ; s/\([0-9]\+\).*/\1/g'
|
||||
}
|
||||
fi
|
||||
|
||||
getnumbers < "$1" |
|
||||
sort -n |
|
||||
uniq | # Yes, there are duplicate syscall entries...
|
||||
numbers_to_ranges
|
||||
|
||||
|
||||
@@ -1,226 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Print a version string.
|
||||
scriptversion=2017-01-09.19; # UTC
|
||||
|
||||
# Copyright (C) 2007-2017 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/>.
|
||||
|
||||
# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
|
||||
# It may be run two ways:
|
||||
# - from a git repository in which the "git describe" command below
|
||||
# produces useful output (thus requiring at least one signed tag)
|
||||
# - from a non-git-repo directory containing a .tarball-version file, which
|
||||
# presumes this script is invoked like "./git-version-gen .tarball-version".
|
||||
|
||||
# In order to use intra-version strings in your project, you will need two
|
||||
# separate generated version string files:
|
||||
#
|
||||
# .tarball-version - present only in a distribution tarball, and not in
|
||||
# a checked-out repository. Created with contents that were learned at
|
||||
# the last time autoconf was run, and used by git-version-gen. Must not
|
||||
# be present in either $(srcdir) or $(builddir) for git-version-gen to
|
||||
# give accurate answers during normal development with a checked out tree,
|
||||
# but must be present in a tarball when there is no version control system.
|
||||
# Therefore, it cannot be used in any dependencies. GNUmakefile has
|
||||
# hooks to force a reconfigure at distribution time to get the value
|
||||
# correct, without penalizing normal development with extra reconfigures.
|
||||
#
|
||||
# .version - present in a checked-out repository and in a distribution
|
||||
# tarball. Usable in dependencies, particularly for files that don't
|
||||
# want to depend on config.h but do want to track version changes.
|
||||
# Delete this file prior to any autoconf run where you want to rebuild
|
||||
# files to pick up a version string change; and leave it stale to
|
||||
# minimize rebuild time after unrelated changes to configure sources.
|
||||
#
|
||||
# As with any generated file in a VC'd directory, you should add
|
||||
# /.version to .gitignore, so that you don't accidentally commit it.
|
||||
# .tarball-version is never generated in a VC'd directory, so needn't
|
||||
# be listed there.
|
||||
#
|
||||
# Use the following line in your configure.ac, so that $(VERSION) will
|
||||
# automatically be up-to-date each time configure is run (and note that
|
||||
# since configure.ac no longer includes a version string, Makefile rules
|
||||
# should not depend on configure.ac for version updates).
|
||||
#
|
||||
# AC_INIT([GNU project],
|
||||
# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
|
||||
# [bug-project@example])
|
||||
#
|
||||
# Then use the following lines in your Makefile.am, so that .version
|
||||
# will be present for dependencies, and so that .version and
|
||||
# .tarball-version will exist in distribution tarballs.
|
||||
#
|
||||
# EXTRA_DIST = $(top_srcdir)/.version
|
||||
# BUILT_SOURCES = $(top_srcdir)/.version
|
||||
# $(top_srcdir)/.version:
|
||||
# echo $(VERSION) > $@-t && mv $@-t $@
|
||||
# dist-hook:
|
||||
# echo $(VERSION) > $(distdir)/.tarball-version
|
||||
|
||||
|
||||
me=$0
|
||||
|
||||
version="git-version-gen $scriptversion
|
||||
|
||||
Copyright 2011 Free Software Foundation, Inc.
|
||||
There is NO warranty. You may redistribute this software
|
||||
under the terms of the GNU General Public License.
|
||||
For more information about these matters, see the files named COPYING."
|
||||
|
||||
usage="\
|
||||
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
|
||||
Print a version string.
|
||||
|
||||
Options:
|
||||
|
||||
--prefix PREFIX prefix of git tags (default 'v')
|
||||
--fallback VERSION
|
||||
fallback version to use if \"git --version\" fails
|
||||
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
||||
Running without arguments will suffice in most cases."
|
||||
|
||||
prefix=v
|
||||
fallback=
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
--help) echo "$usage"; exit 0;;
|
||||
--version) echo "$version"; exit 0;;
|
||||
--prefix) shift; prefix=${1?};;
|
||||
--fallback) shift; fallback=${1?};;
|
||||
-*)
|
||||
echo "$0: Unknown option '$1'." >&2
|
||||
echo "$0: Try '--help' for more information." >&2
|
||||
exit 1;;
|
||||
*)
|
||||
if test "x$tarball_version_file" = x; then
|
||||
tarball_version_file="$1"
|
||||
elif test "x$tag_sed_script" = x; then
|
||||
tag_sed_script="$1"
|
||||
else
|
||||
echo "$0: extra non-option argument '$1'." >&2
|
||||
exit 1
|
||||
fi;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test "x$tarball_version_file" = x; then
|
||||
echo "$usage"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tag_sed_script="${tag_sed_script:-s/x/x/}"
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# Avoid meddling by environment variable of the same name.
|
||||
v=
|
||||
v_from_git=
|
||||
|
||||
# First see if there is a tarball-only version file.
|
||||
# then try "git describe", then default.
|
||||
if test -f $tarball_version_file
|
||||
then
|
||||
v=`cat $tarball_version_file` || v=
|
||||
case $v in
|
||||
*$nl*) v= ;; # reject multi-line output
|
||||
[0-9]*) ;;
|
||||
*) v= ;;
|
||||
esac
|
||||
test "x$v" = x \
|
||||
&& echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
|
||||
fi
|
||||
|
||||
if test "x$v" != x
|
||||
then
|
||||
: # use $v
|
||||
# Otherwise, if there is at least one git commit involving the working
|
||||
# directory, and "git describe" output looks sensible, use that to
|
||||
# derive a version string.
|
||||
elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
|
||||
&& v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \
|
||||
|| git describe --abbrev=4 HEAD 2>/dev/null` \
|
||||
&& v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
|
||||
&& case $v in
|
||||
$prefix[0-9]*) ;;
|
||||
*) (exit 1) ;;
|
||||
esac
|
||||
then
|
||||
# Is this a new git that lists number of commits since the last
|
||||
# tag or the previous older version that did not?
|
||||
# Newer: v6.10-77-g0f8faeb
|
||||
# Older: v6.10-g0f8faeb
|
||||
case $v in
|
||||
*-*-*) : git describe is okay three part flavor ;;
|
||||
*-*)
|
||||
: git describe is older two part flavor
|
||||
# Recreate the number of commits and rewrite such that the
|
||||
# result is the same as if we were using the newer version
|
||||
# of git describe.
|
||||
vtag=`echo "$v" | sed 's/-.*//'`
|
||||
commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
|
||||
|| { commit_list=failed;
|
||||
echo "$0: WARNING: git rev-list failed" 1>&2; }
|
||||
numcommits=`echo "$commit_list" | wc -l`
|
||||
v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
|
||||
test "$commit_list" = failed && v=UNKNOWN
|
||||
;;
|
||||
esac
|
||||
|
||||
# Change the first '-' to a '.', so version-comparing tools work properly.
|
||||
# Remove the "g" in git describe's output string, to save a byte.
|
||||
v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
|
||||
v_from_git=1
|
||||
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
|
||||
v=UNKNOWN
|
||||
else
|
||||
v=$fallback
|
||||
fi
|
||||
|
||||
v=`echo "$v" |sed "s/^$prefix//"`
|
||||
|
||||
# Test whether to append the "-dirty" suffix only if the version
|
||||
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
|
||||
# or if it came from .tarball-version.
|
||||
if test "x$v_from_git" != x; then
|
||||
# Don't declare a version "dirty" merely because a timestamp has changed.
|
||||
git update-index --refresh > /dev/null 2>&1
|
||||
|
||||
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
|
||||
case "$dirty" in
|
||||
'') ;;
|
||||
*) # Append the suffix only if there isn't one already.
|
||||
case $v in
|
||||
*-dirty) ;;
|
||||
*) v="$v-dirty" ;;
|
||||
esac ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
|
||||
printf %s "$v"
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
84
build-aux/hydra/demo-os.scm
Normal file
84
build-aux/hydra/demo-os.scm
Normal file
@@ -0,0 +1,84 @@
|
||||
;;; 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/>.
|
||||
|
||||
|
||||
;;;
|
||||
;;; This file defines an operating system configuration for the demo virtual
|
||||
;;; machine images that we build.
|
||||
;;;
|
||||
|
||||
(use-modules (gnu))
|
||||
(use-service-modules desktop xorg networking avahi dbus)
|
||||
(use-package-modules linux xorg tor avahi)
|
||||
|
||||
(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)
|
||||
(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)))
|
||||
271
build-aux/hydra/gnu-system.scm
Normal file
271
build-aux/hydra/gnu-system.scm
Normal file
@@ -0,0 +1,271 @@
|
||||
;;; 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"))
|
||||
(timeout . ,(or (assoc-ref (package-properties package) 'timeout)
|
||||
72000)))) ; 20 hours by default
|
||||
|
||||
(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.9 gcc-5 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
|
||||
(* 860 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 hack
|
||||
;; prevents known-to-fail cross-builds from i686-linux or armhf-linux to
|
||||
;; mips64el-linux-gnuabi64.
|
||||
(and (or (string-prefix? "i686-" system)
|
||||
(string-prefix? "armhf-" 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))
|
||||
103
build-aux/hydra/guix.scm
Normal file
103
build-aux/hydra/guix.scm
Normal file
@@ -0,0 +1,103 @@
|
||||
;;; 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)
|
||||
(gnu packages man)
|
||||
(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 (package
|
||||
(inherit guix)
|
||||
(native-inputs `(("graphviz" ,graphviz)
|
||||
("help2man" ,help2man)
|
||||
,@(package-native-inputs 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))))))
|
||||
@@ -1,78 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2025 Florian Pelz <pelzflorian@pelzflorian.de>
|
||||
;;;
|
||||
;;; 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/>.
|
||||
|
||||
;; Minify Gettext PO files when synced from
|
||||
;; <https://codeberg.org/guix/translations/>,
|
||||
;; keeping only actually translated messages.
|
||||
|
||||
;; Note: This does not work for PO files of the guix domain, which needed
|
||||
;; support for plural forms in (@ (guix build po) read-po-file). The guix
|
||||
;; domain's files are comparatively small and the read-po-file API would
|
||||
;; have to be expanded to use records or such; it is not worth it.
|
||||
|
||||
(use-modules (guix build po)
|
||||
(ice-9 match)
|
||||
(ice-9 textual-ports))
|
||||
|
||||
(define (escape str)
|
||||
"Escape msgid or msgstr. Replace by C-style escape sequences."
|
||||
(let* ((in (open-input-string str))
|
||||
(text (get-string-all in))
|
||||
(escaped-text-as-list
|
||||
(string-fold-right
|
||||
(lambda (char result)
|
||||
(cons (case char
|
||||
((#\") "\\\"")
|
||||
((#\\) "\\\\")
|
||||
((#\linefeed) "\\n")
|
||||
((#\return) "\\r")
|
||||
((#\tab) "\\t")
|
||||
(else (string char)))
|
||||
result))
|
||||
'()
|
||||
text))
|
||||
(escaped-text (apply string-append escaped-text-as-list)))
|
||||
(display escaped-text)))
|
||||
|
||||
(match (command-line)
|
||||
((program pofile)
|
||||
(let ((input (open-input-file pofile)))
|
||||
;; Just copy until an empty line.
|
||||
(letrec ((copy
|
||||
(lambda ()
|
||||
(let ((next-line (get-line input)))
|
||||
(display next-line)
|
||||
(newline)
|
||||
(when (> (string-length next-line) 0)
|
||||
(copy))))))
|
||||
(copy))
|
||||
;; Then print only translated messages.
|
||||
(for-each
|
||||
(lambda (msg)
|
||||
(match msg
|
||||
((msgid . msgstr)
|
||||
(display "msgid \"")
|
||||
(escape msgid)
|
||||
(display "\"")
|
||||
(newline)
|
||||
(display "msgstr \"")
|
||||
(escape msgstr)
|
||||
(display "\"")
|
||||
(newline)
|
||||
(newline))))
|
||||
(read-po-file input)))))
|
||||
47
build-aux/make-binary-tarball.scm
Normal file
47
build-aux/make-binary-tarball.scm
Normal file
@@ -0,0 +1,47 @@
|
||||
;;; 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 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))))
|
||||
@@ -1,89 +0,0 @@
|
||||
#! /bin/sh
|
||||
# -*-scheme-*-
|
||||
export LANG=C LANGUAGE=C LC_TIME=C
|
||||
export TZ=UTC0
|
||||
exec guile --no-auto-compile -L $srcdir -C $srcdir -e '(mdate-from-git)' -s "$0" "$@"
|
||||
!#
|
||||
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
;;; This program is free software; you can redistribute it and/or modify it
|
||||
;;; under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||
;;; your option) any later version.
|
||||
;;;
|
||||
;;; This program is distributed in the hope that it will be useful, but
|
||||
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;;; Commentary:
|
||||
;;;
|
||||
;;; Usage: mdate-from-git.scm FILE
|
||||
;;;
|
||||
;;; This script is compatible with Automake's `mdate-sh' but uses the timestamp
|
||||
;;; from Git instead of from the file system. Also, it can be appended to
|
||||
;;; mdate-sh.
|
||||
|
||||
;;; As a special exception for Guix, it caters for doc/guix.LANG.texi files that
|
||||
;;; are not stored in Git, by using po/doc/guix-manual.LANG.po for the Git
|
||||
;;; timestamp. Test doing something like:
|
||||
;;;
|
||||
;;; build-aux/mdate-from-git.scm doc/guix.de.texi
|
||||
;;;
|
||||
;;;; Code:
|
||||
|
||||
(define-module (mdate-from-git)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (ice-9 popen)
|
||||
#:use-module (ice-9 rdelim)
|
||||
#:use-module (ice-9 regex)
|
||||
#:export (main))
|
||||
|
||||
(define (pipe-command command)
|
||||
(let* ((port (apply open-pipe* OPEN_READ command))
|
||||
(output (read-string port)))
|
||||
(close-port port)
|
||||
output))
|
||||
|
||||
(define (guix.LANG.texi->guix-manual.LANG.po file-name)
|
||||
"Translated manuals doc/guix.LANG.texi are not tracked in Git and are
|
||||
generated from po/doc/guix-manual.LANG.po. For such an untraced .TEXI file,
|
||||
return its .PO counterpart."
|
||||
(let ((m (string-match "doc/guix.([^.]+).texi" file-name)))
|
||||
(if (not m) file-name
|
||||
(let ((lang (match:substring m 1)))
|
||||
(format #f "po/doc/guix-manual.~a.po" lang)))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Entry point.
|
||||
;;;
|
||||
(define (main args)
|
||||
(match args
|
||||
((script file-name)
|
||||
(let* ((command `("git" "ls-files" "--error-unmatch" "--" ,file-name))
|
||||
(tracked? (zero? (with-error-to-port (%make-void-port "w")
|
||||
(lambda _
|
||||
(with-output-to-port (%make-void-port "w")
|
||||
(lambda _ (apply system* command)))))))
|
||||
(file-name (if tracked? file-name
|
||||
(guix.LANG.texi->guix-manual.LANG.po file-name)))
|
||||
(command `("git" "log" "--pretty=format:%ct" "-n1" "--" ,file-name))
|
||||
(timestamp (with-error-to-port (%make-void-port "w")
|
||||
(lambda _ (pipe-command command))))
|
||||
(source-date-epoch (or (getenv "SOURCE_DATE_EPOCH") "1"))
|
||||
(timestamp (if (string-null? timestamp) source-date-epoch
|
||||
timestamp))
|
||||
(time (gmtime (string->number timestamp)))
|
||||
(d-m-y (strftime "%-d %B %Y" time)))
|
||||
(display d-m-y)))
|
||||
(_
|
||||
(format (current-error-port) "Usage: mdate-from-git.scm FILE\n")
|
||||
(exit 2))))
|
||||
@@ -1,61 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2012, 2013, 2014, 2015, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
|
||||
# Copyright © 2017 Eric Bavier <bavier@cray.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/>.
|
||||
|
||||
# Usage: ./pre-inst-env COMMAND ARG...
|
||||
#
|
||||
# Run COMMAND in a pre-installation environment. Typical use is
|
||||
# "./pre-inst-env guix build hello".
|
||||
|
||||
# By default we may end up with absolute directory names that contain '..',
|
||||
# which get into $GUILE_LOAD_PATH, leading to '..' in the module file names
|
||||
# recorded by Guile. To avoid that, make sure we get a real absolute
|
||||
# directory name. Additionally, use '-P' to get the canonical directory name
|
||||
# so that Guile's 'relative' %file-port-name-canonicalization can actually
|
||||
# work (see <http://bugs.gnu.org/17935>.)
|
||||
abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd -P`"
|
||||
abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd -P`"
|
||||
|
||||
GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"
|
||||
GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH"
|
||||
export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
|
||||
|
||||
# Define $PATH so that `guix' and friends are easily found.
|
||||
|
||||
PATH="$abs_top_builddir/scripts:$abs_top_builddir:$PATH"
|
||||
export PATH
|
||||
|
||||
# The daemon invokes 'guix'; tell it which one to use.
|
||||
GUIX="$abs_top_builddir/scripts/guix"
|
||||
export GUIX
|
||||
|
||||
# Sanity check.
|
||||
if [ "$1" = "guix" ] && [ ! -f "$GUIX" ]; then
|
||||
echo "$GUIX is not built. Please run 'make scripts/guix'."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Define $GUIX_UNINSTALLED to prevent `guix' from
|
||||
# prepending @guilemoduledir@ to the Guile load paths.
|
||||
|
||||
GUIX_UNINSTALLED=1
|
||||
export GUIX_UNINSTALLED
|
||||
|
||||
exec "$@"
|
||||
@@ -1,301 +0,0 @@
|
||||
#!/bin/sh
|
||||
exec guile --no-auto-compile -e main -s "$0" "$@"
|
||||
!#
|
||||
;;;; test-driver.scm - Guile test driver for Automake testsuite harness
|
||||
|
||||
(define script-version "2026-03-21.02") ;UTC
|
||||
|
||||
;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
|
||||
;;; Copyright © 2021 Maxim Cournoyer <maxim@guixotic.coop>
|
||||
;;; Copyright © 2024 Tomas Volf <~@wolfsden.cz>
|
||||
;;;
|
||||
;;; This program is free software; you can redistribute it and/or modify it
|
||||
;;; under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||
;;; your option) any later version.
|
||||
;;;
|
||||
;;; This program is distributed in the hope that it will be useful, but
|
||||
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;;; Commentary:
|
||||
;;;
|
||||
;;; This script provides a Guile test driver using the SRFI-64 Scheme API for
|
||||
;;; test suites. SRFI-64 is distributed with Guile since version 2.0.9.
|
||||
;;;
|
||||
;;;; Code:
|
||||
|
||||
(use-modules (ice-9 format)
|
||||
(ice-9 getopt-long)
|
||||
(ice-9 pretty-print)
|
||||
(ice-9 regex)
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-19)
|
||||
(srfi srfi-26)
|
||||
(srfi srfi-64)
|
||||
(srfi srfi-71))
|
||||
|
||||
(define (show-help)
|
||||
(display "Usage:
|
||||
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
||||
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
||||
[--select=REGEXP] [--exclude=REGEXP] [--errors-only={yes|no}]
|
||||
[--enable-hard-errors={yes|no}] [--brief={yes|no}}]
|
||||
[--show-duration={yes|no}] [--]
|
||||
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
||||
The '--test-name' option is mandatory. The '--select' and '--exclude' options
|
||||
allow selecting or excluding individual test cases via a regexp, respectively.
|
||||
The '--errors-only' option can be set to \"yes\" to limit the logged test case
|
||||
metadata to only those test cases that failed. When set to \"yes\", the
|
||||
'--brief' option disables printing the individual test case result to the
|
||||
console. When '--show-duration' is set to \"yes\", the time elapsed per test
|
||||
case is shown.\n"))
|
||||
|
||||
(define %options
|
||||
'((test-name (value #t))
|
||||
(log-file (value #t))
|
||||
(trs-file (value #t))
|
||||
(select (value #t))
|
||||
(exclude (value #t))
|
||||
(errors-only (value #t))
|
||||
(color-tests (value #t))
|
||||
(expect-failure (value #t)) ;XXX: not implemented yet
|
||||
(enable-hard-errors (value #t)) ;not implemented in SRFI-64
|
||||
(brief (value #t))
|
||||
(show-duration (value #t))
|
||||
(help (single-char #\h) (value #f))
|
||||
(version (single-char #\V) (value #f))))
|
||||
|
||||
(define (option->boolean options key)
|
||||
"Return #t if the value associated with KEY in OPTIONS is \"yes\"."
|
||||
(and=> (option-ref options key #f) (cut string=? <> "yes")))
|
||||
|
||||
(define* (test-display field value #:optional (port (current-output-port))
|
||||
#:key pretty?)
|
||||
"Display \"FIELD: VALUE\\n\" on PORT."
|
||||
(if pretty?
|
||||
(begin
|
||||
(format port "~A:~%" field)
|
||||
(pretty-print value port #:per-line-prefix "+ "))
|
||||
(format port "~A: ~S~%" field value)))
|
||||
|
||||
(define* (result->string symbol #:key colorize?)
|
||||
"Return SYMBOL as an upper case string. Use colors when COLORIZE is #t."
|
||||
(let ((result (string-upcase (symbol->string symbol))))
|
||||
(if colorize?
|
||||
(string-append (case symbol
|
||||
((pass) "[0;32m") ;green
|
||||
((xfail) "[1;32m") ;light green
|
||||
((skip) "[1;34m") ;blue
|
||||
((fail xpass) "[0;31m") ;red
|
||||
((error) "[0;35m")) ;magenta
|
||||
result
|
||||
"[m") ;no color
|
||||
result)))
|
||||
|
||||
(define* (test-result-kind* #:optional (runner (test-runner-current)))
|
||||
;; TODO: Since Guile 3.0.11, the test-result-kind value of tests not
|
||||
;; selected by specifiers is #f instead of 'skip, which seems like a bug.
|
||||
;; Revert to use 'test-result-kind' after
|
||||
;; <https://codeberg.org/guile/guile/issues/133> is resolved and made and
|
||||
;; available in Guix.
|
||||
(or (test-result-ref runner 'result-kind)
|
||||
'skip))
|
||||
|
||||
(define (current-test-full-name runner)
|
||||
"Get full name (test group path + name) of current test."
|
||||
(format #f "~{~a~^/~}: ~a"
|
||||
(test-runner-group-path runner)
|
||||
(test-runner-test-name runner)))
|
||||
|
||||
|
||||
;;;
|
||||
;;; SRFI 64 custom test runner.
|
||||
;;;
|
||||
|
||||
(define* (test-runner-gnu test-name #:key color? brief? errors-only?
|
||||
show-duration?
|
||||
(out-port (current-output-port))
|
||||
(trs-port (%make-void-port "w"))
|
||||
select exclude)
|
||||
"Return a custom SRFI-64 test runner and a `finalize' procedure as multiple
|
||||
values. TEST-NAME is a string specifying the file name of the current the
|
||||
test. COLOR? specifies whether to use colors. When BRIEF? is true, the
|
||||
individual test cases results are masked and only the summary is shown.
|
||||
ERRORS-ONLY? reduces the amount of test case metadata logged to only that of
|
||||
the failed test cases. OUT-PORT and TRS-PORT must be output ports. OUT-PORT
|
||||
defaults to the current output port, while TRS-PORT defaults to a void port,
|
||||
which means no TRS output is logged. SELECT and EXCLUDE may take a regular
|
||||
expression to select or exclude individual test cases based on their names.
|
||||
|
||||
After the tests are finished running, the `finalize' procedure should be
|
||||
called to do the final reporting."
|
||||
|
||||
(define test-cases-start-time (make-hash-table))
|
||||
|
||||
(define (test-on-test-begin-gnu runner)
|
||||
;; Procedure called at the start of an individual test case, before the
|
||||
;; test expression (and expected value) are evaluated.
|
||||
(let ((test-case-name (current-test-full-name runner))
|
||||
(start-time (current-time time-monotonic)))
|
||||
(hash-set! test-cases-start-time test-case-name start-time)))
|
||||
|
||||
(define (test-skipped? runner)
|
||||
(eq? 'skip (test-result-kind* runner)))
|
||||
|
||||
(define (test-failed? runner)
|
||||
(not (or (test-passed? runner)
|
||||
(test-skipped? runner))))
|
||||
|
||||
(define (test-on-test-end-gnu runner)
|
||||
;; Procedure called at the end of an individual test case, when the result
|
||||
;; of the test is available.
|
||||
(let* ((results (test-result-alist runner))
|
||||
(result? (cut assq <> results))
|
||||
(result (cut assq-ref results <>))
|
||||
(test-case-name (current-test-full-name runner))
|
||||
(start (hash-ref test-cases-start-time test-case-name))
|
||||
(end (current-time time-monotonic))
|
||||
(time-elapsed (time-difference end start))
|
||||
(time-elapsed-seconds (+ (time-second time-elapsed)
|
||||
(* 1e-9 (time-nanosecond time-elapsed)))))
|
||||
(unless (or brief? (and errors-only? (test-skipped? runner)))
|
||||
;; Display the result of each test case on the console.
|
||||
(format out-port "~a: ~a - ~a ~@[[~,3fs]~]~%"
|
||||
(result->string (test-result-kind* runner) #:colorize? color?)
|
||||
test-name test-case-name
|
||||
(and show-duration? time-elapsed-seconds)))
|
||||
|
||||
(unless (and errors-only? (not (test-failed? runner)))
|
||||
(format #t "test-name: ~A~%" test-case-name)
|
||||
(format #t "location: ~A~%"
|
||||
(string-append (result 'source-file) ":"
|
||||
(number->string (result 'source-line))))
|
||||
(test-display "source" (result 'source-form) #:pretty? #t)
|
||||
(when (result? 'expected-value)
|
||||
(test-display "expected-value" (result 'expected-value)))
|
||||
(when (result? 'expected-error)
|
||||
(test-display "expected-error" (result 'expected-error) #:pretty? #t))
|
||||
(when (result? 'actual-value)
|
||||
(test-display "actual-value" (result 'actual-value)))
|
||||
(when (result? 'actual-error)
|
||||
(test-display "actual-error" (result 'actual-error) #:pretty? #t))
|
||||
(format #t "result: ~a~%" (result->string (result 'result-kind)))
|
||||
(newline))
|
||||
|
||||
(format trs-port ":test-result: ~A ~A [~,3fs]~%"
|
||||
(result->string (test-result-kind* runner))
|
||||
test-case-name time-elapsed-seconds)))
|
||||
|
||||
(define (finalize runner)
|
||||
"Procedure to call after all tests finish to do the final reporting."
|
||||
(let ((fail (or (positive? (test-runner-fail-count runner))
|
||||
(positive? (test-runner-xpass-count runner))))
|
||||
(skip (or (positive? (test-runner-skip-count runner))
|
||||
(positive? (test-runner-xfail-count runner)))))
|
||||
(format trs-port ":global-test-result: ~{~A~^,~}~%"
|
||||
(filter-map (λ (proc str)
|
||||
(let ((n (proc runner)))
|
||||
(if (positive? n) str #f)))
|
||||
(list test-runner-pass-count
|
||||
test-runner-fail-count
|
||||
test-runner-xpass-count
|
||||
test-runner-xfail-count
|
||||
test-runner-skip-count)
|
||||
(list "PASS"
|
||||
"FAIL"
|
||||
"XPASS"
|
||||
"XFAIL"
|
||||
"SKIP")))
|
||||
(format trs-port ":recheck: ~A~%"
|
||||
(if fail "yes" "no"))
|
||||
(format trs-port ":copy-in-global-log: ~A~%"
|
||||
(if (or fail skip) "yes" "no"))
|
||||
(when brief?
|
||||
;; Display the global test group result on the console.
|
||||
(format out-port "~A: ~A~%"
|
||||
(result->string (if fail 'fail (if skip 'skip 'pass))
|
||||
#:colorize? color?)
|
||||
test-name))))
|
||||
|
||||
(let ((runner (test-runner-null)))
|
||||
(test-runner-on-test-begin! runner test-on-test-begin-gnu)
|
||||
(test-runner-on-test-end! runner test-on-test-end-gnu)
|
||||
(test-runner-on-bad-end-name! runner test-on-bad-end-name-simple)
|
||||
(values runner
|
||||
(λ () (finalize runner)))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; SRFI 64 test specifiers.
|
||||
;;;
|
||||
(define (test-match-name* regexp)
|
||||
"Return a test specifier that matches a test name against REGEXP."
|
||||
(compose (cut string-match regexp <>) current-test-full-name))
|
||||
|
||||
(define (test-match-name*/negated regexp)
|
||||
"Return a negated test specifier version of test-match-name*."
|
||||
(compose not (test-match-name* regexp)))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Entry point.
|
||||
;;;
|
||||
|
||||
(define (main . args)
|
||||
(let* ((opts (getopt-long (command-line) %options))
|
||||
(option (cut option-ref opts <> <>)))
|
||||
(cond
|
||||
((option 'help #f) (show-help))
|
||||
((option 'version #f) (format #t "test-driver.scm ~A~%" script-version))
|
||||
(else
|
||||
(let* ((log (and=> (option 'log-file #f) (cut open-file <> "w0")))
|
||||
(trs (and=> (option 'trs-file #f) (cut open-file <> "wl")))
|
||||
(out (duplicate-port (current-output-port) "wl"))
|
||||
(test-name (option 'test-name #f))
|
||||
(select (option 'select #f))
|
||||
(exclude (option 'exclude #f))
|
||||
(test-specifiers (filter-map
|
||||
identity
|
||||
(list (and=> select test-match-name*)
|
||||
(and=> exclude test-match-name*/negated))))
|
||||
(test-specifier (apply test-match-all test-specifiers))
|
||||
(color-tests (if (assoc 'color-tests opts)
|
||||
(option->boolean opts 'color-tests)
|
||||
#t)))
|
||||
(when log
|
||||
(redirect-port log (current-output-port))
|
||||
(redirect-port log (current-warning-port))
|
||||
(redirect-port log (current-error-port)))
|
||||
(let ((runner
|
||||
finalize (test-runner-gnu
|
||||
test-name
|
||||
#:color? color-tests
|
||||
#:brief? (option->boolean opts 'brief)
|
||||
#:errors-only? (option->boolean opts 'errors-only)
|
||||
#:show-duration? (option->boolean
|
||||
opts 'show-duration)
|
||||
#:out-port out #:trs-port trs)))
|
||||
(test-apply runner test-specifier
|
||||
(lambda _
|
||||
(load-from-path test-name)))
|
||||
(finalize))
|
||||
(and=> log close-port)
|
||||
(and=> trs close-port)
|
||||
(close-port out))))
|
||||
(exit 0)))
|
||||
|
||||
;;; Local Variables:
|
||||
;;; mode: scheme
|
||||
;;; eval: (add-hook 'write-file-functions 'time-stamp)
|
||||
;;; time-stamp-start: "(define script-version \""
|
||||
;;; time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
;;; time-stamp-time-zone: "UTC"
|
||||
;;; time-stamp-end: "\") ;UTC"
|
||||
;;; End:
|
||||
|
||||
;;;; test-driver.scm ends here.
|
||||
@@ -1,178 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2012-2019, 2021, 2025 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/>.
|
||||
|
||||
# Usage: ./test-env COMMAND ARG...
|
||||
#
|
||||
# Run the daemon in the build directory, and run COMMAND within
|
||||
# `pre-inst-env'. This is used to run unit tests with the just-built
|
||||
# daemon, unless `--disable-daemon' was passed at configure time.
|
||||
|
||||
|
||||
# Make sure 'cd' behaves deterministically and doesn't write anything to
|
||||
# stdout.
|
||||
unset CDPATH
|
||||
|
||||
case "$1" in
|
||||
--quiet-stderr)
|
||||
# Silence the daemon's output, which is often useless, as well as that
|
||||
# of Bash (such as "Terminated" messages when 'guix-daemon' is
|
||||
# killed.)
|
||||
exec 2> /dev/null
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -x "@abs_top_builddir@/guix-daemon" ]
|
||||
then
|
||||
NIX_STORE_DIR="@GUIX_TEST_ROOT@/store"
|
||||
|
||||
# Do that because store.scm calls `canonicalize-path' on it.
|
||||
mkdir -p "$NIX_STORE_DIR"
|
||||
|
||||
# Canonicalize the store directory name in an attempt to avoid symlinks in
|
||||
# it or its parent directories. See <http://bugs.gnu.org/17935>.
|
||||
NIX_STORE_DIR="`cd "@GUIX_TEST_ROOT@/store"; pwd -P`"
|
||||
|
||||
GUIX_LOG_DIRECTORY="@GUIX_TEST_ROOT@/var/log/guix"
|
||||
GUIX_DATABASE_DIRECTORY="@GUIX_TEST_ROOT@/db"
|
||||
|
||||
# Choose a PID-dependent name to allow for parallel builds. Note
|
||||
# that the directory name must be chosen so that the socket's file
|
||||
# name is less than 108-char long (the size of `sun_path' in glibc).
|
||||
# Currently, in Nix builds, we're at ~106 chars...
|
||||
GUIX_STATE_DIRECTORY="@GUIX_TEST_ROOT@/var/$$"
|
||||
|
||||
# We can't exit when we reach the limit, because perhaps the test doesn't
|
||||
# actually rely on the daemon, but at least warn.
|
||||
if test "`echo -n "$GUIX_STATE_DIRECTORY/daemon-socket/socket" | wc -c`" -ge 108
|
||||
then
|
||||
echo "warning: exceeding socket file name limit; test may fail!" >&2
|
||||
fi
|
||||
|
||||
# The configuration directory, for import/export signing keys.
|
||||
GUIX_CONFIGURATION_DIRECTORY="@GUIX_TEST_ROOT@/etc"
|
||||
if [ ! -d "$GUIX_CONFIGURATION_DIRECTORY" ]
|
||||
then
|
||||
# Copy the keys so that the secret key has the right permissions (the
|
||||
# daemon errors out when this is not the case.)
|
||||
mkdir -p "$GUIX_CONFIGURATION_DIRECTORY"
|
||||
cp "@abs_top_srcdir@/tests/keys/openpgp/signing-key.sec" \
|
||||
"@abs_top_srcdir@/tests/keys/openpgp/signing-key.pub" \
|
||||
"$GUIX_CONFIGURATION_DIRECTORY"
|
||||
chmod 400 "$GUIX_CONFIGURATION_DIRECTORY/signing-key.sec"
|
||||
fi
|
||||
|
||||
# A place to store data of the substituter.
|
||||
GUIX_BINARY_SUBSTITUTE_URL="file://$GUIX_STATE_DIRECTORY/substituter-data"
|
||||
rm -rf "$GUIX_STATE_DIRECTORY/substituter-data"
|
||||
mkdir -p "$GUIX_STATE_DIRECTORY/substituter-data"
|
||||
|
||||
# For a number of tests, we want to allow unsigned narinfos, for
|
||||
# simplicity.
|
||||
GUIX_ALLOW_UNAUTHENTICATED_SUBSTITUTES=yes
|
||||
|
||||
# Place for the substituter's cache.
|
||||
XDG_CACHE_HOME="$GUIX_STATE_DIRECTORY/cache-$$"
|
||||
|
||||
export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR \
|
||||
GUIX_LOG_DIRECTORY GUIX_STATE_DIRECTORY GUIX_DATABASE_DIRECTORY \
|
||||
GUIX_BINARY_SUBSTITUTE_URL \
|
||||
GUIX_ALLOW_UNAUTHENTICATED_SUBSTITUTES \
|
||||
GUIX_CONFIGURATION_DIRECTORY XDG_CACHE_HOME
|
||||
|
||||
# Create a fresh directory with restrictive permissions so that our test
|
||||
# daemon's weak isolation can't be exploited by other users
|
||||
rm -rf "$GUIX_STATE_DIRECTORY/daemon-socket"
|
||||
mkdir -m 0700 "$GUIX_STATE_DIRECTORY/daemon-socket"
|
||||
|
||||
# If unprivileged user namespaces are not supported, pass
|
||||
# '--disable-chroot'.
|
||||
if [ -f /proc/self/ns/user ] \
|
||||
&& { [ ! -f /proc/sys/kernel/unprivileged_userns_clone ] \
|
||||
|| [ "$(cat /proc/sys/kernel/unprivileged_userns_clone)" -eq 1 ]; }
|
||||
then
|
||||
extra_options=""
|
||||
else
|
||||
extra_options="--disable-chroot"
|
||||
echo "unprivileged user namespaces not supported; \
|
||||
running 'guix-daemon $extra_options'" >&2
|
||||
fi
|
||||
|
||||
# Launch the daemon without chroot support because is may be
|
||||
# unavailable, for instance if we're not running as root.
|
||||
"@abs_top_builddir@/pre-inst-env" \
|
||||
"@abs_top_builddir@/guix-daemon" \
|
||||
$extra_options \
|
||||
--substitute-urls="$GUIX_BINARY_SUBSTITUTE_URL" &
|
||||
|
||||
daemon_pid=$!
|
||||
trap "kill $daemon_pid ; rm -rf $GUIX_STATE_DIRECTORY" EXIT
|
||||
|
||||
# The test suite expects the 'guile-bootstrap' package to be available.
|
||||
# Normally the Guile bootstrap tarball is downloaded by a fixed-output
|
||||
# derivation but when network access is missing we allow users to drop
|
||||
# the tarball in 'gnu/packages/bootstrap/SYSTEM' and "intern" it here.
|
||||
bootstrap_directory="@abs_top_builddir@/gnu/packages/bootstrap/@guix_system@"
|
||||
if [ -d "$bootstrap_directory" ]
|
||||
then
|
||||
# Make sure 'guix-daemon' is listening before invoking 'guix
|
||||
# download'.
|
||||
"@abs_top_builddir@/pre-inst-env" "@GUILE@" -c \
|
||||
'(use-modules (guix))
|
||||
(let loop ((i 10))
|
||||
(catch #t
|
||||
(lambda () (open-connection))
|
||||
(lambda (key . args)
|
||||
(if (zero? i)
|
||||
(apply throw key args)
|
||||
(begin (usleep 500000) (loop (- i 1)))))))'
|
||||
|
||||
for file in "$bootstrap_directory"/guile-*
|
||||
do
|
||||
[ -f "$file" ] && \
|
||||
"@abs_top_builddir@/pre-inst-env" \
|
||||
guix download "file://$file" > /dev/null
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# Avoid issues that could stem from l10n, such as language/encoding
|
||||
# mismatches.
|
||||
unset LANGUAGE
|
||||
LC_MESSAGES=C
|
||||
export LC_MESSAGES
|
||||
|
||||
# Disable grafts by default because they can cause things to be built
|
||||
# regardless of '--dry-run'.
|
||||
GUIX_BUILD_OPTIONS="--no-grafts"
|
||||
export GUIX_BUILD_OPTIONS
|
||||
|
||||
# Ignore user settings.
|
||||
unset GUIX_PACKAGE_PATH
|
||||
|
||||
storedir="@storedir@"
|
||||
prefix="@prefix@"
|
||||
datarootdir="@datarootdir@"
|
||||
datadir="@datadir@"
|
||||
localstatedir="@localstatedir@"
|
||||
export storedir prefix datarootdir datadir localstatedir
|
||||
|
||||
"@abs_top_builddir@/pre-inst-env" "$@"
|
||||
exit $?
|
||||
@@ -1,198 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2017, 2018, 2019 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/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;;
|
||||
;;; This script updates the list of new and updated packages in 'NEWS'.
|
||||
;;;
|
||||
;;; Code:
|
||||
|
||||
(use-modules (gnu) (guix)
|
||||
(guix build utils)
|
||||
((guix ui) #:select (fill-paragraph))
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-11)
|
||||
(ice-9 match)
|
||||
(ice-9 rdelim)
|
||||
(ice-9 regex)
|
||||
(ice-9 vlist)
|
||||
(ice-9 pretty-print))
|
||||
|
||||
(define %header-rx
|
||||
(make-regexp "^\\* Changes in (version )?([0-9.]+) \\(since ([0-9.]+)\\)"))
|
||||
|
||||
(define (NEWS->versions port)
|
||||
"Return two values: the previous version and the current version as read
|
||||
from PORT, which is an input port on the 'NEWS' file."
|
||||
(let loop ()
|
||||
(let ((line (read-line port)))
|
||||
(cond ((eof-object? line)
|
||||
(error "failed to determine previous and current version"
|
||||
port))
|
||||
((regexp-exec %header-rx line)
|
||||
=>
|
||||
(lambda (match)
|
||||
(values (match:substring match 3)
|
||||
(match:substring match 2))))
|
||||
(else
|
||||
(loop))))))
|
||||
|
||||
(define (skip-to-org-heading port)
|
||||
"Read from PORT until an Org heading is found."
|
||||
(let loop ()
|
||||
(let ((next (peek-char port)))
|
||||
(cond ((eqv? next #\*)
|
||||
#t)
|
||||
((eof-object? next)
|
||||
(error "next heading could not be found"))
|
||||
(else
|
||||
(read-line port)
|
||||
(loop))))))
|
||||
|
||||
(define (rewrite-org-section input output heading-rx proc)
|
||||
"Write to OUTPUT the text read from INPUT, but with the first Org section
|
||||
matching HEADING-RX replaced by NEW-HEADING and CONTENTS."
|
||||
(let loop ()
|
||||
(let ((line (read-line input)))
|
||||
(cond ((eof-object? line)
|
||||
(error "failed to match heading regexp" heading-rx))
|
||||
((regexp-exec heading-rx line)
|
||||
=>
|
||||
(lambda (match)
|
||||
(proc match output)
|
||||
(skip-to-org-heading input)
|
||||
(dump-port input output)
|
||||
#t))
|
||||
(else
|
||||
(display line output)
|
||||
(newline output)
|
||||
(loop))))))
|
||||
|
||||
(define (enumeration->paragraph lst)
|
||||
"Turn LST, a list of strings, into a single string that is a ready-to-print
|
||||
paragraph."
|
||||
(fill-paragraph (string-join (sort lst string<?) ", ")
|
||||
75))
|
||||
|
||||
(define (write-packages-added news-file old new)
|
||||
"Write to NEWS-FILE the list of packages added between OLD and NEW."
|
||||
(let ((added (lset-difference string=? (map car new) (map car old))))
|
||||
(with-atomic-file-replacement news-file
|
||||
(lambda (input output)
|
||||
(rewrite-org-section input output
|
||||
(make-regexp "^(\\*+).*new packages")
|
||||
(lambda (match port)
|
||||
(let ((stars (match:substring match 1)))
|
||||
(format port
|
||||
"~a ~a new packages~%~%"
|
||||
stars (length added)))))))))
|
||||
|
||||
(define (write-packages-updates news-file old new)
|
||||
"Write to NEWS-FILE the list of packages upgraded between OLD and NEW."
|
||||
(define important
|
||||
'("gcc-toolchain" "glibc" "binutils" "gdb" ;toolchain
|
||||
"shepherd" "linux-libre" "xorg-server" "cups" ;OS
|
||||
"gnome" "xfce" "enlightenment" "lxde" "mate" ;desktop env.
|
||||
"guile" "bash" "python" "python2" "perl" ;languages
|
||||
"ghc" "rust" "go" "julia" "r" "ocaml"
|
||||
"icedtea" "openjdk" "clojure" "sbcl" "racket"
|
||||
"emacs" "gimp" "inkscape" "libreoffice" ;applications
|
||||
"octave" "icecat" "gnupg"))
|
||||
|
||||
(let* ((table (fold (lambda (package table)
|
||||
(match package
|
||||
((name . version)
|
||||
(vhash-cons name version table))))
|
||||
vlist-null
|
||||
new))
|
||||
(latest (lambda (name)
|
||||
(let ((versions (vhash-fold* cons '() name table)))
|
||||
(match (sort versions version>?)
|
||||
((latest . _) latest)))))
|
||||
(upgraded (filter-map (match-lambda
|
||||
((package . new-version)
|
||||
(match (assoc package old)
|
||||
((_ . old-version)
|
||||
(and (string=? new-version
|
||||
(latest package))
|
||||
(version>? new-version old-version)
|
||||
(cons package new-version)))
|
||||
(_ #f))))
|
||||
new))
|
||||
(noteworthy (filter (match-lambda
|
||||
((package . version)
|
||||
(member package important)))
|
||||
upgraded)))
|
||||
(with-atomic-file-replacement news-file
|
||||
(lambda (input output)
|
||||
(rewrite-org-section input output
|
||||
(make-regexp "^(\\*+).*package updates")
|
||||
(lambda (match port)
|
||||
(let ((stars (match:substring match 1))
|
||||
(lst (map (match-lambda
|
||||
((package . version)
|
||||
(string-append package " "
|
||||
version)))
|
||||
noteworthy)))
|
||||
(format port
|
||||
"~a ~a package updates~%~%Noteworthy updates:~%~a~%~%"
|
||||
stars (length upgraded)
|
||||
(enumeration->paragraph lst)))))))))
|
||||
|
||||
|
||||
(define (main . args)
|
||||
(match args
|
||||
((news-file data-directory)
|
||||
;; Don't browse things listed in the user's $GUIX_PACKAGE_PATH and
|
||||
;; in external channels.
|
||||
(parameterize ((%package-module-path
|
||||
%default-package-module-path))
|
||||
(define (package-file version)
|
||||
(string-append data-directory "/packages-"
|
||||
version ".txt"))
|
||||
|
||||
(define (package<? p1 p2)
|
||||
(string<? (package-full-name p1) (package-full-name p2)))
|
||||
|
||||
(let-values (((previous-version new-version)
|
||||
(call-with-input-file news-file NEWS->versions)))
|
||||
(format (current-error-port) "Updating NEWS for ~a to ~a...~%"
|
||||
previous-version new-version)
|
||||
(let* ((old (call-with-input-file (package-file previous-version)
|
||||
read))
|
||||
(all-packages/sorted (sort (fold-packages (lambda (p r)
|
||||
(cons p r))
|
||||
'())
|
||||
package<?))
|
||||
(new (map (lambda (p)
|
||||
(cons (package-name p) (package-version p)))
|
||||
all-packages/sorted)))
|
||||
(call-with-output-file (package-file new-version)
|
||||
(lambda (port)
|
||||
(pretty-print new port)))
|
||||
|
||||
(write-packages-added news-file old new)
|
||||
(write-packages-updates news-file old new)))))
|
||||
(x
|
||||
(format (current-error-port) "Usage: update-NEWS NEWS-FILE DATA-DIRECTORY
|
||||
|
||||
Update the list of new and updated packages in NEWS-FILE using the
|
||||
previous-version package list from DATA-DIRECTORY.\n")
|
||||
(exit 1))))
|
||||
|
||||
(apply main (cdr (command-line)))
|
||||
@@ -1,215 +0,0 @@
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2017-2018, 2025 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2020, 2025 Maxim Cournoyer <maxim@guixotic.coop>
|
||||
;;;
|
||||
;;; 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 scripts updates the definition of the 'guix' package in Guix for the
|
||||
;;; current commit. It requires Git to be installed.
|
||||
;;;
|
||||
;;; Code:
|
||||
|
||||
(use-modules (guix)
|
||||
(guix ui)
|
||||
(guix git-download)
|
||||
(guix upstream)
|
||||
(guix utils)
|
||||
(guix base32)
|
||||
(guix build utils)
|
||||
(guix scripts hash)
|
||||
(gnu packages package-management)
|
||||
(ice-9 match)
|
||||
(ice-9 popen)
|
||||
(ice-9 regex)
|
||||
(ice-9 textual-ports)
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-2)
|
||||
(srfi srfi-26))
|
||||
|
||||
(define %top-srcdir
|
||||
(string-append (current-source-directory) "/.."))
|
||||
|
||||
(define (package-definition-location)
|
||||
"Return the source properties of the definition of the 'guix' package."
|
||||
(call-with-input-file (location-file (package-location guix))
|
||||
(lambda (port)
|
||||
(let loop ()
|
||||
(match (read port)
|
||||
((? eof-object?)
|
||||
(error "definition of 'guix' package could not be found"
|
||||
(port-filename port)))
|
||||
(('define-public 'guix value)
|
||||
(source-properties value))
|
||||
(_
|
||||
(loop)))))))
|
||||
|
||||
(define* (update-definition commit hash
|
||||
#:key version old-hash)
|
||||
"Return a one-argument procedure that takes a string, the definition of the
|
||||
'guix' package, and returns a string, the update definition for VERSION,
|
||||
COMMIT."
|
||||
(define (linear-offset str line column)
|
||||
;; Return the offset in characters to reach LINE and COLUMN (both
|
||||
;; zero-indexed) in STR.
|
||||
(call-with-input-string str
|
||||
(lambda (port)
|
||||
(let loop ((offset 0))
|
||||
(cond ((and (= (port-column port) column)
|
||||
(= (port-line port) line))
|
||||
offset)
|
||||
((eof-object? (read-char port))
|
||||
(error "line and column not reached!"
|
||||
str))
|
||||
(else
|
||||
(loop (+ 1 offset))))))))
|
||||
|
||||
(define (update-hash str)
|
||||
;; Replace OLD-HASH with HASH in STR.
|
||||
(string-replace-substring str
|
||||
(bytevector->nix-base32-string old-hash)
|
||||
(bytevector->nix-base32-string hash)))
|
||||
|
||||
(lambda (str)
|
||||
(match (call-with-input-string str read)
|
||||
(('let (('version old-version)
|
||||
('commit old-commit)
|
||||
('revision old-revision))
|
||||
defn)
|
||||
(let* ((location (source-properties defn))
|
||||
(line (assq-ref location 'line))
|
||||
(column 0)
|
||||
(offset (linear-offset str line column)))
|
||||
(string-append (format #f "(let ((version \"~a\")
|
||||
(commit \"~a\")
|
||||
(revision ~a))\n"
|
||||
(or version old-version)
|
||||
commit
|
||||
(if (and version
|
||||
(not (string=? version old-version)))
|
||||
0
|
||||
(+ 1 old-revision)))
|
||||
(string-drop (update-hash str) offset))))
|
||||
(exp
|
||||
(error "'guix' package definition is not as expected" exp)))))
|
||||
|
||||
(define (git-add-worktree directory commit)
|
||||
"Create a new git worktree at DIRECTORY, detached on commit COMMIT."
|
||||
(invoke "git" "worktree" "add" "--detach" directory commit))
|
||||
|
||||
(define (call-with-temporary-git-worktree commit proc)
|
||||
"Execute PROC in the context of a temporary git worktree created from
|
||||
COMMIT. PROC receives the temporary directory file name as an argument."
|
||||
(call-with-temporary-directory
|
||||
(lambda (tmp-directory)
|
||||
(dynamic-wind
|
||||
(lambda ()
|
||||
#t)
|
||||
(lambda ()
|
||||
(git-add-worktree tmp-directory commit)
|
||||
(proc tmp-directory))
|
||||
(lambda ()
|
||||
(invoke "git" "worktree" "remove" "--force" tmp-directory))))))
|
||||
|
||||
(define %guix-git-repo-push-url-regexp
|
||||
"(git.guix.gnu.org|codeberg.org/guix|git@codeberg.org:guix)/guix(.git)? \\(push\\)")
|
||||
|
||||
(define (with-input-pipe-to-string prog . args)
|
||||
(let* ((input-pipe (apply open-pipe* OPEN_READ prog args))
|
||||
(output (get-string-all input-pipe))
|
||||
(exit-val (status:exit-val (close-pipe input-pipe))))
|
||||
(unless (zero? exit-val)
|
||||
(error (format #f "Command ~s exited with non-zero exit status: ~s"
|
||||
(string-join (cons prog args)) exit-val)))
|
||||
(string-trim-both output)))
|
||||
|
||||
(define (find-origin-remote)
|
||||
"Find the name of the git remote with the Guix git repo URL."
|
||||
(and-let* ((remotes (string-split (with-input-pipe-to-string
|
||||
"git" "remote" "-v")
|
||||
#\newline))
|
||||
(origin-entry (find (cut string-match
|
||||
%guix-git-repo-push-url-regexp
|
||||
<>)
|
||||
remotes)))
|
||||
(first (string-split origin-entry #\tab))))
|
||||
|
||||
(define (commit-already-pushed? remote commit)
|
||||
"True if COMMIT is found in the REMOTE repository."
|
||||
(not (string-null? (with-input-pipe-to-string
|
||||
"git" "branch" "-r" "--contains" commit
|
||||
(string-append remote "/master")))))
|
||||
|
||||
(define (keep-source-in-store store source)
|
||||
"Add SOURCE to the store under the name that the 'guix' package expects."
|
||||
|
||||
;; Add SOURCE to the store, but this time under the real name used in the
|
||||
;; 'origin'. This allows us to build the package without having to make a
|
||||
;; real checkout; thus, it also works when working on a private branch.
|
||||
(reload-module
|
||||
(resolve-module '(gnu packages package-management)))
|
||||
|
||||
(let* ((source (add-to-store store
|
||||
(origin-file-name (package-source guix))
|
||||
#t "sha256" source
|
||||
#:select? (git-predicate source)))
|
||||
(root (store-path-package-name source)))
|
||||
|
||||
;; Add an indirect GC root for SOURCE in the current directory.
|
||||
(false-if-exception (delete-file root))
|
||||
(symlink source root)
|
||||
(add-indirect-root store
|
||||
(string-append (getcwd) "/" root))
|
||||
|
||||
(info (G_ "source code kept in ~a (GC root: ~a)~%")
|
||||
source root)))
|
||||
|
||||
|
||||
(define (main . args)
|
||||
(match args
|
||||
((commit version)
|
||||
(with-directory-excursion %top-srcdir
|
||||
(or (getenv "GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT")
|
||||
(let ((remote (find-origin-remote)))
|
||||
(unless remote
|
||||
(leave (G_ "Failed to find the origin git remote.~%")))
|
||||
(commit-already-pushed? remote commit))
|
||||
(leave (G_ "Commit ~a is not pushed upstream. Aborting.~%") commit))
|
||||
(call-with-temporary-git-worktree commit
|
||||
(lambda (tmp-directory)
|
||||
(let* ((hash (nix-base32-string->bytevector
|
||||
(string-trim-both
|
||||
(with-output-to-string
|
||||
(lambda ()
|
||||
(guix-hash "-rx" tmp-directory))))))
|
||||
(location (package-definition-location))
|
||||
(old-hash (content-hash-value
|
||||
(origin-hash (package-source guix)))))
|
||||
(edit-expression location
|
||||
(update-definition commit hash
|
||||
#:old-hash old-hash
|
||||
#:version version))
|
||||
;; When GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT is set, the sources are
|
||||
;; added to the store. This is used as part of 'make release'.
|
||||
(when (getenv "GUIX_ALLOW_ME_TO_USE_PRIVATE_COMMIT")
|
||||
(with-store store
|
||||
(keep-source-in-store store tmp-directory))))))))
|
||||
((commit)
|
||||
;; Automatically deduce the version and revision numbers.
|
||||
(main commit #f))))
|
||||
|
||||
(apply main (cdr (command-line)))
|
||||
@@ -1,90 +0,0 @@
|
||||
#! /bin/sh
|
||||
# -*-scheme-*-
|
||||
build_aux=$(dirname $0)
|
||||
srcdir=$build_aux/..
|
||||
export LC_ALL=en_US.UTF-8
|
||||
export TZ=UTC0
|
||||
exec guile --no-auto-compile -L $srcdir -C $srcdir -e main -s "$0" "$@"
|
||||
!#
|
||||
|
||||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
;;; This program is free software; you can redistribute it and/or modify it
|
||||
;;; under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||
;;; your option) any later version.
|
||||
;;;
|
||||
;;; This program is distributed in the hope that it will be useful, but
|
||||
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;;; Commentary:
|
||||
;;;
|
||||
;;; This script provides an xgettext wrapper to (re)set POT-Creation-Date from
|
||||
;;; a Git timestamp. Test doing something like:
|
||||
;;;
|
||||
;;; build-aux/xgettext.scm --files-from=po/guix/POTFILES.in --default-domain=test
|
||||
;;;
|
||||
;;;; Code:
|
||||
|
||||
(use-modules (srfi srfi-1)
|
||||
(srfi srfi-26)
|
||||
(ice-9 curried-definitions)
|
||||
(ice-9 match)
|
||||
(ice-9 popen)
|
||||
(ice-9 rdelim)
|
||||
(guix build utils))
|
||||
|
||||
(define ((option? name) option)
|
||||
(string-prefix? name option))
|
||||
|
||||
(define (get-option args name)
|
||||
(let ((option (find (option? name) args)))
|
||||
(and option
|
||||
(substring option (string-length name)))))
|
||||
|
||||
(define (pipe-command command)
|
||||
(let* ((port (apply open-pipe* OPEN_READ command))
|
||||
(output (read-string port)))
|
||||
(close-port port)
|
||||
output))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Entry point.
|
||||
;;;
|
||||
(define (main args)
|
||||
(fluid-set! %default-port-encoding #f)
|
||||
(let* ((files-from (get-option args "--files-from="))
|
||||
(default-domain (get-option args "--default-domain="))
|
||||
(directory (or (get-option args "--directory=") "."))
|
||||
(xgettext (or (get-option args "--xgettext=") "xgettext"))
|
||||
(xgettext-args (filter (negate (option? "--xgettext=")) args))
|
||||
(command (match xgettext-args
|
||||
((xgettext.scm args ...)
|
||||
`(,xgettext ,@args))))
|
||||
(result (apply system* command))
|
||||
(status (/ result 256)))
|
||||
(if (or (not (zero? status))
|
||||
(not files-from))
|
||||
(exit status)
|
||||
(let* ((text (with-input-from-file files-from read-string))
|
||||
(lines (string-split text #\newline))
|
||||
(files (filter (negate (cute string-prefix? "#" <>)) lines))
|
||||
(files (map (cute string-append directory "/" <>) files))
|
||||
(git-command `("git" "log" "--pretty=format:%ci" "-n1" ,@files))
|
||||
(timestamp (pipe-command git-command))
|
||||
(source-date-epoch (or (getenv "SOURCE_DATE_EPOCH") "1"))
|
||||
(timestamp (if (string-null? timestamp) source-date-epoch
|
||||
timestamp))
|
||||
(po-file (string-append default-domain ".po")))
|
||||
(substitute* po-file
|
||||
(("(\"POT-Creation-Date: )[^\\]*" all header)
|
||||
(string-append header timestamp)))))))
|
||||
129
config-daemon.ac
129
config-daemon.ac
@@ -5,7 +5,6 @@ AC_MSG_RESULT([$guix_build_daemon])
|
||||
|
||||
dnl C++ environment. This macro must be used unconditionnaly.
|
||||
AC_PROG_CXX
|
||||
AM_PROG_AR
|
||||
AC_LANG([C++])
|
||||
|
||||
if test "x$guix_build_daemon" = "xyes"; then
|
||||
@@ -13,58 +12,57 @@ if test "x$guix_build_daemon" = "xyes"; then
|
||||
GUIX_ASSERT_CXX11
|
||||
|
||||
AC_PROG_RANLIB
|
||||
AC_CONFIG_HEADERS([nix/config.h])
|
||||
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 zlib, a required dependency.
|
||||
AC_CHECK_LIB([z], [gzdopen], [true],
|
||||
[AC_MSG_ERROR([Guix requires zlib. See http://www.zlib.net/.])])
|
||||
AC_CHECK_HEADERS([zlib.h], [true],
|
||||
[AC_MSG_ERROR([Guix requires zlib. See http://www.zlib.net/.])])
|
||||
|
||||
dnl Look for libbz2, an optional dependency.
|
||||
AC_CHECK_LIB([bz2], [BZ2_bzWriteOpen], [HAVE_LIBBZ2=yes], [HAVE_LIBBZ2=no])
|
||||
if test "x$HAVE_LIBBZ2" = xyes; then
|
||||
AC_CHECK_HEADERS([bzlib.h])
|
||||
HAVE_LIBBZ2="$ac_cv_header_bzlib_h"
|
||||
fi
|
||||
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_CPPFLAGS=""
|
||||
LIBGCRYPT_CFLAGS=""
|
||||
;;
|
||||
*)
|
||||
LIBGCRYPT_CPPFLAGS="-I$LIBGCRYPT_PREFIX/include"
|
||||
LIBGCRYPT_CFLAGS="-I$LIBGCRYPT_PREFIX/include"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$LIBGCRYPT_LIBDIR" in
|
||||
no | "")
|
||||
no)
|
||||
LIBGCRYPT_LIBS="-lgcrypt"
|
||||
;;
|
||||
*)
|
||||
LIBGCRYPT_LDFLAGS="-L$LIBGCRYPT_LIBDIR"
|
||||
LIBGCRYPT_LIBS="-L$LIBGCRYPT_LIBDIR -lgcrypt"
|
||||
;;
|
||||
esac
|
||||
|
||||
LIBGCRYPT_LIBS="-lgcrypt"
|
||||
AC_SUBST([LIBGCRYPT_CPPFLAGS])
|
||||
AC_SUBST([LIBGCRYPT_LDFLAGS])
|
||||
AC_SUBST([LIBGCRYPT_CFLAGS])
|
||||
AC_SUBST([LIBGCRYPT_LIBS])
|
||||
|
||||
save_CPPFLAGS="$CPPFLAGS"
|
||||
save_CFLAGS="$CFLAGS"
|
||||
save_LDFLAGS="$LDFLAGS"
|
||||
save_LIBS="$LIBS"
|
||||
CPPFLAGS="$CPPFLAGS $LIBGCRYPT_CPPFLAGS"
|
||||
CFLAGS="$CFLAGS $LIBGCRYPT_CFLAGS"
|
||||
LDFLAGS="$LDFLAGS $LIBGCRYPT_LDFLAGS"
|
||||
LIBS="$LIBS $LIBGCRYPT_LIBS"
|
||||
|
||||
have_gcrypt=yes
|
||||
AC_CHECK_LIB([gcrypt], [gcry_md_open], [:], [have_gcrypt=no])
|
||||
@@ -72,14 +70,13 @@ if test "x$guix_build_daemon" = "xyes"; then
|
||||
if test "x$have_gcrypt" != "xyes"; then
|
||||
AC_MSG_ERROR([GNU libgcrypt not found; please install it.])
|
||||
fi
|
||||
CPPFLAGS="$save_CPPFLAGS"
|
||||
|
||||
CFLAGS="$save_CFLAGS"
|
||||
LDFLAGS="$save_LDFLAGS"
|
||||
LIBS="$save_LIBS"
|
||||
|
||||
dnl Chroot support.
|
||||
AC_CHECK_FUNCS([chroot unshare])
|
||||
AC_CHECK_HEADERS([sched.h sys/param.h sys/mount.h sys/syscall.h \
|
||||
linux/close_range.h sys/prctl.h])
|
||||
AC_CHECK_HEADERS([sched.h sys/param.h sys/mount.h sys/syscall.h])
|
||||
|
||||
if test "x$ac_cv_func_chroot" != "xyes"; then
|
||||
AC_MSG_ERROR(['chroot' function missing, bailing out])
|
||||
@@ -94,9 +91,19 @@ if test "x$guix_build_daemon" = "xyes"; then
|
||||
dnl sched_setaffinity: to improve RPC locality.
|
||||
dnl statvfs: to detect disk-full conditions.
|
||||
dnl strsignal: for error reporting.
|
||||
dnl statx: fine-grain 'stat' call, new in glibc 2.28.
|
||||
AC_CHECK_FUNCS([lutimes lchown posix_fallocate sched_setaffinity \
|
||||
statvfs nanosleep strsignal statx close_range])
|
||||
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++)
|
||||
@@ -108,57 +115,35 @@ if test "x$guix_build_daemon" = "xyes"; then
|
||||
dnl to do i686-linux builds on x86_64-linux machines.
|
||||
AC_CHECK_HEADERS([sys/personality.h])
|
||||
|
||||
dnl Determine the appropriate default list of substitute URLs (GnuTLS
|
||||
dnl is required so we can default to 'https'.)
|
||||
GUIX_SUBSTITUTE_URLS="https://bordeaux.guix.gnu.org https://ci.guix.gnu.org"
|
||||
dnl Check for <linux/fs.h> (for immutable file support).
|
||||
AC_CHECK_HEADERS([linux/fs.h])
|
||||
|
||||
AC_MSG_CHECKING([for default substitute URLs])
|
||||
AC_MSG_RESULT([$GUIX_SUBSTITUTE_URLS])
|
||||
AC_SUBST([GUIX_SUBSTITUTE_URLS])
|
||||
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"
|
||||
|
||||
AC_DEFINE_UNQUOTED([GUIX_SUBSTITUTE_URLS], ["$GUIX_SUBSTITUTE_URLS"],
|
||||
[Default list of substitute URLs used by 'guix-daemon'.])
|
||||
|
||||
dnl Check for Guile-SSH, which is required by 'guix offload'.
|
||||
GUIX_CHECK_GUILE_SSH
|
||||
|
||||
case "x$guix_cv_have_recent_guile_ssh" in
|
||||
xyes)
|
||||
guix_build_daemon_offload="yes"
|
||||
AC_DEFINE([HAVE_DAEMON_OFFLOAD_HOOK], [1],
|
||||
[Define if the daemon's 'offload' build hook is being built (requires Guile-SSH).])
|
||||
;;
|
||||
*)
|
||||
guix_build_daemon_offload="no"
|
||||
;;
|
||||
esac
|
||||
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])
|
||||
|
||||
GUIX_CHECK_LOCALSTATEDIR
|
||||
|
||||
case "x$host_os" in
|
||||
x*linux*)
|
||||
AC_CHECK_PROG([have_slirp4netns], [slirp4netns], [yes])
|
||||
if test "x$have_slirp4netns" != "xyes"
|
||||
then
|
||||
AC_MSG_WARN([Slirp4netns not found; fixed-output chroot builds won't work without it.])
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
AC_PATH_PROG([SLIRP4NETNS], [slirp4netns], [slirp4netns])
|
||||
AC_DEFINE_UNQUOTED([SLIRP4NETNS], ["$SLIRP4NETNS"],
|
||||
[Path to the slirp4netns program, if any.])
|
||||
|
||||
dnl needed for inspecting 64-bit system call arguments in seccomp's Berkeley
|
||||
dnl Packet Filter VM, which only directly operates on 32-bit words.
|
||||
AC_C_BIGENDIAN
|
||||
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([HAVE_LIBBZ2], [test "x$HAVE_LIBBZ2" = "xyes"])
|
||||
AM_CONDITIONAL([BUILD_DAEMON], [test "x$guix_build_daemon" = "xyes"])
|
||||
AM_CONDITIONAL([BUILD_DAEMON_OFFLOAD], \
|
||||
[test "x$guix_build_daemon" = "xyes" \
|
||||
|
||||
319
configure.ac
319
configure.ac
@@ -1,31 +1,12 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
#
|
||||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2012-2021, 2022-2023, 2025 Ludovic Courtès <ludo@gnu.org>
|
||||
# Copyright © 2013, 2016 Mark H Weaver <mhw@netris.org>
|
||||
# Copyright © 2014-2016 Alex Kost <alezost@gmail.com>
|
||||
# Copyright © 2014-2016 David Thompson <davet@gnu.org>
|
||||
# Copyright © 2015-2016, 2018 Mathieu Lirzin <mthl@gnu.org>
|
||||
# Copyright © 2015-2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||
# Copyright © 2016 Eric Le Bihan <eric.le.bihan.dev@free.fr>
|
||||
# Copyright © 2016, 2018, 2020, 2022 Ricardo Wurmus <rekado@elephly.net>
|
||||
# Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
|
||||
# Copyright © 2018 nikita <nikita@n0.is>
|
||||
# Copyright © 2018, 2021 Julien Lepiller <julien@lepiller.eu>
|
||||
# Copyright © 2017-2018 Eric Bavier <bavier@posteo.net>
|
||||
# Copyright © 2020-2021, 2023-204 Maxim Cournoyer <maxim@guixotic.coop>
|
||||
# Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||
# Copyright © 2024 gemmaro <gemmaro.dev@gmail.com>
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([GNU Guix],
|
||||
[m4_esyscmd([build-aux/git-version-gen .tarball-version])],
|
||||
[https://codeberg.org/guix/guix/issues/], [guix],
|
||||
[https://www.gnu.org/software/guix/])
|
||||
AC_PREREQ(2.68)
|
||||
AC_INIT([GNU Guix], [0.9.0], [bug-guix@gnu.org], [guix],
|
||||
[http://www.gnu.org/software/guix/])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
|
||||
AM_INIT_AUTOMAKE([1.14 gnu tar-ustar silent-rules subdir-objects \
|
||||
AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects \
|
||||
color-tests parallel-tests -Woverride -Wno-portability])
|
||||
|
||||
# Enable silent rules by default.
|
||||
@@ -38,213 +19,120 @@ dnl For the C++ code. This must be used early.
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
AM_GNU_GETTEXT([external])
|
||||
AM_GNU_GETTEXT_VERSION([0.19.1])
|
||||
AM_GNU_GETTEXT_VERSION([0.18.1])
|
||||
|
||||
guilemoduledir="${datarootdir}/guile/site/2.0"
|
||||
AC_SUBST([guilemoduledir])
|
||||
|
||||
GUIX_SYSTEM_TYPE
|
||||
GUIX_ASSERT_SUPPORTED_SYSTEM
|
||||
GUIX_CHANNEL_METADATA
|
||||
|
||||
AM_CONDITIONAL([CROSS_COMPILING], [test "x$cross_compiling" = "xyes"])
|
||||
|
||||
AC_ARG_WITH(store-dir,
|
||||
AS_HELP_STRING([--with-store-dir=PATH],
|
||||
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],
|
||||
AS_HELP_STRING([--with-bash-completion-dir=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])
|
||||
|
||||
AC_ARG_WITH([zsh-completion-dir],
|
||||
AS_HELP_STRING([--with-zsh-completion-dir=DIR],
|
||||
[name of the Zsh completion directory]),
|
||||
[zshcompletiondir="$withval"],
|
||||
[zshcompletiondir='${datadir}/zsh/site-functions'])
|
||||
AC_SUBST([zshcompletiondir])
|
||||
|
||||
AC_ARG_WITH([fish-completion-dir],
|
||||
AS_HELP_STRING([--with-fish-completion-dir=DIR],
|
||||
[name of the Fish completion directory]),
|
||||
[fishcompletiondir="$withval"],
|
||||
[fishcompletiondir='${datadir}/fish/vendor_completions.d'])
|
||||
AC_SUBST([fishcompletiondir])
|
||||
|
||||
AC_ARG_WITH([selinux-policy-dir],
|
||||
AS_HELP_STRING([--with-selinux-policy-dir=DIR],
|
||||
[name of the SELinux policy directory]),
|
||||
[selinux_policydir="$withval"],
|
||||
[selinux_policydir='${datadir}/selinux/'])
|
||||
AC_SUBST([selinux_policydir])
|
||||
|
||||
AC_ARG_WITH([apparmor-profile-dir],
|
||||
AS_HELP_STRING([--with-apparmor-profile-dir=DIR],
|
||||
[name of the AppArmor profile directory]),
|
||||
[apparmor_profiledir="$withval"],
|
||||
[apparmor_profiledir='${sysconfdir}/apparmor.d'])
|
||||
AC_SUBST([apparmor_profiledir])
|
||||
apparmor_profile_tunablesdir='${apparmor_profiledir}/tunables'
|
||||
AC_SUBST([apparmor_profile_tunablesdir])
|
||||
|
||||
dnl Better be verbose.
|
||||
AC_MSG_CHECKING([for the store directory])
|
||||
AC_MSG_RESULT([$storedir])
|
||||
|
||||
AC_ARG_ENABLE([daemon],
|
||||
[AS_HELP_STRING([--disable-daemon], [do not build the Nix daemon (C++)])],
|
||||
[AS_HELP_STRING([--disable-daemon], [build the Nix daemon (C++)])],
|
||||
[guix_build_daemon="$enableval"],
|
||||
[guix_build_daemon="yes"])
|
||||
|
||||
dnl Prepare a version of $localstatedir & co. that does not contain references
|
||||
dnl to shell variables. Also set some sane default directory variables for
|
||||
dnl use with the Guix. This also causes localstatedir to be /var and
|
||||
dnl sysconfdir to be /etc.
|
||||
AC_PREFIX_DEFAULT()
|
||||
guix_prefix="`eval echo $prefix | sed -e"s|NONE|$ac_default_prefix|g"`"
|
||||
# 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([can_run_tests])
|
||||
AM_CONDITIONAL([CAN_RUN_TESTS], [test "x$can_run_tests" = "xyes"])
|
||||
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])
|
||||
m4_pattern_forbid([^GUILE_P])
|
||||
m4_pattern_allow([^GUILE_PKG_ERRORS])
|
||||
m4_pattern_forbid([^GUIX_])
|
||||
|
||||
dnl Search for 'guile' and 'guild'. This macro defines
|
||||
dnl 'GUILE_EFFECTIVE_VERSION'.
|
||||
GUILE_PKG([3.0])
|
||||
GUILE_PROGS
|
||||
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 installation.])
|
||||
AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.])
|
||||
fi
|
||||
|
||||
dnl (guix ui), notably, requires 'default-optimization-level' added in 3.0.3.
|
||||
dnl (guix serialization) requires 'bytevector-slice' added in 3.0.9.
|
||||
PKG_CHECK_MODULES([GUILE], [guile-3.0 >= 3.0.9])
|
||||
|
||||
dnl Get CFLAGS and LDFLAGS for libguile.
|
||||
GUILE_FLAGS
|
||||
|
||||
dnl Installation directories for .scm and .go files.
|
||||
guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION"
|
||||
guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache"
|
||||
AC_SUBST([guilemoduledir])
|
||||
AC_SUBST([guileobjectdir])
|
||||
|
||||
dnl The GnuTLS bindings are necessary for substitutes over HTTPS and for 'guix
|
||||
dnl pull', among other things.
|
||||
GUILE_MODULE_AVAILABLE([have_gnutls], [(gnutls)])
|
||||
if test "x$have_gnutls" != "xyes"; then
|
||||
AC_MSG_ERROR([The Guile bindings of GnuTLS are missing; please install them.])
|
||||
fi
|
||||
|
||||
dnl Check for Guile-Git.
|
||||
GUILE_MODULE_AVAILABLE([have_guile_git], [(git)])
|
||||
if test "x$have_guile_git" != "xyes"; then
|
||||
AC_MSG_ERROR([Guile-Git is missing; please install it.])
|
||||
fi
|
||||
|
||||
dnl Check Guile-Git version resp. required recently added symbol.
|
||||
GUILE_MODULE_REQUIRED_EXPORT([(git)], [graph-descendant?])
|
||||
|
||||
dnl Check for Guile-JSON.
|
||||
GUIX_CHECK_GUILE_JSON
|
||||
if test "x$guix_cv_have_recent_guile_json" != "xyes"; then
|
||||
AC_MSG_ERROR([Guile-JSON is missing; please install it.])
|
||||
fi
|
||||
|
||||
dnl Guile-Sqlite3 is used by the (guix store ...) modules.
|
||||
GUIX_CHECK_GUILE_SQLITE3
|
||||
if test "x$guix_cv_have_recent_guile_sqlite3" != "xyes"; then
|
||||
AC_MSG_ERROR([A recent Guile-SQLite3 could not be found; please install it.])
|
||||
fi
|
||||
|
||||
GUIX_CHECK_GUILE_GCRYPT
|
||||
if test "x$guix_cv_have_recent_guile_gcrypt" != "xyes"; then
|
||||
AC_MSG_ERROR([A recent Guile-Gcrypt could not be found; please install it.])
|
||||
fi
|
||||
|
||||
GUIX_CHECK_GUILE_GIT
|
||||
if test "x$guix_cv_have_recent_guile_git" != "xyes"; then
|
||||
AC_MSG_ERROR([A recent Guile-Git could not be found; please install it.])
|
||||
fi
|
||||
|
||||
dnl Check for the optional Guile-Lib.
|
||||
GUILE_MODULE_EXPORTS([have_guile_lib], [(htmlprag)], [%strict-tokenizer?])
|
||||
AM_CONDITIONAL([HAVE_GUILE_LIB], [test "x$have_guile_lib" = "xyes"])
|
||||
AM_COND_IF(HAVE_GUILE_LIB,,
|
||||
[AC_MSG_WARN([The Guile-Lib requirement was not satisfied (>= 0.2.7);
|
||||
Some features such as the Go importer will not be usable.])])
|
||||
|
||||
dnl Check for Guile-zlib.
|
||||
GUIX_CHECK_GUILE_ZLIB
|
||||
if test "x$guix_cv_have_recent_guile_zlib" != "xyes"; then
|
||||
AC_MSG_ERROR([A recent Guile-zlib could not be found; please install it.])
|
||||
fi
|
||||
|
||||
dnl Check for Guile-lzlib.
|
||||
GUILE_MODULE_AVAILABLE([have_guile_lzlib], [(lzlib)])
|
||||
if test "x$have_guile_lzlib" != "xyes"; then
|
||||
AC_MSG_ERROR([Guile-lzlib is missing; please install it.])
|
||||
fi
|
||||
|
||||
dnl Check for Guile-semver.
|
||||
GUILE_MODULE_AVAILABLE([have_guile_semver], [(semver)])
|
||||
if test "x$have_guile_semver" != "xyes"; then
|
||||
AC_MSG_ERROR([Guile-semver is missing; please install it.])
|
||||
fi
|
||||
|
||||
dnl Check for Guile-Avahi.
|
||||
GUILE_MODULE_AVAILABLE([have_guile_avahi], [(avahi)])
|
||||
AM_CONDITIONAL([HAVE_GUILE_AVAHI],
|
||||
[test "x$have_guile_avahi" = "xyes"])
|
||||
|
||||
dnl Guile-newt is used by the graphical installer.
|
||||
GUILE_MODULE_AVAILABLE([have_guile_newt], [(newt)])
|
||||
|
||||
AC_ARG_ENABLE([installer],
|
||||
AS_HELP_STRING([--enable-installer], [Build the graphical installer sources.]))
|
||||
|
||||
AS_IF([test "x$enable_installer" = "xyes"], [
|
||||
if test "x$have_guile_newt" != "xyes"; then
|
||||
AC_MSG_ERROR([Guile-newt could not be found; please install it.])
|
||||
fi
|
||||
])
|
||||
|
||||
AM_CONDITIONAL([ENABLE_INSTALLER],
|
||||
[test "x$enable_installer" = "xyes"])
|
||||
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])
|
||||
|
||||
AC_PROG_SED
|
||||
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])
|
||||
|
||||
dnl Decompressors, for use by the substituter and other modules.
|
||||
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 Check whether (guix build syscalls) can be built.
|
||||
GUIX_CHECK_LIBC_MOUNT
|
||||
AM_CONDITIONAL([BUILD_SYSCALLS_MODULE],
|
||||
[test "x$guix_cv_libc_has_mount" = "xyes"])
|
||||
|
||||
dnl Git is now required for the "builtin:git-download" derivation builder.
|
||||
AC_PATH_PROG([GIT], [git])
|
||||
if test "x$GIT" = "x"; then
|
||||
AC_MSG_ERROR([Git is missing; please install it.])
|
||||
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
|
||||
AC_SUBST([GIT])
|
||||
|
||||
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
|
||||
|
||||
LIBGCRYPT="libgcrypt"
|
||||
LIBGCRYPT_LIBDIR="no"
|
||||
LIBGCRYPT_PREFIX="no"
|
||||
|
||||
@@ -254,6 +142,7 @@ AC_ARG_WITH([libgcrypt-prefix],
|
||||
yes|no)
|
||||
;;
|
||||
*)
|
||||
LIBGCRYPT="$withval/lib/libgcrypt"
|
||||
LIBGCRYPT_PREFIX="$withval"
|
||||
LIBGCRYPT_LIBDIR="$withval/lib"
|
||||
;;
|
||||
@@ -264,28 +153,37 @@ AC_ARG_WITH([libgcrypt-libdir],
|
||||
[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])
|
||||
|
||||
dnl If none of the --with-libgcrypt-* options was used, try to determine the
|
||||
dnl the library directory.
|
||||
dnl absolute file name of libgcrypt.so.
|
||||
case "x$LIBGCRYPT_PREFIX$LIBGCRYPT_LIBDIR" in
|
||||
xnono)
|
||||
GUIX_LIBGCRYPT_LIBDIR([LIBGCRYPT_LIBDIR])
|
||||
if test "x$LIBGCRYPT_LIBDIR" != x; then
|
||||
LIBGCRYPT="$LIBGCRYPT_LIBDIR/libgcrypt"
|
||||
else
|
||||
dnl 'config-daemon.ac' expects "no" in this case.
|
||||
LIBGCRYPT_LIBDIR="no"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
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])
|
||||
|
||||
dnl Check for Guile-SSH, for the (guix ssh) module.
|
||||
GUIX_CHECK_GUILE_SSH
|
||||
AM_CONDITIONAL([HAVE_GUILE_SSH],
|
||||
[test "x$guix_cv_have_recent_guile_ssh" = "xyes"])
|
||||
GUIX_ASSERT_LIBGCRYPT_USABLE
|
||||
|
||||
AC_CACHE_SAVE
|
||||
|
||||
@@ -298,38 +196,23 @@ AM_MISSING_PROG([DOT], [dot])
|
||||
dnl Manual pages.
|
||||
AM_MISSING_PROG([HELP2MAN], [help2man])
|
||||
|
||||
dnl Documentation translation.
|
||||
AM_MISSING_PROG([PO4A], [po4a])
|
||||
|
||||
AC_MSG_CHECKING([if building from git])
|
||||
if test -e .git; then
|
||||
in_git_p=yes
|
||||
else
|
||||
in_git_p=no
|
||||
fi
|
||||
AC_MSG_RESULT([$in_git_p])
|
||||
AM_CONDITIONAL([in_git_p],
|
||||
[test "x$in_git_p" = "xyes"])
|
||||
|
||||
case "$storedir" in
|
||||
/gnu/store)
|
||||
;;
|
||||
*)
|
||||
AC_MSG_WARN([Using a store directory other than '/gnu/store' will prevent you])
|
||||
AC_MSG_WARN([from downloading substitutes from gnu.org.])
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_CONFIG_FILES([Makefile
|
||||
po/guix/Makefile.in
|
||||
po/packages/Makefile.in
|
||||
etc/guix-daemon.cil
|
||||
etc/apparmor.d/tunables/guix
|
||||
guix/config.scm])
|
||||
guix/config.scm])
|
||||
|
||||
AC_CONFIG_FILES([etc/committer.scm], [chmod +x etc/committer.scm])
|
||||
AC_CONFIG_FILES([test-env:build-aux/test-env.in], [chmod +x test-env])
|
||||
AC_CONFIG_FILES([pre-inst-env:build-aux/pre-inst-env.in],
|
||||
[chmod +x pre-inst-env])
|
||||
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.
|
||||
AC_PATH_PROG([DOT_USER_PROGRAM], [dot], [dot])
|
||||
AM_PATH_LISPDIR
|
||||
AM_CONDITIONAL([HAVE_EMACS], [test "x$EMACS" != "xno"])
|
||||
|
||||
emacsuidir="${guilemoduledir}/guix/emacs"
|
||||
AC_SUBST([emacsuidir])
|
||||
AC_CONFIG_FILES([emacs/guix-config.el
|
||||
emacs/guix-helper.scm])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
210
daemon.am
Normal file
210
daemon.am
Normal file
@@ -0,0 +1,210 @@
|
||||
# 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) etc/guix-daemon.service
|
||||
|
||||
noinst_LIBRARIES = libformat.a libutil.a libstore.a
|
||||
|
||||
# Use '-std=c++11' for 'std::shared_ptr', 'auto', lambdas, and more.
|
||||
AM_CXXFLAGS = -Wall -std=c++11
|
||||
|
||||
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/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\"" \
|
||||
-DDEFAULT_CHROOT_DIRS="\"\""
|
||||
|
||||
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 = \
|
||||
-DLOCALEDIR=\"$(localedir)\" \
|
||||
$(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
|
||||
|
||||
# The '.service' file for systemd.
|
||||
systemdservicedir = $(libdir)/systemd/system
|
||||
nodist_systemdservice_DATA = etc/guix-daemon.service
|
||||
|
||||
etc/guix-daemon.service: etc/guix-daemon.service.in \
|
||||
$(top_builddir)/config.status
|
||||
$(MKDIR_P) "`dirname "$@"`"
|
||||
$(SED) -e 's|@''bindir''@|$(bindir)|' < \
|
||||
"$(srcdir)/etc/guix-daemon.service.in" > "$@.tmp"
|
||||
mv "$@.tmp" "$@"
|
||||
|
||||
EXTRA_DIST += \
|
||||
nix/libstore/schema.sql \
|
||||
nix/AUTHORS \
|
||||
nix/COPYING \
|
||||
etc/guix-daemon.service.in
|
||||
|
||||
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)"
|
||||
143
doc.am
Normal file
143
doc.am
Normal file
@@ -0,0 +1,143 @@
|
||||
# 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
|
||||
|
||||
DOT_FILES = \
|
||||
doc/images/bootstrap-graph.dot \
|
||||
doc/images/coreutils-graph.dot \
|
||||
doc/images/coreutils-bag-graph.dot \
|
||||
doc/images/service-graph.dot \
|
||||
doc/images/dmd-graph.dot
|
||||
|
||||
DOT_VECTOR_GRAPHICS = \
|
||||
$(DOT_FILES:%.dot=%.eps) \
|
||||
$(DOT_FILES:%.dot=%.pdf)
|
||||
|
||||
EXTRA_DIST += \
|
||||
doc/contributing.texi \
|
||||
doc/emacs.texi \
|
||||
doc/fdl-1.3.texi \
|
||||
$(DOT_FILES) \
|
||||
$(DOT_VECTOR_GRAPHICS) \
|
||||
doc/images/coreutils-size-map.eps \
|
||||
doc/environment-gdb.scm \
|
||||
doc/package-hello.scm
|
||||
|
||||
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 = \
|
||||
$(DOT_FILES:%.dot=%.png) \
|
||||
doc/images/coreutils-size-map.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" "$@"
|
||||
|
||||
.png.eps:
|
||||
convert "$<" "$@-tmp.eps"
|
||||
mv "$@-tmp.eps" "$@"
|
||||
|
||||
# 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: $(DOT_FILES=%.dot=$(top_srcdir)/%.pdf)
|
||||
info-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.png)
|
||||
ps-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.eps) \
|
||||
$(top_srcdir)/doc/images/coreutils-size-map.eps
|
||||
dvi-local: ps-local
|
||||
|
||||
|
||||
# Manual pages.
|
||||
|
||||
doc/guix.1: $(SUBCOMMANDS:%=guix/scripts/%.scm)
|
||||
-LANGUAGE= $(top_builddir)/pre-inst-env \
|
||||
$(HELP2MAN) --output="$@" guix
|
||||
|
||||
# Note: Do not depend on 'guix-daemon' since that would trigger a rebuild even
|
||||
# for people building from a tarball.
|
||||
doc/guix-daemon.1: nix/nix-daemon/guix-daemon.cc
|
||||
-LANGUAGE= $(top_builddir)/pre-inst-env \
|
||||
$(HELP2MAN) --output="$@" guix-daemon
|
||||
|
||||
define subcommand-manual-target
|
||||
|
||||
doc/guix-$(1).1: guix/scripts/$(1).scm
|
||||
-LANGUAGE= $(top_builddir)/pre-inst-env \
|
||||
$(HELP2MAN) --output="$$@" "guix $(1)"
|
||||
|
||||
endef
|
||||
|
||||
SUBCOMMANDS := \
|
||||
archive \
|
||||
build \
|
||||
challenge \
|
||||
download \
|
||||
edit \
|
||||
environment \
|
||||
gc \
|
||||
hash \
|
||||
import \
|
||||
lint \
|
||||
package \
|
||||
publish \
|
||||
pull \
|
||||
refresh \
|
||||
size \
|
||||
system
|
||||
|
||||
$(eval $(foreach subcommand,$(SUBCOMMANDS), \
|
||||
$(call subcommand-manual-target,$(subcommand))))
|
||||
|
||||
dist_man1_MANS = \
|
||||
doc/guix.1 \
|
||||
$(SUBCOMMANDS:%=doc/guix-%.1)
|
||||
|
||||
if BUILD_DAEMON
|
||||
|
||||
dist_man1_MANS += \
|
||||
doc/guix-daemon.1
|
||||
|
||||
endif
|
||||
1539
doc/build.scm
1539
doc/build.scm
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
739
doc/emacs.texi
Normal file
739
doc/emacs.texi
Normal file
@@ -0,0 +1,739 @@
|
||||
@node Emacs Interface
|
||||
@chapter Emacs Interface
|
||||
|
||||
@cindex Emacs
|
||||
GNU Guix comes with several useful modules (known as ``guix.el'') for
|
||||
GNU@tie{}Emacs which are intended to make an Emacs user interaction with
|
||||
Guix convenient and fun.
|
||||
|
||||
@menu
|
||||
* Initial Setup: Emacs Initial Setup. Preparing @file{~/.emacs}.
|
||||
* Package Management: Emacs Package Management. Managing packages and generations.
|
||||
* Popup Interface: Emacs Popup Interface. Magit-like interface for guix commands.
|
||||
* Prettify Mode: Emacs Prettify. Abbreviating @file{/gnu/store/@dots{}} file names.
|
||||
* Build Log Mode: Emacs Build Log. Highlighting Guix build logs.
|
||||
* Completions: Emacs Completions. Completing @command{guix} shell command.
|
||||
* Development: Emacs Development. Tools for Guix developers.
|
||||
@end menu
|
||||
|
||||
|
||||
@node Emacs Initial Setup
|
||||
@section 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 GuixSD, 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.
|
||||
|
||||
@item
|
||||
@uref{https://github.com/magit/magit/, magit-popup library}. You
|
||||
already have this library if you use Magit 2.1.0 or later. This library
|
||||
is an optional dependency---it is required only for @kbd{M-x@tie{}guix}
|
||||
command (@pxref{Emacs Popup Interface}).
|
||||
|
||||
@end itemize
|
||||
|
||||
When it is done ``guix.el'' may be configured by requiring a special
|
||||
@code{guix-init} file---i.e., by adding the following code into your
|
||||
init file (@pxref{Init File,,, emacs, The GNU Emacs Manual}):
|
||||
|
||||
@example
|
||||
(add-to-list 'load-path "/path/to/directory-with-guix.el")
|
||||
(require 'guix-init nil t)
|
||||
@end example
|
||||
|
||||
So the only thing you need to figure out is where the directory with
|
||||
elisp files for Guix is placed. It depends on how you installed Guix:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
If it was installed by a package manager of your distribution or by a
|
||||
usual @code{./configure && make && make install} command sequence, then
|
||||
elisp files are placed in a standard directory with Emacs packages
|
||||
(usually it is @file{/usr/share/emacs/site-lisp/}), which is already in
|
||||
@code{load-path}, so there is no need to add that directory there.
|
||||
|
||||
@item
|
||||
If you used a binary installation method (@pxref{Binary Installation}),
|
||||
then Guix is installed somewhere in the store, so the elisp files are
|
||||
placed in @file{/gnu/store/@dots{}-guix-0.8.2/share/emacs/site-lisp/} or
|
||||
alike. However it is not recommended to refer directly to a store
|
||||
directory. Instead you can install Guix using Guix itself with
|
||||
@command{guix package -i guix} command (@pxref{Invoking guix package})
|
||||
and add @file{~/.guix-profile/share/emacs/site-lisp/} directory to
|
||||
@code{load-path} variable.
|
||||
|
||||
@item
|
||||
If you did not install Guix at all and prefer a hacking way
|
||||
(@pxref{Running Guix Before It Is Installed}), along with augmenting
|
||||
@code{load-path} you need to set @code{guix-load-path} variable to the
|
||||
same directory, so your final configuration will look like this:
|
||||
|
||||
@example
|
||||
(let ((dir "/path/to/your-guix-git-tree/emacs"))
|
||||
(add-to-list 'load-path dir)
|
||||
(setq guix-load-path dir))
|
||||
(require 'guix-init nil t)
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
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 Package Management
|
||||
@section Package Management
|
||||
|
||||
Once ``guix.el'' has been successfully configured, you should be able to
|
||||
use a visual interface for routine package management tasks, pretty much
|
||||
like the @command{guix package} command (@pxref{Invoking guix package}).
|
||||
Specifically, it 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
|
||||
* 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.
|
||||
* Configuration: Emacs Configuration. Configuring the interface.
|
||||
@end menu
|
||||
|
||||
@node Emacs Commands
|
||||
@subsection 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
|
||||
@subsection 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 M
|
||||
Apply manifest to the current profile or to a specified profile, if
|
||||
prefix argument is used. This has the same meaning as @code{--manifest}
|
||||
option (@pxref{Invoking guix package}).
|
||||
|
||||
@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
|
||||
@subsection ``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 (with prefix, 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 e
|
||||
Edit the definition of the curent package (go to its location). This is
|
||||
similar to @command{guix edit} command (@pxref{Invoking guix edit}), but
|
||||
for opening a package recipe in the current Emacs instance.
|
||||
@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
|
||||
@subsection ``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-root-map
|
||||
Parent keymap with general keys for all guix modes.
|
||||
|
||||
@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 Popup Interface
|
||||
@section Popup Interface
|
||||
|
||||
If you ever used Magit, you know what ``popup interface'' is
|
||||
(@pxref{Top,,, magit-popup, Magit-Popup User Manual}). Even if you are
|
||||
not acquainted with Magit, there should be no worries as it is very
|
||||
intuitive.
|
||||
|
||||
So @kbd{M-x@tie{}guix} command provides a top-level popup interface for
|
||||
all available guix commands. When you select an option, you'll be
|
||||
prompted for a value in the minibuffer. Many values have completions,
|
||||
so don't hesitate to press @key{TAB} key. Multiple values (for example,
|
||||
packages or lint checkers) should be separated by commas.
|
||||
|
||||
After specifying all options and switches for a command, you may choose
|
||||
one of the available actions. The following default actions are
|
||||
available for all commands:
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
Run the command in the Guix REPL. It is faster than running
|
||||
@code{guix@tie{}@dots{}} command directly in shell, as there is no
|
||||
need to run another guile process and to load required modules there.
|
||||
|
||||
@item
|
||||
Run the command in a shell buffer. You can set
|
||||
@code{guix-run-in-shell-function} variable to fine tune the shell buffer
|
||||
you want to use.
|
||||
|
||||
@item
|
||||
Add the command line to the kill ring (@pxref{Kill Ring,,, emacs, The
|
||||
GNU Emacs Manual}).
|
||||
|
||||
@end itemize
|
||||
|
||||
Several commands (@command{guix graph}, @command{guix system dmd-graph}
|
||||
and @command{guix system extension-graph}) also have a ``View graph''
|
||||
action, which allows you to view a generated graph using @command{dot}
|
||||
command (specified by @code{guix-dot-program} variable). By default a
|
||||
PNG file will be saved in @file{/tmp} directory and will be opened
|
||||
directly in Emacs. This behavior may be changed with the following
|
||||
variables:
|
||||
|
||||
@table @code
|
||||
|
||||
@item guix-find-file-function
|
||||
Function used to open a generated graph. If you want to open a graph in
|
||||
an external program, you can do it by modifying this variable---for
|
||||
example, you can use a functionality provided by the Org Mode
|
||||
(@pxref{Top,,, org, The Org Manual}):
|
||||
|
||||
@example
|
||||
(setq guix-find-file-function 'org-open-file)
|
||||
(add-to-list 'org-file-apps '("\\.png\\'" . "sxiv %s"))
|
||||
@end example
|
||||
|
||||
@item guix-dot-default-arguments
|
||||
Command line arguments to run @command{dot} command. If you change an
|
||||
output format (for example, into @code{-Tpdf}), you also need to change
|
||||
the next variable.
|
||||
|
||||
@item guix-dot-file-name-function
|
||||
Function used to define a name of the generated graph file. Default
|
||||
name is @file{/tmp/guix-emacs-graph-XXXXXX.png}.
|
||||
|
||||
@end table
|
||||
|
||||
So, for example, if you want to generate and open a PDF file in your
|
||||
Emacs, you may change the settings like this:
|
||||
|
||||
@example
|
||||
(defun my-guix-pdf-graph ()
|
||||
"/tmp/my-current-guix-graph.pdf")
|
||||
|
||||
(setq guix-dot-default-arguments '("-Tpdf")
|
||||
guix-dot-file-name-function 'my-guix-pdf-graph)
|
||||
@end example
|
||||
|
||||
|
||||
@node Emacs Prettify
|
||||
@section Guix Prettify Mode
|
||||
|
||||
GNU@tie{}Guix also 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
|
||||
|
||||
|
||||
@node Emacs Build Log
|
||||
@section Build Log Mode
|
||||
|
||||
GNU@tie{}Guix provides major and minor modes for highlighting build
|
||||
logs. So when you have a file with a package build output---for
|
||||
example, a file returned by @command{guix build --log-file @dots{}}
|
||||
command (@pxref{Invoking guix build}), you may call @kbd{M-x
|
||||
guix-build-log-mode} command in the buffer with this file. This major
|
||||
mode highlights some lines specific to build output and provides the
|
||||
following key bindings:
|
||||
|
||||
@table @kbd
|
||||
|
||||
@item M-n
|
||||
Move to the next build phase.
|
||||
|
||||
@item M-p
|
||||
Move to the previous build phase.
|
||||
|
||||
@item @key{TAB}
|
||||
Toggle (show/hide) the body of the current build phase.
|
||||
|
||||
@item S-@key{TAB}
|
||||
Toggle (show/hide) the bodies of all build phases.
|
||||
|
||||
@end table
|
||||
|
||||
There is also @kbd{M-x guix-build-log-minor-mode} which also provides
|
||||
the same highlighting (but not key bindings). And as it is a minor
|
||||
mode, it can be enabled in any buffer. For example, if you are building
|
||||
some package in a shell buffer (@pxref{Interactive Shell,,, emacs, The
|
||||
GNU Emacs Manual}), you may enable @command{guix-build-log-minor-mode}
|
||||
to make it more colorful. Guix build output is rather specific, so this
|
||||
new highlighting shouldn't conflict with the existing one.
|
||||
|
||||
|
||||
@node Emacs Completions
|
||||
@section Shell Completions
|
||||
|
||||
Another feature that becomes available after configuring Emacs interface
|
||||
(@pxref{Emacs Initial Setup}) is completing of @command{guix}
|
||||
subcommands, options, packages and other things in @code{shell}
|
||||
(@pxref{Interactive Shell,,, emacs, The GNU Emacs Manual}) and
|
||||
@code{eshell} (@pxref{Top,,, eshell, Eshell: The Emacs Shell}).
|
||||
|
||||
It works the same way as other completions do. Just press @key{TAB}
|
||||
when your intuition tells you.
|
||||
|
||||
And here are some examples, where pressing @key{TAB} may complete
|
||||
something:
|
||||
|
||||
@itemize @w{}
|
||||
|
||||
@item @code{guix pa}@key{TAB}
|
||||
@item @code{guix package -}@key{TAB}
|
||||
@item @code{guix package --}@key{TAB}
|
||||
@item @code{guix package -i gei}@key{TAB}
|
||||
@item @code{guix build -L/tm}@key{TAB}
|
||||
@item @code{guix build --sy}@key{TAB}
|
||||
@item @code{guix build --system=i}@key{TAB}
|
||||
@item @code{guix system rec}@key{TAB}
|
||||
@item @code{guix lint --checkers=sy}@key{TAB}
|
||||
@item @code{guix lint --checkers=synopsis,des}@key{TAB}
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
@node Emacs Development
|
||||
@section Development
|
||||
|
||||
By default, when you open a Scheme file, @code{guix-devel-mode} will be
|
||||
activated (if you don't want it, set @code{guix-devel-activate-mode} to
|
||||
nil). This minor mode provides the following key bindings:
|
||||
|
||||
@table @kbd
|
||||
|
||||
@item C-c . k
|
||||
Copy the name of the current Guile module into kill ring
|
||||
(@code{guix-devel-copy-module-as-kill}).
|
||||
|
||||
@item C-c . u
|
||||
Use the current Guile module. Often after opening a Scheme file, you
|
||||
want to use a module it defines, so you switch to the Geiser REPL and
|
||||
write @code{,use (some module)} there. You may just use this command
|
||||
instead (@code{guix-devel-use-module}).
|
||||
|
||||
@item C-c . b
|
||||
Build a package defined by the current variable definition. The
|
||||
building process is run in the current Geiser REPL. If you modified the
|
||||
current package definition, don't forget to reevaluate it before calling
|
||||
this command---for example, with @kbd{C-M-x} (@pxref{To eval or not to
|
||||
eval,,, geiser, Geiser User Manual})
|
||||
(@code{guix-devel-build-package-definition}).
|
||||
|
||||
@item C-c . s
|
||||
Build a source derivation of the package defined by the current variable
|
||||
definition. This command has the same meaning as @code{guix build -S}
|
||||
shell command (@pxref{Invoking guix build})
|
||||
(@code{guix-devel-build-package-source}).
|
||||
|
||||
@item C-c . l
|
||||
Lint (check) a package defined by the current variable definition
|
||||
(@pxref{Invoking guix lint}) (@code{guix-devel-lint-package}).
|
||||
|
||||
@end table
|
||||
|
||||
Unluckily, there is a limitation related to long-running REPL commands.
|
||||
When there is a running process in a Geiser REPL, you are not supposed
|
||||
to evaluate anything in a scheme buffer, because this will ``freeze''
|
||||
the REPL: it will stop producing any output (however, the evaluating
|
||||
process will continue---you will just not see any progress anymore). Be
|
||||
aware: even moving the point in a scheme buffer may ``break'' the REPL
|
||||
if Autodoc (@pxref{Autodoc and friends,,, geiser, Geiser User Manual})
|
||||
is enabled (which is the default).
|
||||
|
||||
So you have to postpone editing your scheme buffers until the running
|
||||
evaluation will be finished in the REPL.
|
||||
|
||||
Alternatively, to avoid this limitation, you may just run another Geiser
|
||||
REPL, and while something is being evaluated in the previous REPL, you
|
||||
can continue editing a scheme file with the help of the current one.
|
||||
@@ -6,7 +6,8 @@
|
||||
;; Augment the package definition of GDB with the build tools
|
||||
;; needed when developing GDB (and which are not needed when
|
||||
;; simply installing it.)
|
||||
(package
|
||||
(inherit gdb)
|
||||
(native-inputs (modify-inputs (package-native-inputs gdb)
|
||||
(prepend autoconf-2.69 automake texinfo))))
|
||||
(package (inherit gdb)
|
||||
(native-inputs `(("autoconf" ,autoconf-2.64)
|
||||
("automake" ,automake)
|
||||
("texinfo" ,texinfo)
|
||||
,@(package-native-inputs gdb))))
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
@display
|
||||
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
||||
@uref{https://fsf.org/}
|
||||
@uref{http://fsf.org/}
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
@@ -414,7 +414,7 @@ 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{https://www.gnu.org/copyleft/}.
|
||||
@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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
55862
doc/guix.texi
55862
doc/guix.texi
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
||||
(use-modules (gnu home)
|
||||
(gnu home services)
|
||||
(gnu home services shells)
|
||||
(gnu services)
|
||||
(gnu packages admin)
|
||||
(guix gexp))
|
||||
|
||||
|
||||
(home-environment
|
||||
(packages (list htop))
|
||||
(services
|
||||
(append (list
|
||||
(service home-bash-service-type
|
||||
(home-bash-configuration
|
||||
(guix-defaults? #t)
|
||||
(variables
|
||||
`(("HISTFILE" . "$XDG_CACHE_HOME/.bash_history")
|
||||
("HISTSIZE" . "50000")))))
|
||||
|
||||
(simple-service 'test-config
|
||||
home-xdg-configuration-files-service-type
|
||||
(list `("test.conf"
|
||||
,(plain-file "tmp-file.txt"
|
||||
"the content of
|
||||
~/.config/test.conf")))))
|
||||
%base-home-services)))
|
||||
|
||||
796
doc/htmlxref.cnf
796
doc/htmlxref.cnf
@@ -1,796 +0,0 @@
|
||||
# htmlxref.cnf - reference file for free Texinfo manuals on the web.
|
||||
# Modified by Ludovic Courtès <ludo@gnu.org> for the GNU Guix manual.
|
||||
# Further modified by Tomas Volf <~@wolfsden.cz>.
|
||||
|
||||
htmlxrefversion=2026-02-23.07; # UTC
|
||||
|
||||
# Override URLs of manuals provided by the Documentation Center.
|
||||
|
||||
DOCUMENTATION_CENTER = https://doc.guix.gnu.org
|
||||
|
||||
bash mono ${DOCUMENTATION_CENTER}/bash/latest/en/bash.html
|
||||
bash node ${DOCUMENTATION_CENTER}/bash/latest/en/html_node
|
||||
binutils mono ${DOCUMENTATION_CENTER}/binutils/latest/en/binutils.html
|
||||
binutils node ${DOCUMENTATION_CENTER}/binutils/latest/en/html_node
|
||||
cuirass mono ${DOCUMENTATION_CENTER}/cuirass/latest/en/cuirass.html
|
||||
cuirass node ${DOCUMENTATION_CENTER}/cuirass/latest/en/html_node
|
||||
emacs-guix mono ${DOCUMENTATION_CENTER}/emacs-guix/latest/en/emacs-guix.html
|
||||
emacs-guix node ${DOCUMENTATION_CENTER}/emacs-guix/latest/en/html_node
|
||||
fibers mono ${DOCUMENTATION_CENTER}/fibers/latest/en/fibers.html
|
||||
fibers node ${DOCUMENTATION_CENTER}/fibers/latest/en/html_node
|
||||
gash mono ${DOCUMENTATION_CENTER}/gash/latest/en/gash.html
|
||||
gash node ${DOCUMENTATION_CENTER}/gash/latest/en/html_node
|
||||
gcrypt mono ${DOCUMENTATION_CENTER}/gcrypt/latest/en/gcrypt.html
|
||||
gcrypt node ${DOCUMENTATION_CENTER}/gcrypt/latest/en/html_node
|
||||
gdb mono ${DOCUMENTATION_CENTER}/gdb/latest/en/gdb.html
|
||||
gdb node ${DOCUMENTATION_CENTER}/gdb/latest/en/html_node
|
||||
geiser mono ${DOCUMENTATION_CENTER}/geiser/latest/en/geiser.html
|
||||
geiser node ${DOCUMENTATION_CENTER}/geiser/latest/en/html_node
|
||||
grub mono ${DOCUMENTATION_CENTER}/grub/latest/en/grub.html
|
||||
grub node ${DOCUMENTATION_CENTER}/grub/latest/en/html_node
|
||||
guile-avahi mono ${DOCUMENTATION_CENTER}/guile-avahi/latest/en/guile-avahi.html
|
||||
guile-avahi node ${DOCUMENTATION_CENTER}/guile-avahi/latest/en/html_node
|
||||
guile-gcrypt mono ${DOCUMENTATION_CENTER}/guile-gcrypt/latest/en/guile-gcrypt.html
|
||||
guile-gcrypt node ${DOCUMENTATION_CENTER}/guile-gcrypt/latest/en/html_node
|
||||
guile-gnutls mono ${DOCUMENTATION_CENTER}/guile-gnutls/latest/en/guile-gnutls.html
|
||||
guile-gnutls node ${DOCUMENTATION_CENTER}/guile-gnutls/latest/en/html_node
|
||||
guile-library mono ${DOCUMENTATION_CENTER}/guile-library/latest/en/guile-library.html
|
||||
guile-library node ${DOCUMENTATION_CENTER}/guile-library/latest/en/html_node
|
||||
guile mono ${DOCUMENTATION_CENTER}/guile/latest/en/guile.html
|
||||
guile-netlink mono ${DOCUMENTATION_CENTER}/guile-netlink/latest/en/guile-netlink.html
|
||||
guile-netlink node ${DOCUMENTATION_CENTER}/guile-netlink/latest/en/html_node
|
||||
guile node ${DOCUMENTATION_CENTER}/guile/latest/en/html_node
|
||||
guile-ssh mono ${DOCUMENTATION_CENTER}/guile-ssh/latest/en/guile-ssh.html
|
||||
guile-ssh node ${DOCUMENTATION_CENTER}/guile-ssh/latest/en/html_node
|
||||
inetutils mono ${DOCUMENTATION_CENTER}/inetutils/latest/en/inetutils.html
|
||||
inetutils node ${DOCUMENTATION_CENTER}/inetutils/latest/en/html_node
|
||||
libc mono ${DOCUMENTATION_CENTER}/libc/latest/en/libc.html
|
||||
libc node ${DOCUMENTATION_CENTER}/libc/latest/en/html_node
|
||||
mes mono ${DOCUMENTATION_CENTER}/mes/latest/en/mes.html
|
||||
mes node ${DOCUMENTATION_CENTER}/mes/latest/en/html_node
|
||||
r5rs mono ${DOCUMENTATION_CENTER}/r5rs/latest/en/r5rs.html
|
||||
r5rs node ${DOCUMENTATION_CENTER}/r5rs/latest/en/html_node
|
||||
recutils mono ${DOCUMENTATION_CENTER}/recutils/latest/en/recutils.html
|
||||
recutils node ${DOCUMENTATION_CENTER}/recutils/latest/en/html_node
|
||||
shepherd mono ${DOCUMENTATION_CENTER}/shepherd/latest/en/shepherd.html
|
||||
shepherd node ${DOCUMENTATION_CENTER}/shepherd/latest/en/html_node
|
||||
|
||||
# Copyright 2010-2020, 2022 Free Software Foundation, Inc.
|
||||
#
|
||||
# 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 latest version of this file is available at
|
||||
# http://ftpmirror.gnu.org/texinfo/htmlxref.cnf.
|
||||
# Email corrections or additions to bug-texinfo@gnu.org.
|
||||
# The primary goal is to list all relevant GNU manuals;
|
||||
# other free manuals are also welcome.
|
||||
#
|
||||
# To be included in this list, a manual must:
|
||||
#
|
||||
# - have a generic url, e.g., no version numbers;
|
||||
# - have a unique file name (e.g., manual identifier), i.e., be related to the
|
||||
# package name. Things like "refman" or "tutorial" don't work.
|
||||
# - follow the naming convention for nodes described at
|
||||
# http://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref.html
|
||||
# This is what makeinfo and texi2html implement.
|
||||
#
|
||||
# Unless the above criteria are met, it's not possible to generate
|
||||
# reliable cross-manual references.
|
||||
#
|
||||
# For information on automatically generating all the useful formats for
|
||||
# a manual to put on the web, see
|
||||
# http://www.gnu.org/prep/maintain/html_node/Manuals-on-Web-Pages.html.
|
||||
|
||||
# For people editing this file: when a manual named foo is related to a
|
||||
# package named bar, the url should contain a variable reference ${BAR}.
|
||||
# Otherwise, the gnumaint scripts have no way of knowing they are
|
||||
# associated, and thus gnu.org/manual can't include them.
|
||||
|
||||
# shorten references to manuals on www.gnu.org.
|
||||
G = https://www.gnu.org
|
||||
GS = ${G}/software
|
||||
|
||||
3dldf mono ${GS}/3dldf/manual/user_ref/3DLDF.html
|
||||
3dldf node ${GS}/3dldf/manual/user_ref/
|
||||
|
||||
alive mono ${GS}/alive/manual/alive.html
|
||||
alive node ${GS}/alive/manual/html_node/
|
||||
|
||||
anubis chapter ${GS}/anubis/manual/html_chapter/
|
||||
anubis section ${GS}/anubis/manual/html_section/
|
||||
anubis node ${GS}/anubis/manual/html_node/
|
||||
|
||||
artanis mono ${GS}/artanis/manual/artanis.html
|
||||
artanis node ${GS}/artanis/manual/html_node/
|
||||
|
||||
aspell section http://aspell.net/man-html/index.html
|
||||
|
||||
auctex mono ${GS}/auctex/manual/auctex.html
|
||||
auctex node ${GS}/auctex/manual/auctex/
|
||||
|
||||
autoconf mono ${GS}/autoconf/manual/autoconf.html
|
||||
autoconf node ${GS}/autoconf/manual/html_node/
|
||||
|
||||
autogen mono ${GS}/autogen/manual/html_mono/autogen.html
|
||||
autogen chapter ${GS}/autogen/manual/html_chapter/
|
||||
autogen node ${GS}/autoconf/manual/html_node/
|
||||
|
||||
automake mono ${GS}/automake/manual/automake.html
|
||||
automake node ${GS}/automake/manual/html_node/
|
||||
|
||||
avl node http://adtinfo.org/libavl.html/
|
||||
|
||||
bash mono ${GS}/bash/manual/bash.html
|
||||
bash node ${GS}/bash/manual/html_node/
|
||||
|
||||
BINUTILS = https://sourceware.org/binutils/docs
|
||||
binutils node ${BINUTILS}/binutils/
|
||||
as node ${BINUTILS}/as/
|
||||
bfd node ${BINUTILS}/bfd/
|
||||
gprof node ${BINUTILS}/gprof/
|
||||
ld node ${BINUTILS}/ld/
|
||||
|
||||
bison mono ${GS}/bison/manual/bison.html
|
||||
bison node ${GS}/bison/manual/html_node/
|
||||
|
||||
bpel2owfn mono ${GS}/bpel2owfn/manual/2.0.x/bpel2owfn.html
|
||||
|
||||
ccd2cue mono ${GS}/ccd2cue/manual/ccd2cue.html
|
||||
ccd2cue node ${GS}/ccd2cue/manual/html_node/
|
||||
|
||||
cflow mono ${GS}/cflow/manual/cflow.html
|
||||
cflow node ${GS}/cflow/manual/html_node/
|
||||
|
||||
chess mono ${GS}/chess/manual/gnuchess.html
|
||||
chess node ${GS}/chess/manual/html_node/
|
||||
|
||||
combine mono ${GS}/combine/manual/combine.html
|
||||
combine chapter ${GS}/combine/manual/html_chapter/
|
||||
combine section ${GS}/combine/manual/html_section/
|
||||
combine node ${GS}/combine/manual/html_node/
|
||||
|
||||
complexity mono ${GS}/complexity/manual/complexity.html
|
||||
complexity node ${GS}/complexity/manual/html_node/
|
||||
|
||||
coreutils mono ${GS}/coreutils/manual/coreutils
|
||||
coreutils node ${GS}/coreutils/manual/html_node/
|
||||
|
||||
cpio mono ${GS}/cpio/manual/cpio
|
||||
cpio node ${GS}/cpio/manual/html_node/
|
||||
|
||||
cssc node ${GS}/cssc/manual/
|
||||
|
||||
CUIRASS = ${GS}/guix/cuirass/manual
|
||||
cuirass mono ${CUIRASS}/cuirass.html
|
||||
cuirass node ${CUIRASS}/html_node/
|
||||
|
||||
CVS = ${GS}/trans-coord/manual
|
||||
cvs mono ${CVS}/cvs/cvs.html
|
||||
cvs node ${CVS}/cvs/html_node/
|
||||
|
||||
ddd mono ${GS}/ddd/manual/html_mono/ddd.html
|
||||
|
||||
ddrescue mono ${GS}/ddrescue/manual/ddrescue_manual.html
|
||||
|
||||
dejagnu node ${GS}/dejagnu/manual/
|
||||
|
||||
DICO = https://puszcza.gnu.org.ua/software/dico/manual
|
||||
dico mono ${DICO}/dico.html
|
||||
dico chapter ${DICO}/html_chapter/
|
||||
dico section ${DICO}/html_section/
|
||||
dico node ${DICO}/html_node/
|
||||
|
||||
diffutils mono ${GS}/diffutils/manual/diffutils
|
||||
diffutils node ${GS}/diffutils/manual/html_node/
|
||||
|
||||
dmd mono ${GS}/dmd/manual/dmd
|
||||
dmd node ${GS}/dmd/manual/html_node/
|
||||
|
||||
ed mono ${GS}/ed/manual/ed_manual.html
|
||||
|
||||
EMACS = ${GS}/emacs/manual
|
||||
emacs mono ${EMACS}/html_mono/emacs.html
|
||||
emacs node ${EMACS}/html_node/emacs/
|
||||
#
|
||||
ada-mode mono ${EMACS}/html_mono/ada-mode.html
|
||||
ada-mode node ${EMACS}/html_node/ada-mode/
|
||||
#
|
||||
autotype mono ${EMACS}/html_mono/autotype.html
|
||||
autotype node ${EMACS}/html_node/autotype/
|
||||
#
|
||||
ccmode mono ${EMACS}/html_mono/ccmode.html
|
||||
ccmode node ${EMACS}/html_node/ccmode/
|
||||
#
|
||||
cl mono ${EMACS}/html_mono/cl.html
|
||||
cl node ${EMACS}/html_node/cl/
|
||||
#
|
||||
ebrowse mono ${EMACS}/html_mono/ebrowse.html
|
||||
ebrowse node ${EMACS}/html_node/ebrowse/
|
||||
#
|
||||
ediff mono ${EMACS}/html_mono/ediff.html
|
||||
ediff node ${EMACS}/html_node/ediff/
|
||||
#
|
||||
eieio mono ${EMACS}/html_mono/eieio.html
|
||||
eieio node ${EMACS}/html_node/eieio/
|
||||
#
|
||||
elisp mono ${EMACS}/html_mono/elisp.html
|
||||
elisp node ${EMACS}/html_node/elisp/
|
||||
#
|
||||
epa mono ${EMACS}/html_mono/epa.html
|
||||
epa node ${EMACS}/html_node/epa/
|
||||
#
|
||||
erc mono ${EMACS}/html_mono/erc.html
|
||||
erc node ${EMACS}/html_node/erc/
|
||||
#
|
||||
dired-x mono ${EMACS}/html_mono/dired-x.html
|
||||
dired-x node ${EMACS}/html_node/dired-x/
|
||||
#
|
||||
eshell mono ${EMACS}/html_mono/eshell.html
|
||||
eshell node ${EMACS}/html_node/eshell/
|
||||
#
|
||||
eww mono ${EMACS}/html_mono/eww.html
|
||||
eww node ${EMACS}/html_node/eww/
|
||||
#
|
||||
flymake mono ${EMACS}/html_mono/flymake.html
|
||||
flymake node ${EMACS}/html_node/flymake/
|
||||
#
|
||||
gnus mono ${EMACS}/html_mono/gnus.html
|
||||
gnus node ${EMACS}/html_node/gnus/
|
||||
#
|
||||
idlwave mono ${EMACS}/html_mono/idlwave.html
|
||||
idlwave node ${EMACS}/html_node/idlwave/
|
||||
#
|
||||
info mono ${EMACS}/html_mono/info.html
|
||||
info node ${EMACS}/html_node/info/
|
||||
#
|
||||
message mono ${EMACS}/html_mono/message.html
|
||||
message node ${EMACS}/html_node/message/
|
||||
#
|
||||
mh-e mono ${EMACS}/html_mono/mh-e.html
|
||||
mh-e node ${EMACS}/html_node/mh-e/
|
||||
#
|
||||
nxml-mode mono ${EMACS}/html_mono/nxml-mode.html
|
||||
nxml-mode node ${EMACS}/html_node/nxml-mode/
|
||||
#
|
||||
org mono ${EMACS}/html_mono/org.html
|
||||
org node ${EMACS}/html_node/org/
|
||||
#
|
||||
pcl-cvs mono ${EMACS}/html_mono/pcl-cvs.html
|
||||
pcl-cvs node ${EMACS}/html_node/pcl-cvs/
|
||||
#
|
||||
rcirc mono ${EMACS}/html_mono/rcirc.html
|
||||
rcirc node ${EMACS}/html_node/rcirc/
|
||||
#
|
||||
semantic mono ${EMACS}/html_mono/semantic.html
|
||||
semantic node ${EMACS}/html_node/semantic/
|
||||
#
|
||||
smtp mono ${EMACS}/html_mono/smtpmail.html
|
||||
smtp node ${EMACS}/html_node/smtpmail/
|
||||
#
|
||||
speedbar mono ${EMACS}/html_mono/speedbar.html
|
||||
speedbar node ${EMACS}/html_node/speedbar/
|
||||
#
|
||||
tramp mono ${EMACS}/html_mono/tramp.html
|
||||
tramp node ${EMACS}/html_node/tramp/
|
||||
#
|
||||
vip mono ${EMACS}/html_mono/vip.html
|
||||
vip node ${EMACS}/html_node/vip/
|
||||
#
|
||||
viper mono ${EMACS}/html_mono/viper.html
|
||||
viper node ${EMACS}/html_node/viper/
|
||||
#
|
||||
woman mono ${EMACS}/html_mono/woman.html
|
||||
woman node ${EMACS}/html_node/woman/
|
||||
# (end emacs manuals)
|
||||
|
||||
easejs mono ${GS}/easejs/manual/easejs.html
|
||||
easejs node ${GS}/easejs/manual/
|
||||
|
||||
EMACS_GUIX = https://emacs-guix.gitlab.io/website/manual/latest
|
||||
emacs-guix mono ${EMACS_GUIX}/emacs-guix.html
|
||||
emacs-guix node ${EMACS_GUIX}/html_node/
|
||||
|
||||
emacs-muse node ${GS}/emacs-muse/manual/muse.html
|
||||
emacs-muse node ${GS}/emacs-muse/manual/html_node/
|
||||
|
||||
emms node ${GS}/emms/manual/
|
||||
|
||||
# The file is called 'find.info' but the package is 'findutils'.
|
||||
find mono ${GS}/findutils/manual/html_mono/find.html
|
||||
find node ${GS}/findutils/manual/html_node/find_html
|
||||
findutils mono ${GS}/findutils/manual/html_mono/find.html
|
||||
findutils node ${GS}/findutils/manual/html_node/find_html
|
||||
|
||||
flex node https://westes.github.io/flex/manual/
|
||||
|
||||
gama mono ${GS}/gama/manual/gama.html
|
||||
gama node ${GS}/gama/manual/html_node/
|
||||
|
||||
GAWK = ${GS}/gawk/manual
|
||||
gawk mono ${GAWK}/gawk.html
|
||||
gawk node ${GAWK}/html_node/
|
||||
gawkinet mono ${GAWK}/gawkinet/gawkinet.html
|
||||
gawkinet node ${GAWK}/gawkinet/html_node/
|
||||
|
||||
gcal mono ${GS}/gcal/manual/gcal.html
|
||||
gcal node ${GS}/gcal/manual/html_node/
|
||||
|
||||
GCC = https://gcc.gnu.org/onlinedocs
|
||||
gcc node ${GCC}/gcc/
|
||||
cpp node ${GCC}/cpp/
|
||||
gcj node ${GCC}/gcj/
|
||||
gfortran node ${GCC}/gfortran/
|
||||
gnat_rm node ${GCC}/gnat_rm/
|
||||
gnat_ugn node ${GCC}/gnat_ugn/
|
||||
libgomp node ${GCC}/libgomp/
|
||||
libstdc++ node ${GCC}/libstdc++/
|
||||
#
|
||||
gccint node ${GCC}/gccint/
|
||||
cppinternals node ${GCC}/cppinternals/
|
||||
gfc-internals node ${GCC}/gfc-internals/
|
||||
gnat-style node ${GCC}/gnat-style/
|
||||
libiberty node ${GCC}/libiberty/
|
||||
|
||||
GDB = https://sourceware.org/gdb/current/onlinedocs
|
||||
gdb node ${GDB}/gdb/
|
||||
stabs node ${GDB}/stabs/
|
||||
|
||||
GDBM = http://www.gnu.org.ua/software/gdbm/manual
|
||||
gdbm mono ${GDBM}/gdbm.html
|
||||
gdbm chapter ${GDBM}/html_chapter/
|
||||
gdbm section ${GDBM}/html_section/
|
||||
gdbm node ${GDBM}/html_node/
|
||||
|
||||
geiser chapter http://geiser.nongnu.org/
|
||||
|
||||
gettext mono ${GS}/gettext/manual/gettext.html
|
||||
gettext node ${GS}/gettext/manual/html_node/
|
||||
|
||||
gforth node https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/
|
||||
|
||||
# Also found at:
|
||||
# https://mirrors.edge.kernel.org/pub/software/scm/git/docs/user-manual.html
|
||||
# https://git.github.io/htmldocs/user-manual.html
|
||||
git mono https://git-scm.com/docs/user-manual
|
||||
|
||||
global mono ${GS}/global/manual/global.html
|
||||
|
||||
gmediaserver node ${GS}/gmediaserver/manual/
|
||||
|
||||
gmp node https://www.gmplib.org/manual/
|
||||
|
||||
gnu-arch node ${GS}/gnu-arch/tutorial/
|
||||
|
||||
gnu-c-manual mono ${GS}/gnu-c-manual/gnu-c-manual.html
|
||||
|
||||
gnu-crypto node ${GS}/gnu-crypto/manual/
|
||||
|
||||
gnubg mono ${GS}/gnubg/manual/gnubg.html
|
||||
gnubg node ${GS}/gnubg/manual/html_node/
|
||||
|
||||
gnubik mono ${GS}/gnubik/manual/gnubik.html
|
||||
gnubik node ${GS}/gnubik/manual/html_node/
|
||||
|
||||
gnulib mono ${GS}/gnulib/manual/gnulib.html
|
||||
gnulib node ${GS}/gnulib/manual/html_node/
|
||||
|
||||
GNUN = ${GS}/trans-coord/manual
|
||||
gnun mono ${GNUN}/gnun/gnun.html
|
||||
gnun node ${GNUN}/gnun/html_node/
|
||||
web-trans mono ${GNUN}/web-trans/web-trans.html
|
||||
web-trans node ${GNUN}/web-trans/html_node/
|
||||
|
||||
GNUPG = https://www.gnupg.org/documentation/manuals
|
||||
gnupg node ${GNUPG}/gnupg/
|
||||
dirmngr node ${GNUPG}/dirmngr/
|
||||
gcrypt node ${GNUPG}/gcrypt/
|
||||
libgcrypt node ${GNUPG}/gcrypt/
|
||||
ksba node ${GNUPG}/ksba/
|
||||
assuan node ${GNUPG}/assuan/
|
||||
gpgme node ${GNUPG}/gpgme/
|
||||
|
||||
gnuprologjava node ${GS}/gnuprologjava/manual/
|
||||
|
||||
gnuschool mono ${GS}/gnuschool/gnuschool.html
|
||||
|
||||
GNUSTANDARDS = ${G}/prep
|
||||
maintain mono ${GNUSTANDARDS}/maintain/maintain.html
|
||||
maintain node ${GNUSTANDARDS}/maintain/html_node/
|
||||
#
|
||||
standards mono ${GNUSTANDARDS}/standards/standards.html
|
||||
standards node ${GNUSTANDARDS}/standards/html_node/
|
||||
|
||||
gnutls mono ${GS}/gnutls/manual/gnutls.html
|
||||
gnutls node ${GS}/gnutls/manual/html_node/
|
||||
|
||||
gnutls-guile mono http://gnutls.org/manual/gnutls-guile.html
|
||||
gnutls-guile node http://gnutls.org/manual/gnutls-guile/
|
||||
|
||||
gperf mono ${GS}/gperf/manual/gperf.html
|
||||
gperf node ${GS}/gperf/manual/html_node/
|
||||
|
||||
grep mono ${GS}/grep/manual/grep.html
|
||||
grep node ${GS}/grep/manual/html_node/
|
||||
|
||||
groff node ${GS}/groff/manual/html_node/
|
||||
|
||||
GRUB = ${GS}/grub/manual
|
||||
grub mono ${GRUB}/grub.html
|
||||
grub node ${GRUB}/html_node/
|
||||
#
|
||||
multiboot mono ${GRUB}/multiboot/multiboot.html
|
||||
multiboot node ${GRUB}/multiboot/html_node/
|
||||
|
||||
gsasl mono ${GS}/gsasl/manual/gsasl.html
|
||||
gsasl node ${GS}/gsasl/manual/html_node/
|
||||
|
||||
gsl node ${GS}/gsl/manual/html_node/
|
||||
|
||||
gsrc mono ${GS}/gsrc/manual/gsrc.html
|
||||
gsrc node ${GS}/gsrc/manual/html_node/
|
||||
|
||||
gss mono ${GS}/gss/manual/gss.html
|
||||
gss node ${GS}/gss/manual/html_node/
|
||||
|
||||
gtypist mono ${GS}/gtypist/doc/
|
||||
|
||||
guile mono ${GS}/guile/manual/guile.html
|
||||
guile node ${GS}/guile/manual/html_node/
|
||||
|
||||
guile-avahi mono http://nongnu.org/guile-avahi/doc/guile-avahi.html
|
||||
|
||||
GUILE_GNOME = ${GS}/guile-gnome/docs
|
||||
gobject node ${GUILE_GNOME}/gobject/html/
|
||||
glib node ${GUILE_GNOME}/glib/html/
|
||||
atk node ${GUILE_GNOME}/atk/html/
|
||||
pango node ${GUILE_GNOME}/pango/html/
|
||||
pangocairo node ${GUILE_GNOME}/pangocairo/html/
|
||||
gdk node ${GUILE_GNOME}/gdk/html/
|
||||
gtk node ${GUILE_GNOME}/gtk/html/
|
||||
libglade node ${GUILE_GNOME}/libglade/html/
|
||||
gnome-vfs node ${GUILE_GNOME}/gnome-vfs/html/
|
||||
libgnomecanvas node ${GUILE_GNOME}/libgnomecanvas/html/
|
||||
gconf node ${GUILE_GNOME}/gconf/html/
|
||||
libgnome node ${GUILE_GNOME}/libgnome/html/
|
||||
libgnomeui node ${GUILE_GNOME}/libgnomeui/html/
|
||||
corba node ${GUILE_GNOME}/corba/html/
|
||||
clutter node ${GUILE_GNOME}/clutter/html/
|
||||
clutter-glx node ${GUILE_GNOME}/clutter-glx/html/
|
||||
|
||||
guile-gtk node ${GS}/guile-gtk/docs/guile-gtk/
|
||||
|
||||
guile-netlink mono https://git.lepiller.eu/guile-netlink/manual/manual.html
|
||||
|
||||
guile-rpc mono ${GS}/guile-rpc/manual/guile-rpc.html
|
||||
guile-rpc node ${GS}/guile-rpc/manual/html_node/
|
||||
|
||||
GUIX_ROOT = https://guix.gnu.org
|
||||
GUIX = ${GUIX_ROOT}/manual/devel
|
||||
guix.de mono ${GUIX}/de/guix.de.html
|
||||
guix.de node ${GUIX}/de/html_node/
|
||||
guix.es mono ${GUIX}/es/guix.es.html
|
||||
guix.es node ${GUIX}/es/html_node/
|
||||
guix.fr mono ${GUIX}/fr/guix.fr.html
|
||||
guix.fr node ${GUIX}/fr/html_node/
|
||||
guix.it mono ${GUIX}/it/guix.it.html
|
||||
guix.it node ${GUIX}/it/html_node/
|
||||
guix.pt_BR mono ${GUIX}/pt-br/guix.pt_BR.html
|
||||
guix.pt_BR node ${GUIX}/pt-br/html_node/
|
||||
guix.ru mono ${GUIX}/ru/guix.ru.html
|
||||
guix.ru node ${GUIX}/ru/html_node/
|
||||
guix.zh_CN mono ${GUIX}/zh-cn/guix.zh_CN.html
|
||||
guix.zh_CN node ${GUIX}/zh-cn/html_node/
|
||||
guix mono ${GUIX}/en/guix.html
|
||||
guix node ${GUIX}/en/html_node/
|
||||
|
||||
GUIX_COOKBOOK = ${GUIX_ROOT}/cookbook
|
||||
guix-cookbook.de mono ${GUIX_COOKBOOK}/de/guix-cookbook.de.html
|
||||
guix-cookbook.de node ${GUIX_COOKBOOK}/de/html_node/
|
||||
guix-cookbook.es mono ${GUIX_COOKBOOK}/es/guix-cookbook.de.html
|
||||
guix-cookbook.es node ${GUIX_COOKBOOK}/es/html_node/
|
||||
guix-cookbook.fr mono ${GUIX_COOKBOOK}/fr/guix-cookbook.fr.html
|
||||
guix-cookbook.fr node ${GUIX_COOKBOOK}/fr/html_node/
|
||||
guix-cookbook.it mono ${GUIX_COOKBOOK}/it/guix-cookbook.it.html
|
||||
guix-cookbook.it node ${GUIX_COOKBOOK}/it/html_node/
|
||||
guix-cookbook.ko mono ${GUIX_COOKBOOK}/ko/guix-cookbook.ko.html
|
||||
guix-cookbook.ko node ${GUIX_COOKBOOK}/ko/html_node/
|
||||
guix-cookbook.pt_BR mono ${GUIX_COOKBOOK}/pt-br/guix-cookbook.pt_BR.html
|
||||
guix-cookbook.pt_BR node ${GUIX_COOKBOOK}/pt-br/html_node/
|
||||
guix-cookbook.ru mono ${GUIX_COOKBOOK}/ru/guix-cookbook.ru.html
|
||||
guix-cookbook.ru node ${GUIX_COOKBOOK}/ru/html_node/
|
||||
guix-cookbook.sk mono ${GUIX_COOKBOOK}/sk/guix-cookbook.sk.html
|
||||
guix-cookbook.sk node ${GUIX_COOKBOOK}/sk/html_node/
|
||||
guix-cookbook.sv mono ${GUIX_COOKBOOK}/sv/guix-cookbook.sv.html
|
||||
guix-cookbook.sv node ${GUIX_COOKBOOK}/sv/html_node/
|
||||
guix-cookbook.ta mono ${GUIX_COOKBOOK}/ta/guix-cookbook.ta.html
|
||||
guix-cookbook.ta node ${GUIX_COOKBOOK}/ta/html_node/
|
||||
guix-cookbook mono ${GUIX_COOKBOOK}/en/guix-cookbook.html
|
||||
guix-cookbook node ${GUIX_COOKBOOK}/en/html_node/
|
||||
guix-cookbook.zh_CN mono ${GUIX_COOKBOOK}/zh-cn/guix-cookbook.zh_CN.html
|
||||
guix-cookbook.zh_CN node ${GUIX_COOKBOOK}/zh-cn/html_node/
|
||||
|
||||
gv mono ${GS}/gv/manual/gv.html
|
||||
gv node ${GS}/gv/manual/html_node/
|
||||
|
||||
gzip mono ${GS}/gzip/manual/gzip.html
|
||||
gzip node ${GS}/gzip/manual/html_node/
|
||||
|
||||
hello mono ${GS}/hello/manual/hello.html
|
||||
hello node ${GS}/hello/manual/html_node/
|
||||
|
||||
help2man mono ${GS}/help2man/help2man.html
|
||||
|
||||
# XXX: These are actually pages created by texi2html, so no quite following
|
||||
# the expected naming scheme.
|
||||
hurd mono ${GS}/hurd/doc/
|
||||
|
||||
idutils mono ${GS}/idutils/manual/idutils.html
|
||||
idutils node ${GS}/idutils/manual/html_node/
|
||||
|
||||
inetutils mono ${GS}/inetutils/manual/inetutils.html
|
||||
inetutils node ${GS}/inetutils/manual/html_node/
|
||||
|
||||
jwhois mono ${GS}/jwhois/manual/jwhois.html
|
||||
jwhois node ${GS}/jwhois/manual/html_node/
|
||||
|
||||
libc mono ${GS}/libc/manual/html_mono/libc.html
|
||||
libc node ${GS}/libc/manual/html_node/
|
||||
|
||||
LIBCDIO = ${GS}/libcdio
|
||||
libcdio mono ${LIBCDIO}/libcdio.html
|
||||
cd-text mono ${LIBCDIO}/cd-text-format.html
|
||||
|
||||
libextractor mono ${GS}/libextractor/manual/libextractor.html
|
||||
libextractor node ${GS}/libextractor/manual/html_node/
|
||||
|
||||
libidn mono ${GS}/libidn/manual/libidn.html
|
||||
libidn node ${GS}/libidn/manual/html_node/
|
||||
|
||||
librejs mono ${GS}/librejs/manual/librejs.html
|
||||
librejs node ${GS}/librejs/manual/html_node/
|
||||
|
||||
libmatheval mono ${GS}/libmatheval/manual/libmatheval.html
|
||||
|
||||
LIBMICROHTTPD = ${GS}/libmicrohttpd
|
||||
libmicrohttpd mono ${LIBMICROHTTPD}/manual/libmicrohttpd.html
|
||||
libmicrohttpd node ${LIBMICROHTTPD}/manual/html_node/
|
||||
microhttpd-tutorial mono ${LIBMICROHTTPD}/tutorial.html
|
||||
|
||||
libtasn1 mono ${GS}/libtasn1/manual/libtasn1.html
|
||||
libtasn1 node ${GS}/libtasn1/manual/html_node/
|
||||
|
||||
libtool mono ${GS}/libtool/manual/libtool.html
|
||||
libtool node ${GS}/libtool/manual/html_node/
|
||||
|
||||
lightning mono ${GS}/lightning/manual/lightning.html
|
||||
lightning node ${GS}/lightning/manual/html_node/
|
||||
|
||||
# The stable/ url redirects immediately, but that's ok.
|
||||
# The .html extension is omitted on their web site, but it works if given.
|
||||
LILYPOND = http://lilypond.org/doc/stable/Documentation
|
||||
lilypond-internals node ${LILYPOND}/internals/
|
||||
lilypond-learning node ${LILYPOND}/learning/
|
||||
lilypond-notation node ${LILYPOND}/notation/
|
||||
lilypond-snippets node ${LILYPOND}/snippets/
|
||||
lilypond-usage node ${LILYPOND}/usage/
|
||||
lilypond-web node ${LILYPOND}/web/
|
||||
music-glossary node ${LILYPOND}/music-glossary/
|
||||
|
||||
liquidwar6 mono ${GS}/liquidwar6/manual/liquidwar6.html
|
||||
liquidwar6 node ${GS}/liquidwar6/manual/html_node/
|
||||
|
||||
lispintro mono ${GS}/emacs/emacs-lisp-intro/html_mono/emacs-lisp-intro.html
|
||||
lispintro node ${GS}/emacs/emacs-lisp-intro/html_node/index.html
|
||||
|
||||
LSH = http://www.lysator.liu.se/~nisse/lsh
|
||||
lsh mono ${LSH}/lsh.html
|
||||
|
||||
m4 mono ${GS}/m4/manual/m4.html
|
||||
m4 node ${GS}/m4/manual/html_node/
|
||||
|
||||
mailutils mono ${GS}/mailutils/manual/mailutils.html
|
||||
mailutils chapter ${GS}/mailutils/manual/html_chapter/
|
||||
mailutils section ${GS}/mailutils/manual/html_section/
|
||||
mailutils node ${GS}/mailutils/manual/html_node/
|
||||
|
||||
make mono ${GS}/make/manual/make.html
|
||||
make node ${GS}/make/manual/html_node/
|
||||
|
||||
mcron mono ${GS}/mcron/manual/mcron.html
|
||||
mcron node ${GS}/mcron/manual/html_node/
|
||||
|
||||
mdk mono ${GS}/mdk/manual/mdk.html
|
||||
mdk node ${GS}/mdk/manual/html_node/
|
||||
|
||||
METAEXCHANGE = https://ftp.gwdg.de/pub/gnu2/iwfmdh/doc/texinfo
|
||||
iwf_mh node ${METAEXCHANGE}/iwf_mh.html
|
||||
scantest node ${METAEXCHANGE}/scantest.html
|
||||
|
||||
mes mono ${GS}/mes/manual/mes.html
|
||||
mes node ${GS}/mes/manual/html_node/
|
||||
|
||||
MIT_SCHEME = ${GS}/mit-scheme/documentation/stable
|
||||
mit-scheme-ref mono ${MIT_SCHEME}/mit-scheme-ref.html
|
||||
mit-scheme-ref node ${MIT_SCHEME}/mit-scheme-ref/
|
||||
mit-scheme-user mono ${MIT_SCHEME}/mit-scheme-user.html
|
||||
mit-scheme-user node ${MIT_SCHEME}/mit-scheme-user/
|
||||
sos mono ${MIT_SCHEME}/mit-scheme-sos.html
|
||||
sos node ${MIT_SCHEME}/mit-scheme-sos/
|
||||
mit-scheme-imail mono ${MIT_SCHEME}/mit-scheme-imail.html
|
||||
|
||||
moe mono ${GS}/moe/manual/moe_manual.html
|
||||
|
||||
motti node ${GS}/motti/manual/
|
||||
|
||||
mpc node http://www.multiprecision.org/index.php?prog=mpc&page=html
|
||||
|
||||
mpfr mono http://www.mpfr.org/mpfr-current/mpfr.html
|
||||
|
||||
mtools mono ${GS}/mtools/manual/mtools.html
|
||||
|
||||
myserver mono http://www.myserverproject.net/doc.php
|
||||
|
||||
nano mono https://www.nano-editor.org/dist/latest/nano.html
|
||||
|
||||
nettle chapter http://www.lysator.liu.se/~nisse/nettle/nettle.html
|
||||
|
||||
ocrad mono ${GS}/ocrad/manual/ocrad_manual.html
|
||||
|
||||
parted mono ${GS}/parted/manual/parted.html
|
||||
parted node ${GS}/parted/manual/html_node/
|
||||
|
||||
pascal mono http://www.gnu-pascal.de/gpc/
|
||||
|
||||
# can't use pcb since url's contain dates --30nov10
|
||||
|
||||
perl mono ${GS}/perl/manual/perldoc-all.html
|
||||
|
||||
PIES = http://www.gnu.org.ua/software/pies/manual
|
||||
pies mono ${PIES}/pies.html
|
||||
pies chapter ${PIES}/html_chapter/
|
||||
pies section ${PIES}/html_section/
|
||||
pies node ${PIES}/html_node/
|
||||
|
||||
plotutils mono ${GS}/plotutils/manual/en/plotutils.html
|
||||
plotutils node ${GS}/plotutils/manual/en/html_node/
|
||||
|
||||
proxyknife mono ${GS}/proxyknife/manual/proxyknife.html
|
||||
proxyknife node ${GS}/proxyknife/manual/html_node/
|
||||
|
||||
pspp mono ${GS}/pspp/manual/pspp.html
|
||||
pspp node ${GS}/pspp/manual/html_node/
|
||||
|
||||
pyconfigure mono ${GS}/pyconfigure/manual/pyconfigure.html
|
||||
pyconfigure node ${GS}/pyconfigure/manual/html_node/
|
||||
|
||||
R = https://cran.r-project.org/doc/manuals
|
||||
R-intro mono ${R}/R-intro.html
|
||||
R-lang mono ${R}/R-lang.html
|
||||
R-exts mono ${R}/R-exts.html
|
||||
R-data mono ${R}/R-data.html
|
||||
R-admin mono ${R}/R-admin.html
|
||||
R-ints mono ${R}/R-ints.html
|
||||
|
||||
rcs mono ${GS}/rcs/manual/rcs.html
|
||||
rcs node ${GS}/rcs/manual/html_node/
|
||||
|
||||
READLINE = https://tiswww.cwru.edu/php/chet/readline
|
||||
readline mono ${READLINE}/readline.html
|
||||
rluserman mono ${READLINE}/rluserman.html
|
||||
history mono ${READLINE}/history.html
|
||||
|
||||
recode mono http://recode.progiciels-bpi.ca/manual/index.html
|
||||
|
||||
recutils mono ${GS}/recutils/manual/recutils.html
|
||||
recutils node ${GS}/recutils/manual/html_node/
|
||||
|
||||
reftex mono ${GS}/auctex/manual/reftex.html
|
||||
reftex node ${GS}/auctex/manual/reftex/
|
||||
|
||||
remotecontrol mono ${GS}/remotecontrol/manual/remotecontrol.html
|
||||
remotecontrol node ${GS}/remotecontrol/manual/html_node/
|
||||
|
||||
rottlog mono ${GS}/rottlog/manual/rottlog.html
|
||||
rottlog node ${GS}/rottlog/manual/html_node/
|
||||
|
||||
RUSH = http://www.gnu.org.ua/software/rush/manual
|
||||
rush mono ${RUSH}/rush.html
|
||||
rush chapter ${RUSH}/html_chapter/
|
||||
rush section ${RUSH}/html_section/
|
||||
rush node ${RUSH}/html_node/
|
||||
|
||||
screen mono ${GS}/screen/manual/screen.html
|
||||
screen node ${GS}/screen/manual/html_node/
|
||||
|
||||
sed mono ${GS}/sed/manual/sed.html
|
||||
sed node ${GS}/sed/manual/html_node/
|
||||
|
||||
sharutils mono ${GS}/sharutils/manual/html_mono/sharutils.html
|
||||
sharutils chapter ${GS}/sharutils/manual/html_chapter/
|
||||
sharutils node ${GS}/sharutils/manual/html_node/
|
||||
|
||||
shepherd mono ${GS}/shepherd/manual/shepherd.html
|
||||
shepherd node ${GS}/shepherd/manual/html_node/
|
||||
|
||||
# can't use mono files since they have generic names
|
||||
SMALLTALK = ${GS}/smalltalk
|
||||
smalltalk node ${SMALLTALK}/manual/html_node/
|
||||
smalltalk-base node ${SMALLTALK}/manual-base/html_node/
|
||||
smalltalk-libs node ${SMALLTALK}/manual-libs/html_node/
|
||||
|
||||
sourceinstall mono ${GS}/sourceinstall/manual/sourceinstall.html
|
||||
sourceinstall node ${GS}/sourceinstall/manual/html_node/
|
||||
|
||||
sqltutor mono ${GS}/sqltutor/manual/sqltutor.html
|
||||
sqltutor node ${GS}/sqltutor/manual/html_node/
|
||||
|
||||
src-highlite mono ${GS}/src-highlite/source-highlight.html
|
||||
|
||||
stow mono ${GS}/stow/manual/stow.html
|
||||
stow node ${GS}/stow/manual/html_node/
|
||||
|
||||
swbis mono ${GS}/swbis/manual.html
|
||||
|
||||
tar mono ${GS}/tar/manual/tar.html
|
||||
tar chapter ${GS}/tar/manual/html_chapter/
|
||||
tar section ${GS}/tar/manual/html_section/
|
||||
tar node ${GS}/tar/manual/html_node/
|
||||
|
||||
teseq mono ${GS}/teseq/teseq.html
|
||||
teseq node ${GS}/teseq/html_node/
|
||||
|
||||
TEXINFO = ${GS}/texinfo/manual
|
||||
texinfo mono ${TEXINFO}/texinfo/texinfo.html
|
||||
texinfo node ${TEXINFO}/texinfo/html_node/
|
||||
#
|
||||
info-stnd mono ${TEXINFO}/info-stnd/info-stnd.html
|
||||
info-stnd node ${TEXINFO}/info-stnd/html_node/
|
||||
|
||||
thales node ${GS}/thales/manual/
|
||||
|
||||
units mono ${GS}/units/manual/units.html
|
||||
units node ${GS}/units/manual/html_node/
|
||||
|
||||
vc-dwim mono ${GS}/vc-dwim/manual/vc-dwim.html
|
||||
vc-dwim node ${GS}/vc-dwim/manual/html_node/
|
||||
|
||||
wdiff mono ${GS}/wdiff/manual/wdiff.html
|
||||
wdiff node ${GS}/wdiff/manual/html_node/
|
||||
|
||||
websocket4j mono ${GS}/websocket4j/manual/websocket4j.html
|
||||
websocket4j node ${GS}/websocket4j/manual/html_node/
|
||||
|
||||
wget mono ${GS}/wget/manual/wget.html
|
||||
wget node ${GS}/wget/manual/html_node/
|
||||
|
||||
xboard mono ${GS}/xboard/manual/xboard.html
|
||||
xboard node ${GS}/xboard/manual/html_node/
|
||||
|
||||
# emacs-page
|
||||
# Free TeX-related Texinfo manuals on tug.org.
|
||||
|
||||
T = https://tug.org/texinfohtml
|
||||
|
||||
dvipng mono ${T}/dvipng.html
|
||||
dvips mono ${T}/dvips.html
|
||||
eplain mono ${T}/eplain.html
|
||||
kpathsea mono ${T}/kpathsea.html
|
||||
latex2e mono ${T}/latex2e.html
|
||||
tlbuild mono ${T}/tlbuild.html
|
||||
web2c mono ${T}/web2c.html
|
||||
|
||||
ELPA = https://elpa.gnu.org
|
||||
ELPA_DOC = ${ELPA}/packages/doc
|
||||
|
||||
debbugs-ug mono ${ELPA_DOC}/debbugs-ug.html
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# eval: (add-hook 'write-file-functions 'time-stamp)
|
||||
# time-stamp-start: "htmlxrefversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
@@ -1,7 +1,7 @@
|
||||
# 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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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"];
|
||||
@@ -11,8 +11,8 @@ digraph G {
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0.drv", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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"];
|
||||
@@ -20,63 +20,63 @@ digraph G {
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [label = "glibc-bootstrap-0-guile-builder", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" [label = "bash", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [label = "module-import.drv", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" [label = "download.scm", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" [label = "utils.scm", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [label = "module-import-compiled.drv", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [label = "gcc-bootstrap-0-guile-builder", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [label = "guile-bootstrap-2.0.drv", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/c450lqvaaz3ngx9pfiiiw55rqq6ssfda-guile-2.0.7.tar.xz" [label = "guile-2.0.7.tar.xz", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [label = "module-import-compiled.drv", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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 = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [label = "module-import-guile-builder", fontname = "dejavu sans", shape = box, style = filled, fillcolor = "#ffffff"];
|
||||
"/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"];
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
digraph "Guix bag" {
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" [label = "glibc-intermediate-2.24", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = magenta];
|
||||
"/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" [color = magenta];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" [label = "texinfo-6.3", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = cyan3];
|
||||
"/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [color = cyan3];
|
||||
"/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [label = "make-boot0-4.2.1", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = dimgrey];
|
||||
"/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = dimgrey];
|
||||
"/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = dimgrey];
|
||||
"/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
|
||||
"/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
|
||||
"/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = darkseagreen];
|
||||
"/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [label = "binutils-bootstrap-0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [label = "bootstrap-binaries-0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [label = "diffutils-boot0-3.5", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = blue];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
|
||||
"/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [label = "findutils-boot0-4.6.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
|
||||
"/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [label = "file-boot0-5.28", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [label = "perl-boot0-5.24.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = peachpuff4];
|
||||
"/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = peachpuff4];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" [label = "gcc-cross-boot0-4.9.4", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkseagreen];
|
||||
"/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkseagreen];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [label = "binutils-cross-boot0-2.27", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
|
||||
"/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
|
||||
"/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" [label = "ld-wrapper-x86_64-guix-linux-gnu-0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" -> "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [color = dimgrey];
|
||||
"/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" -> "/gnu/store/af19ma2vm3qhvh3rw6cdivyp98s18bj3-guile-bootstrap-2.0.drv" [color = dimgrey];
|
||||
"/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
|
||||
"/gnu/store/af19ma2vm3qhvh3rw6cdivyp98s18bj3-guile-bootstrap-2.0.drv" [label = "guile-bootstrap-2.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" [label = "linux-libre-headers-4.4.18", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
|
||||
"/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
|
||||
|
||||
}
|
||||
@@ -1,215 +1,215 @@
|
||||
digraph "Guix bag-emerged" {
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" [label = "coreutils-8.25", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" [color = cyan3];
|
||||
"/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" [color = cyan3];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [label = "perl-5.24.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = blue];
|
||||
"/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = blue];
|
||||
"/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [label = "tar-1.29", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [label = "gzip-1.8", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [label = "bzip2-1.0.6", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [label = "xz-5.2.2", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [label = "file-5.28", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [label = "diffutils-3.5", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [label = "patch-2.7.5", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [label = "sed-4.2.2", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [label = "findutils-4.6.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [label = "gawk-4.1.4", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [label = "grep-2.25", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [label = "coreutils-8.25", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [label = "make-4.2.1", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [label = "bash-4.4.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [label = "ld-wrapper-0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [label = "binutils-2.27", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [label = "gcc-4.9.4", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [label = "glibc-2.24", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [label = "glibc-utf8-locales-2.24", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" [label = "acl-2.2.52", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" [label = "gettext-minimal-0.19.8.1", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = dimgrey];
|
||||
"/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" [color = dimgrey];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" [label = "expat-2.2.0", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = darkviolet];
|
||||
"/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = darkviolet];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" [label = "attr-2.4.47", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = peachpuff4];
|
||||
"/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = peachpuff4];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" [label = "gmp-6.1.1", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = darkgoldenrod];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" [label = "m4-1.4.17", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = cyan3];
|
||||
"/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = cyan3];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" [label = "libcap-2.24", shape = box, fontname = "dejavu sans"];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = blue];
|
||||
"/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" [color = blue];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" [color = red];
|
||||
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [label = "perl-5.16.1", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [label = "tar-1.28", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [label = "gzip-1.6", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [label = "bzip2-1.0.6", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [label = "xz-5.0.4", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [label = "file-5.22", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [label = "diffutils-3.3", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [label = "patch-2.7.5", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [label = "sed-4.2.2", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [label = "findutils-4.4.2", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [label = "gawk-4.1.3", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [label = "grep-2.21", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [label = "make-4.1", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [label = "bash-4.3.39", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [label = "ld-wrapper-0", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [label = "binutils-2.25.1", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [label = "gcc-4.9.3", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [label = "glibc-2.22", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [label = "glibc-utf8-locales-2.22", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [label = "gettext-0.19.6", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" [label = "expat-2.1.0", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [label = "attr-2.4.46", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" [label = "gmp-6.0.0a", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" [label = "libcap-2.24", shape = box, fontname = Helvetica];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
|
||||
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [color = red];
|
||||
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
digraph "Guix package" {
|
||||
"72851008" [label = "coreutils-8.25", shape = box, fontname = "dejavu sans"];
|
||||
"72851008" -> "49728512" [color = darkseagreen];
|
||||
"72851008" -> "74872512" [color = darkseagreen];
|
||||
"72851008" -> "53180864" [color = darkseagreen];
|
||||
"72851008" -> "75199232" [color = darkseagreen];
|
||||
"49728512" [label = "perl-5.24.0", shape = box, fontname = "dejavu sans"];
|
||||
"74872512" [label = "acl-2.2.52", shape = box, fontname = "dejavu sans"];
|
||||
"74872512" -> "74873280" [color = red];
|
||||
"74872512" -> "49728512" [color = red];
|
||||
"74872512" -> "74872704" [color = red];
|
||||
"74873280" [label = "gettext-minimal-0.19.8.1", shape = box, fontname = "dejavu sans"];
|
||||
"74873280" -> "41550784" [color = cyan3];
|
||||
"41550784" [label = "expat-2.2.0", shape = box, fontname = "dejavu sans"];
|
||||
"74872704" [label = "attr-2.4.47", shape = box, fontname = "dejavu sans"];
|
||||
"74872704" -> "74873280" [color = cyan3];
|
||||
"74872704" -> "49728512" [color = cyan3];
|
||||
"53180864" [label = "gmp-6.1.1", shape = box, fontname = "dejavu sans"];
|
||||
"53180864" -> "50262784" [color = darkgoldenrod];
|
||||
"50262784" [label = "m4-1.4.17", shape = box, fontname = "dejavu sans"];
|
||||
"75199232" [label = "libcap-2.24", shape = box, fontname = "dejavu sans"];
|
||||
"75199232" -> "49728512" [color = blue];
|
||||
"75199232" -> "74872704" [color = blue];
|
||||
"70481600" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
|
||||
"70481600" -> "50717824" [color = red];
|
||||
"70481600" -> "57499200" [color = red];
|
||||
"70481600" -> "57496320" [color = red];
|
||||
"70481600" -> "69877504" [color = red];
|
||||
"50717824" [label = "perl-5.16.1", shape = box, fontname = Helvetica];
|
||||
"57499200" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
|
||||
"57499200" -> "70563904" [color = red];
|
||||
"57499200" -> "50717824" [color = red];
|
||||
"57499200" -> "70563520" [color = red];
|
||||
"70563904" [label = "gettext-0.19.6", shape = box, fontname = Helvetica];
|
||||
"70563904" -> "69316352" [color = red];
|
||||
"69316352" [label = "expat-2.1.0", shape = box, fontname = Helvetica];
|
||||
"70563520" [label = "attr-2.4.46", shape = box, fontname = Helvetica];
|
||||
"70563520" -> "70563904" [color = red];
|
||||
"70563520" -> "50717824" [color = red];
|
||||
"57496320" [label = "gmp-6.0.0a", shape = box, fontname = Helvetica];
|
||||
"57496320" -> "57498432" [color = red];
|
||||
"57498432" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
|
||||
"69877504" [label = "libcap-2.24", shape = box, fontname = Helvetica];
|
||||
"69877504" -> "50717824" [color = red];
|
||||
"69877504" -> "70563520" [color = red];
|
||||
|
||||
}
|
||||
|
||||
75
doc/images/dmd-graph.dot
Normal file
75
doc/images/dmd-graph.dot
Normal file
@@ -0,0 +1,75 @@
|
||||
digraph "Guix dmd-service" {
|
||||
"user-file-systems" [label = "user-file-systems", shape = box, fontname = Helvetica];
|
||||
"user-processes" -> "user-file-systems" [color = red];
|
||||
"user-processes" [label = "user-processes", shape = box, fontname = Helvetica];
|
||||
"nscd" -> "user-processes" [color = red];
|
||||
"guix-daemon" -> "user-processes" [color = red];
|
||||
"syslogd" -> "user-processes" [color = red];
|
||||
"term-tty6" -> "user-processes" [color = red];
|
||||
"term-tty5" -> "user-processes" [color = red];
|
||||
"term-tty4" -> "user-processes" [color = red];
|
||||
"term-tty3" -> "user-processes" [color = red];
|
||||
"term-tty2" -> "user-processes" [color = red];
|
||||
"term-tty1" -> "user-processes" [color = red];
|
||||
"networking" -> "user-processes" [color = red];
|
||||
"nscd" [label = "nscd", shape = box, fontname = Helvetica];
|
||||
"guix-daemon" [label = "guix-daemon", shape = box, fontname = Helvetica];
|
||||
"syslogd" [label = "syslogd", shape = box, fontname = Helvetica];
|
||||
"ssh-daemon" -> "syslogd" [color = red];
|
||||
"ssh-daemon" [label = "ssh-daemon", shape = box, fontname = Helvetica];
|
||||
"term-tty6" [label = "term-tty6", shape = box, fontname = Helvetica];
|
||||
"console-font-tty6" -> "term-tty6" [color = red];
|
||||
"console-font-tty6" [label = "console-font-tty6", shape = box, fontname = Helvetica];
|
||||
"term-tty5" [label = "term-tty5", shape = box, fontname = Helvetica];
|
||||
"console-font-tty5" -> "term-tty5" [color = red];
|
||||
"console-font-tty5" [label = "console-font-tty5", shape = box, fontname = Helvetica];
|
||||
"term-tty4" [label = "term-tty4", shape = box, fontname = Helvetica];
|
||||
"console-font-tty4" -> "term-tty4" [color = red];
|
||||
"console-font-tty4" [label = "console-font-tty4", shape = box, fontname = Helvetica];
|
||||
"term-tty3" [label = "term-tty3", shape = box, fontname = Helvetica];
|
||||
"console-font-tty3" -> "term-tty3" [color = red];
|
||||
"console-font-tty3" [label = "console-font-tty3", shape = box, fontname = Helvetica];
|
||||
"term-tty2" [label = "term-tty2", shape = box, fontname = Helvetica];
|
||||
"console-font-tty2" -> "term-tty2" [color = red];
|
||||
"console-font-tty2" [label = "console-font-tty2", shape = box, fontname = Helvetica];
|
||||
"term-tty1" [label = "term-tty1", shape = box, fontname = Helvetica];
|
||||
"console-font-tty1" -> "term-tty1" [color = red];
|
||||
"console-font-tty1" [label = "console-font-tty1", shape = box, fontname = Helvetica];
|
||||
"networking" [label = "networking", shape = box, fontname = Helvetica];
|
||||
"ssh-daemon" -> "networking" [color = red];
|
||||
"root-file-system" [label = "root-file-system", shape = box, fontname = Helvetica];
|
||||
"file-system-/run/user" -> "root-file-system" [color = red];
|
||||
"file-system-/run/systemd" -> "root-file-system" [color = red];
|
||||
"file-system-/gnu/store" -> "root-file-system" [color = red];
|
||||
"file-system-/dev/shm" -> "root-file-system" [color = red];
|
||||
"file-system-/dev/pts" -> "root-file-system" [color = red];
|
||||
"user-processes" -> "root-file-system" [color = red];
|
||||
"udev" -> "root-file-system" [color = red];
|
||||
"file-system-/run/user" [label = "file-system-/run/user", shape = box, fontname = Helvetica];
|
||||
"user-processes" -> "file-system-/run/user" [color = red];
|
||||
"file-system-/run/systemd" [label = "file-system-/run/systemd", shape = box, fontname = Helvetica];
|
||||
"user-processes" -> "file-system-/run/systemd" [color = red];
|
||||
"file-system-/gnu/store" [label = "file-system-/gnu/store", shape = box, fontname = Helvetica];
|
||||
"user-processes" -> "file-system-/gnu/store" [color = red];
|
||||
"file-system-/dev/shm" [label = "file-system-/dev/shm", shape = box, fontname = Helvetica];
|
||||
"user-processes" -> "file-system-/dev/shm" [color = red];
|
||||
"file-system-/dev/pts" [label = "file-system-/dev/pts", shape = box, fontname = Helvetica];
|
||||
"user-processes" -> "file-system-/dev/pts" [color = red];
|
||||
"udev" [label = "udev", shape = box, fontname = Helvetica];
|
||||
"term-tty6" -> "udev" [color = red];
|
||||
"term-tty5" -> "udev" [color = red];
|
||||
"term-tty4" -> "udev" [color = red];
|
||||
"term-tty3" -> "udev" [color = red];
|
||||
"term-tty2" -> "udev" [color = red];
|
||||
"term-tty1" -> "udev" [color = red];
|
||||
"networking" -> "udev" [color = red];
|
||||
"host-name" [label = "host-name", shape = box, fontname = Helvetica];
|
||||
"term-tty6" -> "host-name" [color = red];
|
||||
"term-tty5" -> "host-name" [color = red];
|
||||
"term-tty4" -> "host-name" [color = red];
|
||||
"term-tty3" -> "host-name" [color = red];
|
||||
"term-tty2" -> "host-name" [color = red];
|
||||
"term-tty1" -> "host-name" [color = red];
|
||||
"loopback" [label = "loopback", shape = box, fontname = Helvetica];
|
||||
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
digraph "Guix package" {
|
||||
"139803511371136" [label = "gcc-core-mesboot0@2.95.3", shape = box, fontname = "dejavu sans"];
|
||||
"139803511371136" -> "139803511371312" [color = red];
|
||||
"139803511371136" -> "139803511372016" [color = red];
|
||||
"139803511371136" -> "139803511371488" [color = red];
|
||||
"139803511371136" -> "139803511371664" [color = red];
|
||||
"139803511371136" -> "139803511371840" [color = red];
|
||||
"139803511371136" -> "139803507105792" [color = red];
|
||||
"139803511371136" -> "139803511373600" [color = red];
|
||||
"139803511371136" -> "139803507105968" [color = red];
|
||||
"139803511371136" -> "139803749199472" [color = red];
|
||||
"139803511371312" [label = "binutils-mesboot0@2.20.1a", shape = box, fontname = "dejavu sans"];
|
||||
"139803511371312" -> "139803511372016" [color = dimgrey];
|
||||
"139803511371312" -> "139803511371488" [color = dimgrey];
|
||||
"139803511371312" -> "139803511371664" [color = dimgrey];
|
||||
"139803511371312" -> "139803511371840" [color = dimgrey];
|
||||
"139803511371312" -> "139803507105792" [color = dimgrey];
|
||||
"139803511371312" -> "139803511373600" [color = dimgrey];
|
||||
"139803511371312" -> "139803507105968" [color = dimgrey];
|
||||
"139803511371312" -> "139803749199472" [color = dimgrey];
|
||||
"139803511372016" [label = "gzip-mesboot@1.2.4", shape = box, fontname = "dejavu sans"];
|
||||
"139803511372016" -> "139803511372192" [color = magenta];
|
||||
"139803511372016" -> "139803507105792" [color = magenta];
|
||||
"139803511372016" -> "139803511373600" [color = magenta];
|
||||
"139803511372016" -> "139803507105968" [color = magenta];
|
||||
"139803511372016" -> "139803749199472" [color = magenta];
|
||||
"139803511372192" [label = "tcc-boot0@0.9.26-1136-g5bba73cc", shape = box, fontname = "dejavu sans"];
|
||||
"139803511372192" -> "139803511372368" [color = magenta];
|
||||
"139803511372192" -> "139803511372544" [color = magenta];
|
||||
"139803511372192" -> "139803507105792" [color = magenta];
|
||||
"139803511372192" -> "139803511373600" [color = magenta];
|
||||
"139803511372192" -> "139803507105968" [color = magenta];
|
||||
"139803511372192" -> "139803749199472" [color = magenta];
|
||||
"139803511372368" [label = "mes-boot@0.24", shape = box, fontname = "dejavu sans"];
|
||||
"139803511372368" -> "139803511372544" [color = darkviolet];
|
||||
"139803511372368" -> "139803507105792" [color = darkviolet];
|
||||
"139803511372368" -> "139803511373600" [color = darkviolet];
|
||||
"139803511372368" -> "139803507105968" [color = darkviolet];
|
||||
"139803511372368" -> "139803749199472" [color = darkviolet];
|
||||
"139803511372544" [label = "stage0-posix@1.4", shape = box, fontname = "dejavu sans"];
|
||||
"139803511372544" -> "139803511373072" [color = peachpuff4];
|
||||
"139803511372544" -> "139803507105792" [color = peachpuff4];
|
||||
"139803511372544" -> "139803511373600" [color = peachpuff4];
|
||||
"139803511372544" -> "139803507105968" [color = peachpuff4];
|
||||
"139803511372544" -> "139803749199472" [color = peachpuff4];
|
||||
"139803511373072" [label = "bootstrap-seeds@1.0.0", shape = ellipse, fontname = "dejavu sans"];
|
||||
"139803511373072" -> "139803507105968" [color = cyan3];
|
||||
"139803507105968" [label = "bootar@1b", shape = box, fontname = "dejavu sans"];
|
||||
"139803507105968" -> "139803749199472" [color = dimgrey];
|
||||
"139803749199472" [label = "guile-bootstrap@2.0", shape = ellipse, fontname = "dejavu sans"];
|
||||
"139803507105792" [label = "gash-boot@0.3.0", shape = box, fontname = "dejavu sans"];
|
||||
"139803507105792" -> "139803507105968" [color = darkviolet];
|
||||
"139803507105792" -> "139803749199472" [color = darkviolet];
|
||||
"139803511373600" [label = "gash-utils-boot@0.2.0", shape = box, fontname = "dejavu sans"];
|
||||
"139803511373600" -> "139803507105968" [color = red];
|
||||
"139803511373600" -> "139803507105792" [color = red];
|
||||
"139803511373600" -> "139803749199472" [color = red];
|
||||
"139803511371488" [label = "patch-mesboot@2.5.9", shape = box, fontname = "dejavu sans"];
|
||||
"139803511371488" -> "139803511371840" [color = darkseagreen];
|
||||
"139803511371488" -> "139803511372192" [color = darkseagreen];
|
||||
"139803511371488" -> "139803507105792" [color = darkseagreen];
|
||||
"139803511371488" -> "139803511373600" [color = darkseagreen];
|
||||
"139803511371488" -> "139803507105968" [color = darkseagreen];
|
||||
"139803511371488" -> "139803749199472" [color = darkseagreen];
|
||||
"139803511371840" [label = "make-mesboot0@3.80", shape = box, fontname = "dejavu sans"];
|
||||
"139803511371840" -> "139803511372192" [color = blue];
|
||||
"139803511371840" -> "139803507105792" [color = blue];
|
||||
"139803511371840" -> "139803511373600" [color = blue];
|
||||
"139803511371840" -> "139803507105968" [color = blue];
|
||||
"139803511371840" -> "139803749199472" [color = blue];
|
||||
"139803511371664" [label = "tcc-boot@0.9.27", shape = box, fontname = "dejavu sans"];
|
||||
"139803511371664" -> "139803511371840" [color = peachpuff4];
|
||||
"139803511371664" -> "139803511372192" [color = peachpuff4];
|
||||
"139803511371664" -> "139803507105792" [color = peachpuff4];
|
||||
"139803511371664" -> "139803511373600" [color = peachpuff4];
|
||||
"139803511371664" -> "139803507105968" [color = peachpuff4];
|
||||
"139803511371664" -> "139803749199472" [color = peachpuff4];
|
||||
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 54 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 35 KiB |
@@ -1,20 +1,18 @@
|
||||
digraph "Service Type Dependencies" {
|
||||
shepherd [shape = box, fontname = "dejavu sans"];
|
||||
pam [shape = box, fontname = "dejavu sans"];
|
||||
etc [shape = box, fontname = "dejavu sans"];
|
||||
profile [shape = box, fontname = "dejavu sans"];
|
||||
accounts [shape = box, fontname = "dejavu sans"];
|
||||
activation [shape = box, fontname = "dejavu sans"];
|
||||
boot [shape = box, fontname = "dejavu sans"];
|
||||
system [shape = house, fontname = "dejavu sans"];
|
||||
lshd -> shepherd;
|
||||
dmd [shape = box, fontname = Helvetica];
|
||||
pam [shape = box, fontname = Helvetica];
|
||||
etc [shape = box, fontname = Helvetica];
|
||||
accounts [shape = box, fontname = Helvetica];
|
||||
activation [shape = box, fontname = Helvetica];
|
||||
boot [shape = house, fontname = Helvetica];
|
||||
lshd -> dmd;
|
||||
lshd -> pam;
|
||||
udev -> shepherd;
|
||||
nscd -> shepherd [label = "extends"];
|
||||
udev -> dmd;
|
||||
nscd -> dmd [label = "extends"];
|
||||
"nss-mdns" -> nscd;
|
||||
"kvm-rules" -> udev;
|
||||
colord -> udev;
|
||||
dbus -> shepherd;
|
||||
dbus -> dmd;
|
||||
colord -> dbus;
|
||||
upower -> udev;
|
||||
upower -> dbus;
|
||||
@@ -23,7 +21,7 @@ digraph "Service Type Dependencies" {
|
||||
elogind -> dbus;
|
||||
elogind -> udev;
|
||||
elogind -> polkit [label = "extends"];
|
||||
shepherd -> boot;
|
||||
dmd -> boot;
|
||||
colord -> accounts;
|
||||
accounts -> activation;
|
||||
accounts -> etc;
|
||||
@@ -31,10 +29,7 @@ digraph "Service Type Dependencies" {
|
||||
activation -> boot;
|
||||
pam -> etc;
|
||||
elogind -> pam;
|
||||
guix -> shepherd;
|
||||
guix -> dmd;
|
||||
guix -> activation;
|
||||
guix -> accounts;
|
||||
boot -> system;
|
||||
etc -> system;
|
||||
profile -> system;
|
||||
}
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
digraph "Guix shepherd-service" {
|
||||
"user-file-systems" [label = "user-file-systems", shape = box, fontname = "dejavu sans"];
|
||||
"user-processes" -> "user-file-systems" [color = cyan3];
|
||||
"user-processes" [label = "user-processes", shape = box, fontname = "dejavu sans"];
|
||||
"nscd" -> "user-processes" [color = magenta];
|
||||
"guix-daemon" -> "user-processes" [color = blue];
|
||||
"urandom-seed" -> "user-processes" [color = dimgrey];
|
||||
"syslogd" -> "user-processes" [color = darkgoldenrod];
|
||||
"term-tty6" -> "user-processes" [color = magenta];
|
||||
"term-tty5" -> "user-processes" [color = red];
|
||||
"term-tty4" -> "user-processes" [color = darkgoldenrod];
|
||||
"term-tty3" -> "user-processes" [color = dimgrey];
|
||||
"term-tty2" -> "user-processes" [color = darkviolet];
|
||||
"term-tty1" -> "user-processes" [color = peachpuff4];
|
||||
"networking" -> "user-processes" [color = dimgrey];
|
||||
"nscd" [label = "nscd", shape = box, fontname = "dejavu sans"];
|
||||
"guix-daemon" [label = "guix-daemon", shape = box, fontname = "dejavu sans"];
|
||||
"urandom-seed" [label = "urandom-seed", shape = box, fontname = "dejavu sans"];
|
||||
"syslogd" [label = "syslogd", shape = box, fontname = "dejavu sans"];
|
||||
"ssh-daemon" -> "syslogd" [color = darkgoldenrod];
|
||||
"ssh-daemon" [label = "ssh-daemon", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty6" [label = "term-tty6", shape = box, fontname = "dejavu sans"];
|
||||
"console-font-tty6" -> "term-tty6" [color = darkgoldenrod];
|
||||
"console-font-tty6" [label = "console-font-tty6", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty5" [label = "term-tty5", shape = box, fontname = "dejavu sans"];
|
||||
"console-font-tty5" -> "term-tty5" [color = dimgrey];
|
||||
"console-font-tty5" [label = "console-font-tty5", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty4" [label = "term-tty4", shape = box, fontname = "dejavu sans"];
|
||||
"console-font-tty4" -> "term-tty4" [color = darkviolet];
|
||||
"console-font-tty4" [label = "console-font-tty4", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty3" [label = "term-tty3", shape = box, fontname = "dejavu sans"];
|
||||
"console-font-tty3" -> "term-tty3" [color = peachpuff4];
|
||||
"console-font-tty3" [label = "console-font-tty3", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty2" [label = "term-tty2", shape = box, fontname = "dejavu sans"];
|
||||
"console-font-tty2" -> "term-tty2" [color = darkseagreen];
|
||||
"console-font-tty2" [label = "console-font-tty2", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty1" [label = "term-tty1", shape = box, fontname = "dejavu sans"];
|
||||
"console-font-tty1" -> "term-tty1" [color = cyan3];
|
||||
"console-font-tty1" [label = "console-font-tty1", shape = box, fontname = "dejavu sans"];
|
||||
"networking" [label = "networking", shape = box, fontname = "dejavu sans"];
|
||||
"ssh-daemon" -> "networking" [color = darkgoldenrod];
|
||||
"root-file-system" [label = "root-file-system", shape = box, fontname = "dejavu sans"];
|
||||
"file-system-/dev/pts" -> "root-file-system" [color = peachpuff4];
|
||||
"file-system-/dev/shm" -> "root-file-system" [color = darkgoldenrod];
|
||||
"file-system-/gnu/store" -> "root-file-system" [color = blue];
|
||||
"user-processes" -> "root-file-system" [color = cyan3];
|
||||
"udev" -> "root-file-system" [color = darkseagreen];
|
||||
"file-system-/dev/pts" [label = "file-system-/dev/pts", shape = box, fontname = "dejavu sans"];
|
||||
"user-processes" -> "file-system-/dev/pts" [color = cyan3];
|
||||
"file-system-/dev/shm" [label = "file-system-/dev/shm", shape = box, fontname = "dejavu sans"];
|
||||
"user-processes" -> "file-system-/dev/shm" [color = cyan3];
|
||||
"file-system-/gnu/store" [label = "file-system-/gnu/store", shape = box, fontname = "dejavu sans"];
|
||||
"user-processes" -> "file-system-/gnu/store" [color = cyan3];
|
||||
"udev" [label = "udev", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty6" -> "udev" [color = magenta];
|
||||
"term-tty5" -> "udev" [color = red];
|
||||
"term-tty4" -> "udev" [color = darkgoldenrod];
|
||||
"term-tty3" -> "udev" [color = dimgrey];
|
||||
"term-tty2" -> "udev" [color = darkviolet];
|
||||
"term-tty1" -> "udev" [color = peachpuff4];
|
||||
"networking" -> "udev" [color = dimgrey];
|
||||
"host-name" [label = "host-name", shape = box, fontname = "dejavu sans"];
|
||||
"term-tty6" -> "host-name" [color = magenta];
|
||||
"term-tty5" -> "host-name" [color = red];
|
||||
"term-tty4" -> "host-name" [color = darkgoldenrod];
|
||||
"term-tty3" -> "host-name" [color = dimgrey];
|
||||
"term-tty2" -> "host-name" [color = darkviolet];
|
||||
"term-tty1" -> "host-name" [color = peachpuff4];
|
||||
"loopback" [label = "loopback", shape = box, fontname = "dejavu sans"];
|
||||
|
||||
}
|
||||
323
doc/local.mk
323
doc/local.mk
@@ -1,323 +0,0 @@
|
||||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
|
||||
# Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
|
||||
# Copyright © 2013 Andreas Enge <andreas@enge.fr>
|
||||
# Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
||||
# Copyright © 2016, 2018 Mathieu Lirzin <mthl@gnu.org>
|
||||
# Copyright © 2018, 2021 Julien Lepiller <julien@lepiller.eu>
|
||||
# Copyright © 2019 Timothy Sample <samplet@ngyro.com>
|
||||
# Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||
# Copyright © 2024 gemmaro <gemmaro.dev@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/>.
|
||||
|
||||
# If adding a language, update the following variables, and info_TEXINFOS.
|
||||
MANUAL_LANGUAGES = de es fr it pt_BR ru zh_CN
|
||||
COOKBOOK_LANGUAGES = de es fr it ko pt_BR ru sk sv ta zh_CN
|
||||
|
||||
# Arg1: A list of languages codes.
|
||||
# Arg2: The file name stem.
|
||||
lang_to_texinfo = $(foreach lang,$(1),%D%/$(2).$(lang).texi)
|
||||
|
||||
# Automake does not understand GNU Make non-standard extensions,
|
||||
# unfortunately, so we cannot use the above patsubst-based function here.
|
||||
info_TEXINFOS = %D%/guix.texi \
|
||||
%D%/guix.de.texi \
|
||||
%D%/guix.es.texi \
|
||||
%D%/guix.fr.texi \
|
||||
%D%/guix.it.texi \
|
||||
%D%/guix.pt_BR.texi \
|
||||
%D%/guix.ru.texi \
|
||||
%D%/guix.zh_CN.texi \
|
||||
%D%/guix-cookbook.texi \
|
||||
%D%/guix-cookbook.de.texi \
|
||||
%D%/guix-cookbook.es.texi \
|
||||
%D%/guix-cookbook.fr.texi \
|
||||
%D%/guix-cookbook.it.texi \
|
||||
%D%/guix-cookbook.ko.texi \
|
||||
%D%/guix-cookbook.pt_BR.texi \
|
||||
%D%/guix-cookbook.ru.texi \
|
||||
%D%/guix-cookbook.sk.texi \
|
||||
%D%/guix-cookbook.sv.texi \
|
||||
%D%/guix-cookbook.ta.texi \
|
||||
%D%/guix-cookbook.zh_CN.texi
|
||||
|
||||
%C%_guix_TEXINFOS = \
|
||||
$(OS_CONFIG_EXAMPLES_TEXI) \
|
||||
%D%/contributing.texi \
|
||||
%D%/fdl-1.3.texi
|
||||
|
||||
DOT_FILES = \
|
||||
%D%/images/bootstrap-graph.dot \
|
||||
%D%/images/bootstrap-packages.dot \
|
||||
%D%/images/coreutils-graph.dot \
|
||||
%D%/images/coreutils-bag-graph.dot \
|
||||
%D%/images/gcc-core-mesboot0-graph.dot \
|
||||
%D%/images/service-graph.dot \
|
||||
%D%/images/shepherd-graph.dot
|
||||
|
||||
DOT_VECTOR_GRAPHICS = \
|
||||
$(DOT_FILES:%.dot=%.eps) \
|
||||
$(DOT_FILES:%.dot=%.pdf)
|
||||
|
||||
EXTRA_DIST += \
|
||||
%D%/htmlxref.cnf \
|
||||
$(DOT_FILES) \
|
||||
$(DOT_VECTOR_GRAPHICS) \
|
||||
%D%/images/coreutils-size-map.eps \
|
||||
%D%/environment-gdb.scm \
|
||||
%D%/package-hello.scm \
|
||||
%D%/package-hello.json
|
||||
|
||||
OS_CONFIG_EXAMPLES_TEXI = \
|
||||
%D%/os-config-bare-bones.texi \
|
||||
%D%/os-config-desktop.texi \
|
||||
%D%/os-config-lightweight-desktop.texi \
|
||||
%D%/he-config-bare-bones.scm
|
||||
|
||||
TRANSLATED_INFO = \
|
||||
$(call lang_to_texinfo,$(MANUAL_LANGUAGES),guix) \
|
||||
$(call lang_to_texinfo,$(MANUAL_LANGUAGES),contributing) \
|
||||
$(call lang_to_texinfo,$(COOKBOOK_LANGUAGES),guix-cookbook)
|
||||
|
||||
# Bundle this file so that makeinfo finds it in out-of-source-tree builds.
|
||||
BUILT_SOURCES += $(OS_CONFIG_EXAMPLES_TEXI) $(TRANSLATED_INFO)
|
||||
EXTRA_DIST += $(OS_CONFIG_EXAMPLES_TEXI) $(TRANSLATED_INFO)
|
||||
MAINTAINERCLEANFILES = $(OS_CONFIG_EXAMPLES_TEXI) $(TRANSLATED_INFO)
|
||||
|
||||
# When a change to guix.texi occurs, it is not translated immediately.
|
||||
# Because @pxref and @xref commands are references to sections by name, they
|
||||
# should be translated. If a modification adds a reference to a section, this
|
||||
# reference is not translated, which means it references a section that does not
|
||||
# exist.
|
||||
define xref_command
|
||||
$(top_srcdir)/pre-inst-env $(GUILE) --no-auto-compile \
|
||||
"$(top_srcdir)/build-aux/convert-xref.scm" \
|
||||
$@.tmp $<
|
||||
endef
|
||||
|
||||
# If /dev/null is used for this POT file path, a warning will be issued
|
||||
# because the path extension is not 'pot'.
|
||||
dummy_pot = $(shell mktemp --suffix=.pot)
|
||||
|
||||
$(srcdir)/%D%/guix.%.texi: po/doc/guix-manual.%.po $(srcdir)/%D%/contributing.%.texi guix/build/po.go
|
||||
-$(AM_V_PO4A)$(PO4A) --no-update \
|
||||
--variable localized="$@.tmp" \
|
||||
--variable master="%D%/guix.texi" \
|
||||
--variable po="$<" \
|
||||
--variable pot=$(dummy_pot) \
|
||||
po/doc/po4a.cfg
|
||||
-sed -i "s|guix\.info|$$(basename "$@" | sed 's|texi$$|info|')|" "$@.tmp"
|
||||
-$(AM_V_POXREF)LC_ALL=en_US.UTF-8 $(xref_command)
|
||||
-mv "$@.tmp" "$@"
|
||||
|
||||
$(srcdir)/%D%/guix-cookbook.%.texi: po/doc/guix-cookbook.%.po guix/build/po.go
|
||||
-$(AM_V_PO4A)$(PO4A) --no-update \
|
||||
--variable localized="$@.tmp" \
|
||||
--variable master="%D%/guix-cookbook.texi" \
|
||||
--variable po="$<" \
|
||||
--variable pot=$(dummy_pot) \
|
||||
po/doc/po4a.cfg
|
||||
-sed -i "s|guix-cookbook\.info|$$(basename "$@" | sed 's|texi$$|info|')|" "$@.tmp"
|
||||
-$(AM_V_POXREF)LC_ALL=en_US.UTF-8 $(xref_command)
|
||||
-mv "$@.tmp" "$@"
|
||||
|
||||
$(srcdir)/%D%/contributing.%.texi: po/doc/guix-manual.%.po guix/build/po.go
|
||||
-$(AM_V_PO4A)$(PO4A) --no-update \
|
||||
--variable localized="$@.tmp" \
|
||||
--variable master="%D%/contributing.texi" \
|
||||
--variable po="$<" \
|
||||
--variable pot=$(dummy_pot) \
|
||||
po/doc/po4a.cfg
|
||||
-$(AM_V_POXREF)LC_ALL=en_US.UTF-8 $(xref_command)
|
||||
-mv "$@.tmp" "$@"
|
||||
|
||||
%D%/os-config-%.texi: gnu/system/examples/%.tmpl
|
||||
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
|
||||
cp "$<" "$@"
|
||||
|
||||
infoimagedir = $(infodir)/images
|
||||
dist_infoimage_DATA = \
|
||||
$(DOT_FILES:%.dot=%.png) \
|
||||
%D%/images/coreutils-size-map.png \
|
||||
%D%/images/installer-network.png \
|
||||
%D%/images/installer-partitions.png \
|
||||
%D%/images/installer-resume.png
|
||||
|
||||
# Ask for warnings about cross-referenced manuals that are not listed in
|
||||
# htmlxref.cnf.
|
||||
AM_MAKEINFOHTMLFLAGS = --set-customization-variable CHECK_HTMLXREF=true
|
||||
|
||||
# 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:
|
||||
$(AM_V_DOT)$(DOT) -Tpng $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"
|
||||
$(AM_V_at)mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
|
||||
|
||||
.dot.pdf:
|
||||
$(AM_V_DOT)set -e; export TZ=UTC0; \
|
||||
$(DOT) -Tpdf $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"
|
||||
$(AM_V_at)sed -ri \
|
||||
-e 's,(/CreationDate \(D:).*\),\119700101000000),' \
|
||||
"$(srcdir)/$@.tmp"
|
||||
$(AM_V_at)mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
|
||||
|
||||
.dot.eps:
|
||||
$(AM_V_DOT)$(DOT) -Teps $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"
|
||||
$(AM_v_at)! grep -q %%CreationDate "$(srcdir)/$@.tmp"
|
||||
$(AM_V_at)mv "$(srcdir)/$@.tmp" "$@"
|
||||
|
||||
.png.eps:
|
||||
$(AM_V_GEN)convert "$<" "$@-tmp.eps"
|
||||
$(AM_V_at)mv "$@-tmp.eps" "$@"
|
||||
|
||||
# We cannot add new dependencies to `%D%/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: $(DOT_FILES=%.dot=$(top_srcdir)/%.pdf)
|
||||
info-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.png)
|
||||
ps-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.eps) \
|
||||
$(top_srcdir)/%D%/images/coreutils-size-map.eps
|
||||
dvi-local: ps-local
|
||||
|
||||
## ----------- ##
|
||||
## Man pages. ##
|
||||
## ----------- ##
|
||||
|
||||
# The man pages are generated using GNU Help2man. In makefiles rules they
|
||||
# depend not on the binary, but on the source files. This usage allows a
|
||||
# manual page to be generated by the maintainer and included in the
|
||||
# distribution without requiring the end-user to have 'help2man' installed.
|
||||
# They are built in $(srcdir) like info manuals.
|
||||
|
||||
sub_commands_mans = \
|
||||
$(srcdir)/%D%/guix-archive.1 \
|
||||
$(srcdir)/%D%/guix-build.1 \
|
||||
$(srcdir)/%D%/guix-challenge.1 \
|
||||
$(srcdir)/%D%/guix-container.1 \
|
||||
$(srcdir)/%D%/guix-deploy.1 \
|
||||
$(srcdir)/%D%/guix-describe.1 \
|
||||
$(srcdir)/%D%/guix-download.1 \
|
||||
$(srcdir)/%D%/guix-edit.1 \
|
||||
$(srcdir)/%D%/guix-environment.1 \
|
||||
$(srcdir)/%D%/guix-gc.1 \
|
||||
$(srcdir)/%D%/guix-git.1 \
|
||||
$(srcdir)/%D%/guix-graph.1 \
|
||||
$(srcdir)/%D%/guix-hash.1 \
|
||||
$(srcdir)/%D%/guix-home.1 \
|
||||
$(srcdir)/%D%/guix-import.1 \
|
||||
$(srcdir)/%D%/guix-lint.1 \
|
||||
$(srcdir)/%D%/guix-offload.1 \
|
||||
$(srcdir)/%D%/guix-pack.1 \
|
||||
$(srcdir)/%D%/guix-package.1 \
|
||||
$(srcdir)/%D%/guix-processes.1 \
|
||||
$(srcdir)/%D%/guix-publish.1 \
|
||||
$(srcdir)/%D%/guix-pull.1 \
|
||||
$(srcdir)/%D%/guix-refresh.1 \
|
||||
$(srcdir)/%D%/guix-repl.1 \
|
||||
$(srcdir)/%D%/guix-shell.1 \
|
||||
$(srcdir)/%D%/guix-size.1 \
|
||||
$(srcdir)/%D%/guix-style.1 \
|
||||
$(srcdir)/%D%/guix-system.1 \
|
||||
$(srcdir)/%D%/guix-time-machine.1 \
|
||||
$(srcdir)/%D%/guix-weather.1
|
||||
|
||||
if HAVE_GUILE_SSH
|
||||
sub_commands_mans += $(srcdir)/%D%/guix-copy.1
|
||||
endif HAVE_GUILE_SSH
|
||||
|
||||
# Assume that cross-compiled commands cannot be executed.
|
||||
if !CROSS_COMPILING
|
||||
|
||||
dist_man1_MANS = \
|
||||
$(srcdir)/%D%/guix.1 \
|
||||
$(sub_commands_mans)
|
||||
|
||||
endif
|
||||
|
||||
gen_man = \
|
||||
LANGUAGE= $(top_builddir)/pre-inst-env $(HELP2MAN) \
|
||||
$(HELP2MANFLAGS)
|
||||
|
||||
HELP2MANFLAGS = --source=GNU --info-page=$(PACKAGE_TARNAME)
|
||||
# help2man reproducibility
|
||||
SOURCE_DATE_EPOCH = $(shell git show HEAD --format=%ct --no-patch 2>/dev/null || echo 1)
|
||||
export SOURCE_DATE_EPOCH
|
||||
|
||||
$(srcdir)/%D%/guix.1: scripts/guix.in $(sub_commands_mans)
|
||||
-$(AM_V_HELP2MAN)$(gen_man) --output="$@" `basename "$@" .1`
|
||||
|
||||
# The 'case' ensures the man pages are only generated if the corresponding
|
||||
# source script (the first prerequisite) has been changed. The $(GOBJECTS)
|
||||
# prerequisite is solely meant to force these docs to be made only after all
|
||||
# Guile modules have been compiled. We also need the guix script to exist.
|
||||
$(srcdir)/%D%/guix-%.1: guix/scripts/%.scm $(GOBJECTS) scripts/guix
|
||||
-@case '$?' in \
|
||||
*$<*) $(AM_V_HELP2MAN:@%=%)$(gen_man) --output="$@" "guix $*";; \
|
||||
*) : ;; \
|
||||
esac
|
||||
|
||||
if BUILD_DAEMON
|
||||
if !CROSS_COMPILING
|
||||
|
||||
dist_man1_MANS += $(srcdir)/%D%/guix-daemon.1
|
||||
|
||||
$(srcdir)/%D%/guix-daemon.1: guix-daemon$(EXEEXT)
|
||||
-$(AM_V_HELP2MAN)$(gen_man) --output="$@" `basename "$@" .1`
|
||||
|
||||
endif
|
||||
endif
|
||||
|
||||
# Reproducible tarball
|
||||
|
||||
DIST_CONFIGURE_FLAGS = \
|
||||
--localstatedir=/var \
|
||||
--sysconfdir=/etc
|
||||
|
||||
# Delete all Autotools-generated files and rerun configure to ensure
|
||||
# a clean cache and distributing reproducible versions.
|
||||
auto-clean: maintainer-clean-vti doc-clean
|
||||
rm -f ABOUT-NLS INSTALL
|
||||
rm -f aclocal.m4 configure libtool Makefile.in
|
||||
if test -e .git; then \
|
||||
git clean -fdx -- '.am*' build-aux m4 po; \
|
||||
else \
|
||||
rm -rf .am*; \
|
||||
$(MAKE) -C po/guix maintainer-clean; \
|
||||
$(MAKE) -C po/packages maintainer-clean; \
|
||||
fi
|
||||
rm -f guile
|
||||
rm -f guix-daemon nix/nix-daemon/guix_daemon-guix-daemon.o
|
||||
# Automake fails if guix-cookbook-LANG.texi stubs are missing; running
|
||||
# autoreconf -vif is not enough.
|
||||
./bootstrap
|
||||
# The dependency chain for the guix-cookbook-LANG.texi was cut on purpose;
|
||||
# they must be deleted to ensure a rebuild.
|
||||
rm -f $(filter-out %D%/guix.texi %D%/guix-cookbook.texi, $(info_TEXINFOS))
|
||||
./configure $(DIST_CONFIGURE_FLAGS)
|
||||
|
||||
# Delete all generated doc files to ensure a clean cache and distributing
|
||||
# reproducible versions.
|
||||
doc-clean:
|
||||
rm -f $(srcdir)/doc/*.1
|
||||
rm -f $(srcdir)/doc/stamp*
|
||||
rm -f $(DOT_FILES:%.dot=%.png)
|
||||
rm -f $(DOT_VECTOR_GRAPHICS)
|
||||
rm -f doc/images/coreutils-size-map.eps
|
||||
@@ -1,31 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "myhello",
|
||||
"version": "2.10",
|
||||
"source": "mirror://gnu/hello/hello-2.10.tar.gz",
|
||||
"build-system": "gnu",
|
||||
"arguments": {
|
||||
"tests?": false
|
||||
},
|
||||
"home-page": "https://www.gnu.org/software/hello/",
|
||||
"synopsis": "Hello, GNU world: An example GNU package",
|
||||
"description": "GNU Hello prints a greeting.",
|
||||
"license": "GPL-3.0+",
|
||||
"native-inputs": ["gettext"]
|
||||
},
|
||||
{
|
||||
"name": "greeter",
|
||||
"version": "1.0",
|
||||
"source": "mirror://gnu/hello/hello-2.10.tar.gz",
|
||||
"build-system": "gnu",
|
||||
"arguments": {
|
||||
"test-target": "foo",
|
||||
"parallel-build?": false
|
||||
},
|
||||
"home-page": "https://example.com/",
|
||||
"synopsis": "Greeter using GNU Hello",
|
||||
"description": "This is a wrapper around GNU Hello.",
|
||||
"license": "GPL-3.0+",
|
||||
"inputs": ["myhello", "hello"]
|
||||
}
|
||||
]
|
||||
61
emacs.am
Normal file
61
emacs.am
Normal file
@@ -0,0 +1,61 @@
|
||||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
#
|
||||
# This file is part of GNU Guix.
|
||||
#
|
||||
# GNU Guix is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or (at
|
||||
# your option) any later version.
|
||||
#
|
||||
# GNU Guix is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
AUTOLOADS = emacs/guix-autoloads.el
|
||||
|
||||
ELFILES = \
|
||||
emacs/guix-backend.el \
|
||||
emacs/guix-base.el \
|
||||
emacs/guix-build-log.el \
|
||||
emacs/guix-command.el \
|
||||
emacs/guix-devel.el \
|
||||
emacs/guix-emacs.el \
|
||||
emacs/guix-external.el \
|
||||
emacs/guix-geiser.el \
|
||||
emacs/guix-guile.el \
|
||||
emacs/guix-help-vars.el \
|
||||
emacs/guix-history.el \
|
||||
emacs/guix-info.el \
|
||||
emacs/guix-init.el \
|
||||
emacs/guix-list.el \
|
||||
emacs/guix-messages.el \
|
||||
emacs/guix-pcomplete.el \
|
||||
emacs/guix-popup.el \
|
||||
emacs/guix-prettify.el \
|
||||
emacs/guix-profiles.el \
|
||||
emacs/guix-read.el \
|
||||
emacs/guix-utils.el \
|
||||
emacs/guix.el
|
||||
|
||||
if HAVE_EMACS
|
||||
|
||||
dist_lisp_DATA = \
|
||||
$(ELFILES) \
|
||||
$(AUTOLOADS)
|
||||
|
||||
nodist_lisp_DATA = emacs/guix-config.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
|
||||
338
emacs/guix-backend.el
Normal file
338
emacs/guix-backend.el
Normal file
@@ -0,0 +1,338 @@
|
||||
;;; guix-backend.el --- Making and using Guix REPL
|
||||
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides the code for interacting with Guile using Guix REPL
|
||||
;; (Geiser REPL with some guix-specific additions).
|
||||
|
||||
;; By default (if `guix-use-guile-server' is non-nil) 2 Guix 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 'geiser-guile)
|
||||
(require 'guix-geiser)
|
||||
(require 'guix-config)
|
||||
(require 'guix-external)
|
||||
(require 'guix-emacs)
|
||||
|
||||
(defvar guix-load-path guix-config-emacs-interface-directory
|
||||
"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.")
|
||||
|
||||
|
||||
;;; 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-eval (str)
|
||||
"Evaluate STR with guile expression using Guix REPL.
|
||||
See `guix-geiser-eval' for details."
|
||||
(guix-geiser-eval str (guix-get-repl-buffer 'internal)))
|
||||
|
||||
(defun guix-eval-read (str)
|
||||
"Evaluate STR with guile expression using Guix REPL.
|
||||
See `guix-geiser-eval-read' for details."
|
||||
(guix-geiser-eval-read str (guix-get-repl-buffer 'internal)))
|
||||
|
||||
(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)
|
||||
(guix-geiser-eval-in-repl str (guix-get-repl-buffer)))
|
||||
|
||||
(provide 'guix-backend)
|
||||
|
||||
;;; guix-backend.el ends here
|
||||
1192
emacs/guix-base.el
Normal file
1192
emacs/guix-base.el
Normal file
File diff suppressed because it is too large
Load Diff
334
emacs/guix-build-log.el
Normal file
334
emacs/guix-build-log.el
Normal file
@@ -0,0 +1,334 @@
|
||||
;;; guix-build-log.el --- Major and minor modes for build logs -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides a major mode (`guix-build-log-mode') and a minor mode
|
||||
;; (`guix-build-log-minor-mode') for highlighting Guix build logs.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defgroup guix-build-log nil
|
||||
"Settings for `guix-build-log-mode'."
|
||||
:group 'guix)
|
||||
|
||||
(defgroup guix-build-log-faces nil
|
||||
"Faces for `guix-build-log-mode'."
|
||||
:group 'guix-build-log
|
||||
:group 'guix-faces)
|
||||
|
||||
(defface guix-build-log-title-head
|
||||
'((t :inherit font-lock-keyword-face))
|
||||
"Face for '@' symbol of a log title."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-title-start
|
||||
'((t :inherit guix-build-log-title-head))
|
||||
"Face for a log title denoting a start of a process."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-title-success
|
||||
'((t :inherit guix-build-log-title-head))
|
||||
"Face for a log title denoting a successful end of a process."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-title-fail
|
||||
'((t :inherit error))
|
||||
"Face for a log title denoting a failed end of a process."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-title-end
|
||||
'((t :inherit guix-build-log-title-head))
|
||||
"Face for a log title denoting an undefined end of a process."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-phase-name
|
||||
'((t :inherit font-lock-function-name-face))
|
||||
"Face for a phase name."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-phase-start
|
||||
'((default :weight bold)
|
||||
(((class grayscale) (background light)) :foreground "Gray90")
|
||||
(((class grayscale) (background dark)) :foreground "DimGray")
|
||||
(((class color) (min-colors 16) (background light))
|
||||
:foreground "DarkGreen")
|
||||
(((class color) (min-colors 16) (background dark))
|
||||
:foreground "LimeGreen")
|
||||
(((class color) (min-colors 8)) :foreground "green"))
|
||||
"Face for the start line of a phase."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-phase-end
|
||||
'((((class grayscale) (background light)) :foreground "Gray90")
|
||||
(((class grayscale) (background dark)) :foreground "DimGray")
|
||||
(((class color) (min-colors 16) (background light))
|
||||
:foreground "ForestGreen")
|
||||
(((class color) (min-colors 16) (background dark))
|
||||
:foreground "LightGreen")
|
||||
(((class color) (min-colors 8)) :foreground "green")
|
||||
(t :weight bold))
|
||||
"Face for the end line of a phase."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-phase-success
|
||||
'((t))
|
||||
"Face for the 'succeeded' word of a phase line."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-phase-fail
|
||||
'((t :inherit error))
|
||||
"Face for the 'failed' word of a phase line."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defface guix-build-log-phase-seconds
|
||||
'((t :inherit font-lock-constant-face))
|
||||
"Face for the number of seconds for a phase."
|
||||
:group 'guix-build-log-faces)
|
||||
|
||||
(defcustom guix-build-log-mode-hook
|
||||
;; Not using `compilation-minor-mode' because it rebinds some standard
|
||||
;; keys, including M-n/M-p.
|
||||
'(compilation-shell-minor-mode view-mode)
|
||||
"Hook run after `guix-build-log-mode' is entered."
|
||||
:type 'hook
|
||||
:group 'guix-build-log)
|
||||
|
||||
(defvar guix-build-log-phase-name-regexp "`\\([^']+\\)'"
|
||||
"Regexp for a phase name.")
|
||||
|
||||
(defvar guix-build-log-phase-start-regexp
|
||||
(concat "^starting phase " guix-build-log-phase-name-regexp)
|
||||
"Regexp for the start line of a 'build' phase.")
|
||||
|
||||
(defun guix-build-log-title-regexp (&optional state)
|
||||
"Return regexp for the log title.
|
||||
STATE is a symbol denoting a state of the title. It should be
|
||||
`start', `fail', `success' or `nil' (for a regexp matching any
|
||||
state)."
|
||||
(let* ((word-rx (rx (1+ (any word "-"))))
|
||||
(state-rx (cond ((eq state 'start) (concat word-rx "started"))
|
||||
((eq state 'success) (concat word-rx "succeeded"))
|
||||
((eq state 'fail) (concat word-rx "failed"))
|
||||
(t word-rx))))
|
||||
(rx-to-string
|
||||
`(and bol (group "@") " " (group (regexp ,state-rx)))
|
||||
t)))
|
||||
|
||||
(defun guix-build-log-phase-end-regexp (&optional state)
|
||||
"Return regexp for the end line of a 'build' phase.
|
||||
STATE is a symbol denoting how a build phase was ended. It should be
|
||||
`fail', `success' or `nil' (for a regexp matching any state)."
|
||||
(let ((state-rx (cond ((eq state 'success) "succeeded")
|
||||
((eq state 'fail) "failed")
|
||||
(t (regexp-opt '("succeeded" "failed"))))))
|
||||
(rx-to-string
|
||||
`(and bol "phase " (regexp ,guix-build-log-phase-name-regexp)
|
||||
" " (group (regexp ,state-rx)) " after "
|
||||
(group (1+ (or digit "."))) " seconds")
|
||||
t)))
|
||||
|
||||
(defvar guix-build-log-phase-end-regexp
|
||||
;; For efficiency, it is better to have a regexp for the general line
|
||||
;; of the phase end, then to call the function all the time.
|
||||
(guix-build-log-phase-end-regexp)
|
||||
"Regexp for the end line of a 'build' phase.")
|
||||
|
||||
(defvar guix-build-log-font-lock-keywords
|
||||
`((,(guix-build-log-title-regexp 'start)
|
||||
(1 'guix-build-log-title-head)
|
||||
(2 'guix-build-log-title-start))
|
||||
(,(guix-build-log-title-regexp 'success)
|
||||
(1 'guix-build-log-title-head)
|
||||
(2 'guix-build-log-title-success))
|
||||
(,(guix-build-log-title-regexp 'fail)
|
||||
(1 'guix-build-log-title-head)
|
||||
(2 'guix-build-log-title-fail))
|
||||
(,(guix-build-log-title-regexp)
|
||||
(1 'guix-build-log-title-head)
|
||||
(2 'guix-build-log-title-end))
|
||||
(,guix-build-log-phase-start-regexp
|
||||
(0 'guix-build-log-phase-start)
|
||||
(1 'guix-build-log-phase-name prepend))
|
||||
(,(guix-build-log-phase-end-regexp 'success)
|
||||
(0 'guix-build-log-phase-end)
|
||||
(1 'guix-build-log-phase-name prepend)
|
||||
(2 'guix-build-log-phase-success prepend)
|
||||
(3 'guix-build-log-phase-seconds prepend))
|
||||
(,(guix-build-log-phase-end-regexp 'fail)
|
||||
(0 'guix-build-log-phase-end)
|
||||
(1 'guix-build-log-phase-name prepend)
|
||||
(2 'guix-build-log-phase-fail prepend)
|
||||
(3 'guix-build-log-phase-seconds prepend)))
|
||||
"A list of `font-lock-keywords' for `guix-build-log-mode'.")
|
||||
|
||||
(defvar guix-build-log-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(set-keymap-parent map special-mode-map)
|
||||
(define-key map (kbd "M-n") 'guix-build-log-next-phase)
|
||||
(define-key map (kbd "M-p") 'guix-build-log-previous-phase)
|
||||
(define-key map (kbd "TAB") 'guix-build-log-phase-toggle)
|
||||
(define-key map (kbd "<tab>") 'guix-build-log-phase-toggle)
|
||||
(define-key map (kbd "<backtab>") 'guix-build-log-phase-toggle-all)
|
||||
(define-key map [(shift tab)] 'guix-build-log-phase-toggle-all)
|
||||
map)
|
||||
"Keymap for `guix-build-log-mode' buffers.")
|
||||
|
||||
(defun guix-build-log-phase-start (&optional with-header?)
|
||||
"Return the start point of the current build phase.
|
||||
If WITH-HEADER? is non-nil, do not skip 'starting phase ...' header.
|
||||
Return nil, if there is no phase start before the current point."
|
||||
(save-excursion
|
||||
(end-of-line)
|
||||
(when (re-search-backward guix-build-log-phase-start-regexp nil t)
|
||||
(unless with-header? (end-of-line))
|
||||
(point))))
|
||||
|
||||
(defun guix-build-log-phase-end ()
|
||||
"Return the end point of the current build phase."
|
||||
(save-excursion
|
||||
(beginning-of-line)
|
||||
(when (re-search-forward guix-build-log-phase-end-regexp nil t)
|
||||
(point))))
|
||||
|
||||
(defun guix-build-log-phase-hide ()
|
||||
"Hide the body of the current build phase."
|
||||
(interactive)
|
||||
(let ((beg (guix-build-log-phase-start))
|
||||
(end (guix-build-log-phase-end)))
|
||||
(when (and beg end)
|
||||
;; If not on the header line, move to it.
|
||||
(when (and (> (point) beg)
|
||||
(< (point) end))
|
||||
(goto-char (guix-build-log-phase-start t)))
|
||||
(remove-overlays beg end 'invisible t)
|
||||
(let ((o (make-overlay beg end)))
|
||||
(overlay-put o 'evaporate t)
|
||||
(overlay-put o 'invisible t)))))
|
||||
|
||||
(defun guix-build-log-phase-show ()
|
||||
"Show the body of the current build phase."
|
||||
(interactive)
|
||||
(let ((beg (guix-build-log-phase-start))
|
||||
(end (guix-build-log-phase-end)))
|
||||
(when (and beg end)
|
||||
(remove-overlays beg end 'invisible t))))
|
||||
|
||||
(defun guix-build-log-phase-hidden-p ()
|
||||
"Return non-nil, if the body of the current build phase is hidden."
|
||||
(let ((beg (guix-build-log-phase-start)))
|
||||
(and beg
|
||||
(cl-some (lambda (o)
|
||||
(overlay-get o 'invisible))
|
||||
(overlays-at beg)))))
|
||||
|
||||
(defun guix-build-log-phase-toggle-function ()
|
||||
"Return a function to toggle the body of the current build phase."
|
||||
(if (guix-build-log-phase-hidden-p)
|
||||
#'guix-build-log-phase-show
|
||||
#'guix-build-log-phase-hide))
|
||||
|
||||
(defun guix-build-log-phase-toggle ()
|
||||
"Show/hide the body of the current build phase."
|
||||
(interactive)
|
||||
(funcall (guix-build-log-phase-toggle-function)))
|
||||
|
||||
(defun guix-build-log-phase-toggle-all ()
|
||||
"Show/hide the bodies of all build phases."
|
||||
(interactive)
|
||||
(save-excursion
|
||||
;; Some phases may be hidden, and some shown. Whether to hide or to
|
||||
;; show them, it is determined by the state of the first phase here.
|
||||
(goto-char (point-min))
|
||||
(let ((fun (save-excursion
|
||||
(re-search-forward guix-build-log-phase-start-regexp nil t)
|
||||
(guix-build-log-phase-toggle-function))))
|
||||
(while (re-search-forward guix-build-log-phase-start-regexp nil t)
|
||||
(funcall fun)))))
|
||||
|
||||
(defun guix-build-log-next-phase (&optional arg)
|
||||
"Move to the next build phase.
|
||||
With ARG, do it that many times. Negative ARG means move
|
||||
backward."
|
||||
(interactive "^p")
|
||||
(if arg
|
||||
(when (zerop arg) (user-error "Try again"))
|
||||
(setq arg 1))
|
||||
(let ((search-fun (if (> arg 0)
|
||||
#'re-search-forward
|
||||
#'re-search-backward))
|
||||
(n (abs arg))
|
||||
found last-found)
|
||||
(save-excursion
|
||||
(end-of-line (if (> arg 0) 1 0)) ; skip the current line
|
||||
(while (and (not (zerop n))
|
||||
(setq found
|
||||
(funcall search-fun
|
||||
guix-build-log-phase-start-regexp
|
||||
nil t)))
|
||||
(setq n (1- n)
|
||||
last-found found)))
|
||||
(when last-found
|
||||
(goto-char last-found)
|
||||
(forward-line 0))
|
||||
(or found
|
||||
(user-error (if (> arg 0)
|
||||
"No next build phase"
|
||||
"No previous build phase")))))
|
||||
|
||||
(defun guix-build-log-previous-phase (&optional arg)
|
||||
"Move to the previous build phase.
|
||||
With ARG, do it that many times. Negative ARG means move
|
||||
forward."
|
||||
(interactive "^p")
|
||||
(guix-build-log-next-phase (- (or arg 1))))
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode guix-build-log-mode special-mode
|
||||
"Guix-Build-Log"
|
||||
"Major mode for viewing Guix build logs.
|
||||
|
||||
\\{guix-build-log-mode-map}"
|
||||
(setq font-lock-defaults '(guix-build-log-font-lock-keywords t)))
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode guix-build-log-minor-mode
|
||||
"Toggle Guix Build Log minor mode.
|
||||
|
||||
With a prefix argument ARG, enable Guix Build Log minor mode if
|
||||
ARG is positive, and disable it otherwise. If called from Lisp,
|
||||
enable the mode if ARG is omitted or nil.
|
||||
|
||||
When Guix Build Log minor mode is enabled, it highlights build
|
||||
log in the current buffer. This mode can be enabled
|
||||
programmatically using hooks:
|
||||
|
||||
(add-hook 'shell-mode-hook 'guix-build-log-minor-mode)"
|
||||
:init-value nil
|
||||
:lighter " Guix-Build-Log"
|
||||
:group 'guix-build-log
|
||||
(if guix-build-log-minor-mode
|
||||
(font-lock-add-keywords nil guix-build-log-font-lock-keywords)
|
||||
(font-lock-remove-keywords nil guix-build-log-font-lock-keywords))
|
||||
(when font-lock-mode
|
||||
(font-lock-fontify-buffer)))
|
||||
|
||||
(provide 'guix-build-log)
|
||||
|
||||
;;; guix-build-log.el ends here
|
||||
718
emacs/guix-command.el
Normal file
718
emacs/guix-command.el
Normal file
@@ -0,0 +1,718 @@
|
||||
;;; guix-command.el --- Popup interface for guix commands -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides a magit-like popup interface for running guix
|
||||
;; commands in Guix REPL. The entry point is "M-x guix". When it is
|
||||
;; called the first time, "guix --help" output is parsed and
|
||||
;; `guix-COMMAND-action' functions are generated for each available guix
|
||||
;; COMMAND. Then a window with these commands is popped up. When a
|
||||
;; particular COMMAND is called, "guix COMMAND --help" output is parsed,
|
||||
;; and a user get a new popup window with available options for this
|
||||
;; command and so on.
|
||||
|
||||
;; To avoid hard-coding all guix options, actions, etc., as much data is
|
||||
;; taken from "guix ... --help" outputs as possible. But this data is
|
||||
;; still incomplete: not all long options have short analogs, also
|
||||
;; special readers should be used for some options (for example, to
|
||||
;; complete package names while prompting for a package). So after
|
||||
;; parsing --help output, the arguments are "improved". All arguments
|
||||
;; (switches, options and actions) are `guix-command-argument'
|
||||
;; structures.
|
||||
|
||||
;; Only "M-x guix" command is available after this file is loaded. The
|
||||
;; rest commands/actions/popups are generated on the fly only when they
|
||||
;; are needed (that's why there is a couple of `eval'-s in this file).
|
||||
|
||||
;; COMMANDS argument is used by many functions in this file. It means a
|
||||
;; list of guix commands without "guix" itself, e.g.: ("build"),
|
||||
;; ("import" "gnu"). The empty list stands for the plain "guix" without
|
||||
;; subcommands.
|
||||
|
||||
;; All actions in popup windows are divided into 2 groups:
|
||||
;;
|
||||
;; - 'Popup' actions - used to pop up another window. For example, every
|
||||
;; action in the 'guix' or 'guix import' window is a popup action. They
|
||||
;; are defined by `guix-command-define-popup-action' macro.
|
||||
;;
|
||||
;; - 'Execute' actions - used to do something with the command line (to
|
||||
;; run a command in Guix REPL or to copy it into kill-ring) constructed
|
||||
;; with the current popup. They are defined by
|
||||
;; `guix-command-define-execute-action' macro.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'guix-popup)
|
||||
(require 'guix-utils)
|
||||
(require 'guix-help-vars)
|
||||
(require 'guix-read)
|
||||
(require 'guix-base)
|
||||
(require 'guix-guile)
|
||||
(require 'guix-external)
|
||||
|
||||
(defgroup guix-commands nil
|
||||
"Settings for guix popup windows."
|
||||
:group 'guix)
|
||||
|
||||
(defvar guix-command-complex-with-shared-arguments
|
||||
'("system")
|
||||
"List of guix commands which have subcommands with shared options.
|
||||
I.e., 'guix foo --help' is the same as 'guix foo bar --help'.")
|
||||
|
||||
(defun guix-command-action-name (&optional commands &rest name-parts)
|
||||
"Return name of action function for guix COMMANDS."
|
||||
(guix-command-symbol (append commands name-parts (list "action"))))
|
||||
|
||||
|
||||
;;; Command arguments
|
||||
|
||||
(cl-defstruct (guix-command-argument
|
||||
(:constructor guix-command-make-argument)
|
||||
(:copier guix-command-copy-argument))
|
||||
name char doc fun switch? option? action?)
|
||||
|
||||
(cl-defun guix-command-modify-argument
|
||||
(argument &key
|
||||
(name nil name-bound?)
|
||||
(char nil char-bound?)
|
||||
(doc nil doc-bound?)
|
||||
(fun nil fun-bound?)
|
||||
(switch? nil switch?-bound?)
|
||||
(option? nil option?-bound?)
|
||||
(action? nil action?-bound?))
|
||||
"Return a modified version of ARGUMENT."
|
||||
(declare (indent 1))
|
||||
(let ((copy (guix-command-copy-argument argument)))
|
||||
(and name-bound? (setf (guix-command-argument-name copy) name))
|
||||
(and char-bound? (setf (guix-command-argument-char copy) char))
|
||||
(and doc-bound? (setf (guix-command-argument-doc copy) doc))
|
||||
(and fun-bound? (setf (guix-command-argument-fun copy) fun))
|
||||
(and switch?-bound? (setf (guix-command-argument-switch? copy) switch?))
|
||||
(and option?-bound? (setf (guix-command-argument-option? copy) option?))
|
||||
(and action?-bound? (setf (guix-command-argument-action? copy) action?))
|
||||
copy))
|
||||
|
||||
(defun guix-command-modify-argument-from-alist (argument alist)
|
||||
"Return a modified version of ARGUMENT or nil if it wasn't modified.
|
||||
Each assoc from ALIST have a form (NAME . PLIST). NAME is an
|
||||
argument name. PLIST is a property list of argument parameters
|
||||
to be modified."
|
||||
(let* ((name (guix-command-argument-name argument))
|
||||
(plist (guix-assoc-value alist name)))
|
||||
(when plist
|
||||
(apply #'guix-command-modify-argument
|
||||
argument plist))))
|
||||
|
||||
(defmacro guix-command-define-argument-improver (name alist)
|
||||
"Define NAME variable and function to modify an argument from ALIST."
|
||||
(declare (indent 1))
|
||||
`(progn
|
||||
(defvar ,name ,alist)
|
||||
(defun ,name (argument)
|
||||
(guix-command-modify-argument-from-alist argument ,name))))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-action-argument
|
||||
'(("graph" :char ?G)
|
||||
("environment" :char ?E)
|
||||
("publish" :char ?u)
|
||||
("pull" :char ?P)
|
||||
("size" :char ?z)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-common-argument
|
||||
'(("--help" :switch? nil)
|
||||
("--version" :switch? nil)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-target-argument
|
||||
'(("--target" :char ?T)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-system-type-argument
|
||||
'(("--system" :fun guix-read-system-type)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-load-path-argument
|
||||
'(("--load-path" :fun read-directory-name)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-search-paths-argument
|
||||
'(("--search-paths" :char ?P)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-substitute-urls-argument
|
||||
'(("--substitute-urls" :char ?U)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-hash-argument
|
||||
'(("--format" :fun guix-read-hash-format)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-key-policy-argument
|
||||
'(("--key-download" :fun guix-read-key-policy)))
|
||||
|
||||
(defvar guix-command-improve-common-build-argument
|
||||
'(("--no-substitutes" :char ?s)
|
||||
("--no-build-hook" :char ?h)
|
||||
("--max-silent-time" :char ?x)))
|
||||
|
||||
(defun guix-command-improve-common-build-argument (argument)
|
||||
(guix-command-modify-argument-from-alist
|
||||
argument
|
||||
(append guix-command-improve-load-path-argument
|
||||
guix-command-improve-substitute-urls-argument
|
||||
guix-command-improve-common-build-argument)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-archive-argument
|
||||
'(("--generate-key" :char ?k)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-build-argument
|
||||
'(("--no-grafts" :char ?g)
|
||||
("--root" :fun guix-read-file-name)
|
||||
("--sources" :char ?S :fun guix-read-source-type :switch? nil)
|
||||
("--with-source" :fun guix-read-file-name)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-environment-argument
|
||||
'(("--exec" :fun read-shell-command)
|
||||
("--load" :fun guix-read-file-name)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-gc-argument
|
||||
'(("--list-dead" :char ?D)
|
||||
("--list-live" :char ?L)
|
||||
("--referrers" :char ?f)
|
||||
("--verify" :fun guix-read-verify-options-string)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-graph-argument
|
||||
'(("--type" :fun guix-read-graph-type)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-import-argument
|
||||
'(("cran" :char ?r)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-import-elpa-argument
|
||||
'(("--archive" :fun guix-read-elpa-archive)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-lint-argument
|
||||
'(("--checkers" :fun guix-read-lint-checker-names-string)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-package-argument
|
||||
;; Unlike all other options, --install/--remove do not have a form
|
||||
;; '--install=foo,bar' but '--install foo bar' instead, so we need
|
||||
;; some tweaks.
|
||||
'(("--install"
|
||||
:name "--install " :fun guix-read-package-names-string
|
||||
:switch? nil :option? t)
|
||||
("--remove"
|
||||
:name "--remove " :fun guix-read-package-names-string
|
||||
:switch? nil :option? t)
|
||||
("--install-from-file" :fun guix-read-file-name)
|
||||
("--manifest" :fun guix-read-file-name)
|
||||
("--do-not-upgrade" :char ?U)
|
||||
("--roll-back" :char ?R)
|
||||
("--show" :char ?w :fun guix-read-package-name)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-refresh-argument
|
||||
'(("--select" :fun guix-read-refresh-subset)
|
||||
("--key-server" :char ?S)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-size-argument
|
||||
'(("--map-file" :fun guix-read-file-name)))
|
||||
|
||||
(guix-command-define-argument-improver
|
||||
guix-command-improve-system-argument
|
||||
'(("disk-image" :char ?D)
|
||||
("vm-image" :char ?V)
|
||||
("--on-error" :char ?E)
|
||||
("--no-grub" :char ?g)
|
||||
("--full-boot" :char ?b)))
|
||||
|
||||
(defvar guix-command-argument-improvers
|
||||
'((()
|
||||
guix-command-improve-action-argument)
|
||||
(("archive")
|
||||
guix-command-improve-common-build-argument
|
||||
guix-command-improve-target-argument
|
||||
guix-command-improve-system-type-argument
|
||||
guix-command-improve-archive-argument)
|
||||
(("build")
|
||||
guix-command-improve-common-build-argument
|
||||
guix-command-improve-target-argument
|
||||
guix-command-improve-system-type-argument
|
||||
guix-command-improve-build-argument)
|
||||
(("download")
|
||||
guix-command-improve-hash-argument)
|
||||
(("hash")
|
||||
guix-command-improve-hash-argument)
|
||||
(("environment")
|
||||
guix-command-improve-common-build-argument
|
||||
guix-command-improve-search-paths-argument
|
||||
guix-command-improve-system-type-argument
|
||||
guix-command-improve-environment-argument)
|
||||
(("gc")
|
||||
guix-command-improve-gc-argument)
|
||||
(("graph")
|
||||
guix-command-improve-graph-argument)
|
||||
(("import")
|
||||
guix-command-improve-import-argument)
|
||||
(("import" "gnu")
|
||||
guix-command-improve-key-policy-argument)
|
||||
(("import" "elpa")
|
||||
guix-command-improve-import-elpa-argument)
|
||||
(("lint")
|
||||
guix-command-improve-lint-argument)
|
||||
(("package")
|
||||
guix-command-improve-common-build-argument
|
||||
guix-command-improve-search-paths-argument
|
||||
guix-command-improve-package-argument)
|
||||
(("refresh")
|
||||
guix-command-improve-key-policy-argument
|
||||
guix-command-improve-refresh-argument)
|
||||
(("size")
|
||||
guix-command-improve-system-type-argument
|
||||
guix-command-improve-substitute-urls-argument
|
||||
guix-command-improve-size-argument)
|
||||
(("system")
|
||||
guix-command-improve-common-build-argument
|
||||
guix-command-improve-system-argument))
|
||||
"Alist of guix commands and argument improvers for them.")
|
||||
|
||||
(defun guix-command-improve-argument (argument improvers)
|
||||
"Return ARGUMENT modified with IMPROVERS."
|
||||
(or (cl-some (lambda (improver)
|
||||
(funcall improver argument))
|
||||
improvers)
|
||||
argument))
|
||||
|
||||
(defun guix-command-improve-arguments (arguments commands)
|
||||
"Return ARGUMENTS for 'guix COMMANDS ...' modified for popup interface."
|
||||
(let ((improvers (cons 'guix-command-improve-common-argument
|
||||
(guix-assoc-value guix-command-argument-improvers
|
||||
commands))))
|
||||
(mapcar (lambda (argument)
|
||||
(guix-command-improve-argument argument improvers))
|
||||
arguments)))
|
||||
|
||||
(defun guix-command-parse-arguments (&optional commands)
|
||||
"Return a list of parsed 'guix COMMANDS ...' arguments."
|
||||
(with-temp-buffer
|
||||
(insert (guix-help-string commands))
|
||||
(let (args)
|
||||
(guix-while-search guix-help-parse-option-regexp
|
||||
(let* ((short (match-string-no-properties 1))
|
||||
(name (match-string-no-properties 2))
|
||||
(arg (match-string-no-properties 3))
|
||||
(doc (match-string-no-properties 4))
|
||||
(char (if short
|
||||
(elt short 1) ; short option letter
|
||||
(elt name 2))) ; first letter of the long option
|
||||
;; If "--foo=bar" or "--foo[=bar]" then it is 'option'.
|
||||
(option? (not (string= "" arg)))
|
||||
;; If "--foo" or "--foo[=bar]" then it is 'switch'.
|
||||
(switch? (or (string= "" arg)
|
||||
(eq ?\[ (elt arg 0)))))
|
||||
(push (guix-command-make-argument
|
||||
:name name
|
||||
:char char
|
||||
:doc doc
|
||||
:switch? switch?
|
||||
:option? option?)
|
||||
args)))
|
||||
(guix-while-search guix-help-parse-command-regexp
|
||||
(let* ((name (match-string-no-properties 1))
|
||||
(char (elt name 0)))
|
||||
(push (guix-command-make-argument
|
||||
:name name
|
||||
:char char
|
||||
:fun (guix-command-action-name commands name)
|
||||
:action? t)
|
||||
args)))
|
||||
args)))
|
||||
|
||||
(defun guix-command-rest-argument (&optional commands)
|
||||
"Return '--' argument for COMMANDS."
|
||||
(cl-flet ((argument (&rest args)
|
||||
(apply #'guix-command-make-argument
|
||||
:name "-- " :char ?= :option? t args)))
|
||||
(let ((command (car commands)))
|
||||
(cond
|
||||
((member command '("archive" "build" "graph" "edit"
|
||||
"environment" "lint" "refresh"))
|
||||
(argument :doc "Packages" :fun 'guix-read-package-names-string))
|
||||
((string= command "download")
|
||||
(argument :doc "URL"))
|
||||
((string= command "gc")
|
||||
(argument :doc "Paths" :fun 'guix-read-file-name))
|
||||
((member command '("hash" "system"))
|
||||
(argument :doc "File" :fun 'guix-read-file-name))
|
||||
((string= command "size")
|
||||
(argument :doc "Package" :fun 'guix-read-package-name))
|
||||
((equal commands '("import" "nix"))
|
||||
(argument :doc "Nixpkgs Attribute"))
|
||||
;; Other 'guix import' subcommands, but not 'import' itself.
|
||||
((and (cdr commands)
|
||||
(string= command "import"))
|
||||
(argument :doc "Package name"))))))
|
||||
|
||||
(defun guix-command-additional-arguments (&optional commands)
|
||||
"Return additional arguments for COMMANDS."
|
||||
(let ((rest-arg (guix-command-rest-argument commands)))
|
||||
(and rest-arg (list rest-arg))))
|
||||
|
||||
;; Ideally only `guix-command-arguments' function should exist with the
|
||||
;; contents of `guix-command-all-arguments', but we need to make a
|
||||
;; special case for `guix-command-complex-with-shared-arguments' commands.
|
||||
|
||||
(defun guix-command-all-arguments (&optional commands)
|
||||
"Return list of all arguments for 'guix COMMANDS ...'."
|
||||
(let ((parsed (guix-command-parse-arguments commands)))
|
||||
(append (guix-command-improve-arguments parsed commands)
|
||||
(guix-command-additional-arguments commands))))
|
||||
|
||||
(guix-memoized-defalias guix-command-all-arguments-memoize
|
||||
guix-command-all-arguments)
|
||||
|
||||
(defun guix-command-arguments (&optional commands)
|
||||
"Return list of arguments for 'guix COMMANDS ...'."
|
||||
(let ((command (car commands)))
|
||||
(if (member command
|
||||
guix-command-complex-with-shared-arguments)
|
||||
;; Take actions only for 'guix system', and switches+options for
|
||||
;; 'guix system foo'.
|
||||
(funcall (if (null (cdr commands))
|
||||
#'cl-remove-if-not
|
||||
#'cl-remove-if)
|
||||
#'guix-command-argument-action?
|
||||
(guix-command-all-arguments-memoize (list command)))
|
||||
(guix-command-all-arguments commands))))
|
||||
|
||||
(defun guix-command-switch->popup-switch (switch)
|
||||
"Return popup switch from command SWITCH argument."
|
||||
(list (guix-command-argument-char switch)
|
||||
(or (guix-command-argument-doc switch)
|
||||
"Unknown")
|
||||
(guix-command-argument-name switch)))
|
||||
|
||||
(defun guix-command-option->popup-option (option)
|
||||
"Return popup option from command OPTION argument."
|
||||
(list (guix-command-argument-char option)
|
||||
(or (guix-command-argument-doc option)
|
||||
"Unknown")
|
||||
(let ((name (guix-command-argument-name option)))
|
||||
(if (string-match-p " \\'" name) ; ends with space
|
||||
name
|
||||
(concat name "=")))
|
||||
(or (guix-command-argument-fun option)
|
||||
'read-from-minibuffer)))
|
||||
|
||||
(defun guix-command-action->popup-action (action)
|
||||
"Return popup action from command ACTION argument."
|
||||
(list (guix-command-argument-char action)
|
||||
(or (guix-command-argument-doc action)
|
||||
(guix-command-argument-name action)
|
||||
"Unknown")
|
||||
(guix-command-argument-fun action)))
|
||||
|
||||
(defun guix-command-sort-arguments (arguments)
|
||||
"Sort ARGUMENTS by name in alphabetical order."
|
||||
(sort arguments
|
||||
(lambda (a1 a2)
|
||||
(let ((name1 (guix-command-argument-name a1))
|
||||
(name2 (guix-command-argument-name a2)))
|
||||
(cond ((null name1) nil)
|
||||
((null name2) t)
|
||||
(t (string< name1 name2)))))))
|
||||
|
||||
(defun guix-command-switches (arguments)
|
||||
"Return switches from ARGUMENTS."
|
||||
(cl-remove-if-not #'guix-command-argument-switch? arguments))
|
||||
|
||||
(defun guix-command-options (arguments)
|
||||
"Return options from ARGUMENTS."
|
||||
(cl-remove-if-not #'guix-command-argument-option? arguments))
|
||||
|
||||
(defun guix-command-actions (arguments)
|
||||
"Return actions from ARGUMENTS."
|
||||
(cl-remove-if-not #'guix-command-argument-action? arguments))
|
||||
|
||||
(defun guix-command-post-process-args (args)
|
||||
"Adjust appropriately command line ARGS returned from popup command."
|
||||
;; XXX We need to split "--install foo bar" and similar strings into
|
||||
;; lists of strings. But some commands (e.g., 'guix hash') accept a
|
||||
;; file name as the 'rest' argument, and as file names may contain
|
||||
;; spaces, splitting by spaces will break such names. For example, the
|
||||
;; following argument: "-- /tmp/file with spaces" will be transformed
|
||||
;; into the following list: ("--" "/tmp/file" "with" "spaces") instead
|
||||
;; of the wished ("--" "/tmp/file with spaces").
|
||||
(let* (rest
|
||||
(rx (rx string-start
|
||||
(or "-- " "--install " "--remove ")))
|
||||
(args (mapcar (lambda (arg)
|
||||
(if (string-match-p rx arg)
|
||||
(progn (push (split-string arg) rest)
|
||||
nil)
|
||||
arg))
|
||||
args)))
|
||||
(if rest
|
||||
(apply #'append (delq nil args) rest)
|
||||
args)))
|
||||
|
||||
|
||||
;;; 'Execute' actions
|
||||
|
||||
(defvar guix-command-default-execute-arguments
|
||||
(list
|
||||
(guix-command-make-argument
|
||||
:name "repl" :char ?r :doc "Run in Guix REPL")
|
||||
(guix-command-make-argument
|
||||
:name "shell" :char ?s :doc "Run in shell")
|
||||
(guix-command-make-argument
|
||||
:name "copy" :char ?c :doc "Copy command line"))
|
||||
"List of default 'execute' action arguments.")
|
||||
|
||||
(defvar guix-command-additional-execute-arguments
|
||||
(let ((graph-arg (guix-command-make-argument
|
||||
:name "view" :char ?v :doc "View graph")))
|
||||
`((("build")
|
||||
,(guix-command-make-argument
|
||||
:name "log" :char ?l :doc "View build log"))
|
||||
(("graph") ,graph-arg)
|
||||
(("size")
|
||||
,(guix-command-make-argument
|
||||
:name "view" :char ?v :doc "View map"))
|
||||
(("system" "dmd-graph") ,graph-arg)
|
||||
(("system" "extension-graph") ,graph-arg)))
|
||||
"Alist of guix commands and additional 'execute' action arguments.")
|
||||
|
||||
(defun guix-command-execute-arguments (commands)
|
||||
"Return a list of 'execute' action arguments for COMMANDS."
|
||||
(mapcar (lambda (arg)
|
||||
(guix-command-modify-argument arg
|
||||
:action? t
|
||||
:fun (guix-command-action-name
|
||||
commands (guix-command-argument-name arg))))
|
||||
(append guix-command-default-execute-arguments
|
||||
(guix-assoc-value
|
||||
guix-command-additional-execute-arguments commands))))
|
||||
|
||||
(defvar guix-command-special-executors
|
||||
'((("environment")
|
||||
("repl" . guix-run-environment-command-in-repl))
|
||||
(("pull")
|
||||
("repl" . guix-run-pull-command-in-repl))
|
||||
(("build")
|
||||
("log" . guix-run-view-build-log))
|
||||
(("graph")
|
||||
("view" . guix-run-view-graph))
|
||||
(("size")
|
||||
("view" . guix-run-view-size-map))
|
||||
(("system" "dmd-graph")
|
||||
("view" . guix-run-view-graph))
|
||||
(("system" "extension-graph")
|
||||
("view" . guix-run-view-graph)))
|
||||
"Alist of guix commands and alists of special executers for them.
|
||||
See also `guix-command-default-executors'.")
|
||||
|
||||
(defvar guix-command-default-executors
|
||||
'(("repl" . guix-run-command-in-repl)
|
||||
("shell" . guix-run-command-in-shell)
|
||||
("copy" . guix-copy-command-as-kill))
|
||||
"Alist of default executers for action names.")
|
||||
|
||||
(defun guix-command-executor (commands name)
|
||||
"Return function to run command line arguments for guix COMMANDS."
|
||||
(or (guix-assoc-value guix-command-special-executors commands name)
|
||||
(guix-assoc-value guix-command-default-executors name)))
|
||||
|
||||
(defun guix-run-environment-command-in-repl (args)
|
||||
"Run 'guix ARGS ...' environment command in Guix REPL."
|
||||
;; As 'guix environment' usually tries to run another process, it may
|
||||
;; be fun but not wise to run this command in Geiser REPL.
|
||||
(when (or (member "--dry-run" args)
|
||||
(member "--search-paths" args)
|
||||
(when (y-or-n-p
|
||||
(format "'%s' command will spawn an external process.
|
||||
Do you really want to execute this command in Geiser REPL? "
|
||||
(guix-command-string args)))
|
||||
(message "May \"M-x shell-mode\" be with you!")
|
||||
t))
|
||||
(guix-run-command-in-repl args)))
|
||||
|
||||
(defun guix-run-pull-command-in-repl (args)
|
||||
"Run 'guix ARGS ...' pull command in Guix REPL.
|
||||
Perform pull-specific actions after operation, see
|
||||
`guix-after-pull-hook' and `guix-update-after-pull'."
|
||||
(guix-eval-in-repl
|
||||
(apply #'guix-make-guile-expression 'guix-command args)
|
||||
nil 'pull))
|
||||
|
||||
(defun guix-run-view-build-log (args)
|
||||
"Add --log-file to ARGS, run 'guix ARGS ...' build command, and
|
||||
open the log file(s)."
|
||||
(let* ((args (if (member "--log-file" args)
|
||||
args
|
||||
(apply #'list (car args) "--log-file" (cdr args))))
|
||||
(output (guix-command-output args))
|
||||
(files (split-string output "\n" t)))
|
||||
(dolist (file files)
|
||||
(guix-find-file-or-url file)
|
||||
(guix-build-log-mode))))
|
||||
|
||||
(defun guix-run-view-graph (args)
|
||||
"Run 'guix ARGS ...' graph command, make the image and open it."
|
||||
(let* ((graph-file (guix-dot-file-name))
|
||||
(dot-args (guix-dot-arguments graph-file)))
|
||||
(if (guix-eval-read (guix-make-guile-expression
|
||||
'pipe-guix-output args dot-args))
|
||||
(guix-find-file graph-file)
|
||||
(error "Couldn't create a graph"))))
|
||||
|
||||
(defun guix-run-view-size-map (args)
|
||||
"Run 'guix ARGS ...' size command, and open the map file."
|
||||
(let* ((wished-map-file
|
||||
(cl-some (lambda (arg)
|
||||
(and (string-match "--map-file=\\(.+\\)" arg)
|
||||
(match-string 1 arg)))
|
||||
args))
|
||||
(map-file (or wished-map-file (guix-png-file-name)))
|
||||
(args (if wished-map-file
|
||||
args
|
||||
(apply #'list
|
||||
(car args)
|
||||
(concat "--map-file=" map-file)
|
||||
(cdr args)))))
|
||||
(guix-command-output args)
|
||||
(guix-find-file map-file)))
|
||||
|
||||
|
||||
;;; Generating popups, actions, etc.
|
||||
|
||||
(defmacro guix-command-define-popup-action (name &optional commands)
|
||||
"Define NAME function to generate (if needed) and run popup for COMMANDS."
|
||||
(declare (indent 1) (debug t))
|
||||
(let* ((popup-fun (guix-command-symbol `(,@commands "popup")))
|
||||
(doc (format "Call `%s' (generate it if needed)."
|
||||
popup-fun)))
|
||||
`(defun ,name (&optional arg)
|
||||
,doc
|
||||
(interactive "P")
|
||||
(unless (fboundp ',popup-fun)
|
||||
(guix-command-generate-popup ',popup-fun ',commands))
|
||||
(,popup-fun arg))))
|
||||
|
||||
(defmacro guix-command-define-execute-action (name executor
|
||||
&optional commands)
|
||||
"Define NAME function to execute the current action for guix COMMANDS.
|
||||
EXECUTOR function is called with the current command line arguments."
|
||||
(declare (indent 1) (debug t))
|
||||
(let* ((arguments-fun (guix-command-symbol `(,@commands "arguments")))
|
||||
(doc (format "Call `%s' with the current popup arguments."
|
||||
executor)))
|
||||
`(defun ,name (&rest args)
|
||||
,doc
|
||||
(interactive (,arguments-fun))
|
||||
(,executor (append ',commands
|
||||
(guix-command-post-process-args args))))))
|
||||
|
||||
(defun guix-command-generate-popup-actions (actions &optional commands)
|
||||
"Generate 'popup' commands from ACTIONS arguments for guix COMMANDS."
|
||||
(dolist (action actions)
|
||||
(let ((fun (guix-command-argument-fun action)))
|
||||
(unless (fboundp fun)
|
||||
(eval `(guix-command-define-popup-action ,fun
|
||||
,(append commands
|
||||
(list (guix-command-argument-name action)))))))))
|
||||
|
||||
(defun guix-command-generate-execute-actions (actions &optional commands)
|
||||
"Generate 'execute' commands from ACTIONS arguments for guix COMMANDS."
|
||||
(dolist (action actions)
|
||||
(let ((fun (guix-command-argument-fun action)))
|
||||
(unless (fboundp fun)
|
||||
(eval `(guix-command-define-execute-action ,fun
|
||||
,(guix-command-executor
|
||||
commands (guix-command-argument-name action))
|
||||
,commands))))))
|
||||
|
||||
(defun guix-command-generate-popup (name &optional commands)
|
||||
"Define NAME popup with 'guix COMMANDS ...' interface."
|
||||
(let* ((command (car commands))
|
||||
(man-page (concat "guix" (and command (concat "-" command))))
|
||||
(doc (format "Popup window for '%s' command."
|
||||
(guix-concat-strings (cons "guix" commands)
|
||||
" ")))
|
||||
(args (guix-command-arguments commands))
|
||||
(switches (guix-command-sort-arguments
|
||||
(guix-command-switches args)))
|
||||
(options (guix-command-sort-arguments
|
||||
(guix-command-options args)))
|
||||
(popup-actions (guix-command-sort-arguments
|
||||
(guix-command-actions args)))
|
||||
(execute-actions (unless popup-actions
|
||||
(guix-command-execute-arguments commands)))
|
||||
(actions (or popup-actions execute-actions)))
|
||||
(if popup-actions
|
||||
(guix-command-generate-popup-actions popup-actions commands)
|
||||
(guix-command-generate-execute-actions execute-actions commands))
|
||||
(eval
|
||||
`(guix-define-popup ,name
|
||||
,doc
|
||||
'guix-commands
|
||||
:man-page ,man-page
|
||||
:switches ',(mapcar #'guix-command-switch->popup-switch switches)
|
||||
:options ',(mapcar #'guix-command-option->popup-option options)
|
||||
:actions ',(mapcar #'guix-command-action->popup-action actions)
|
||||
:max-action-columns 4))))
|
||||
|
||||
;;;###autoload (autoload 'guix "guix-command" "Popup window for 'guix'." t)
|
||||
(guix-command-define-popup-action guix)
|
||||
|
||||
(defalias 'guix-edit-action #'guix-edit)
|
||||
|
||||
|
||||
(defvar guix-command-font-lock-keywords
|
||||
(eval-when-compile
|
||||
`((,(rx "("
|
||||
(group "guix-command-define-"
|
||||
(or "popup-action"
|
||||
"execute-action"
|
||||
"argument-improver"))
|
||||
symbol-end
|
||||
(zero-or-more blank)
|
||||
(zero-or-one
|
||||
(group (one-or-more (or (syntax word) (syntax symbol))))))
|
||||
(1 font-lock-keyword-face)
|
||||
(2 font-lock-function-name-face nil t)))))
|
||||
|
||||
(font-lock-add-keywords 'emacs-lisp-mode guix-command-font-lock-keywords)
|
||||
|
||||
(provide 'guix-command)
|
||||
|
||||
;;; guix-command.el ends here
|
||||
38
emacs/guix-config.el.in
Normal file
38
emacs/guix-config.el.in
Normal file
@@ -0,0 +1,38 @@
|
||||
;;; guix-config.el --- Compile-time configuration of Guix.
|
||||
|
||||
;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defconst guix-config-emacs-interface-directory
|
||||
(replace-regexp-in-string "${prefix}" "@prefix@" "@emacsuidir@"))
|
||||
|
||||
(defconst guix-config-state-directory
|
||||
;; This must match `NIX_STATE_DIR' as defined in `daemon.am'.
|
||||
(or (getenv "NIX_STATE_DIR") "@guix_localstatedir@/guix"))
|
||||
|
||||
(defconst guix-config-guile-program "@GUILE@"
|
||||
"Name of the 'guile' executable defined at configure time.")
|
||||
|
||||
(defconst guix-config-dot-program "@DOT_USER_PROGRAM@"
|
||||
"Name of the 'dot' executable defined at configure time.")
|
||||
|
||||
(provide 'guix-config)
|
||||
|
||||
;;; guix-config.el ends here
|
||||
375
emacs/guix-devel.el
Normal file
375
emacs/guix-devel.el
Normal file
@@ -0,0 +1,375 @@
|
||||
;;; guix-devel.el --- Development tools -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides commands useful for developing Guix (or even
|
||||
;; arbitrary Guile code) with Geiser.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'lisp-mode)
|
||||
(require 'guix-guile)
|
||||
(require 'guix-geiser)
|
||||
(require 'guix-utils)
|
||||
(require 'guix-base)
|
||||
|
||||
(defgroup guix-devel nil
|
||||
"Settings for Guix development utils."
|
||||
:group 'guix)
|
||||
|
||||
(defgroup guix-devel-faces nil
|
||||
"Faces for `guix-devel-mode'."
|
||||
:group 'guix-devel
|
||||
:group 'guix-faces)
|
||||
|
||||
(defface guix-devel-modify-phases-keyword
|
||||
'((t :inherit font-lock-preprocessor-face))
|
||||
"Face for a `modify-phases' keyword ('delete', 'replace', etc.)."
|
||||
:group 'guix-devel-faces)
|
||||
|
||||
(defface guix-devel-gexp-symbol
|
||||
'((t :inherit font-lock-keyword-face))
|
||||
"Face for gexp symbols ('#~', '#$', etc.).
|
||||
See Info node `(guix) G-Expressions'."
|
||||
:group 'guix-devel-faces)
|
||||
|
||||
(defcustom guix-devel-activate-mode t
|
||||
"If non-nil, then `guix-devel-mode' is automatically activated
|
||||
in Scheme buffers."
|
||||
:type 'boolean
|
||||
:group 'guix-devel)
|
||||
|
||||
(defun guix-devel-use-modules (&rest modules)
|
||||
"Use guile MODULES."
|
||||
(apply #'guix-geiser-call "use-modules" modules))
|
||||
|
||||
(defun guix-devel-use-module (&optional module)
|
||||
"Use guile MODULE in the current Geiser REPL.
|
||||
MODULE is a string with the module name - e.g., \"(ice-9 match)\".
|
||||
Interactively, use the module defined by the current scheme file."
|
||||
(interactive (list (guix-guile-current-module)))
|
||||
(guix-devel-use-modules module)
|
||||
(message "Using %s module." module))
|
||||
|
||||
(defun guix-devel-copy-module-as-kill ()
|
||||
"Put the name of the current guile module into `kill-ring'."
|
||||
(interactive)
|
||||
(guix-copy-as-kill (guix-guile-current-module)))
|
||||
|
||||
(defun guix-devel-setup-repl (&optional repl)
|
||||
"Setup REPL for using `guix-devel-...' commands."
|
||||
(guix-devel-use-modules "(guix monad-repl)"
|
||||
"(guix scripts)"
|
||||
"(guix store)"
|
||||
"(guix ui)")
|
||||
;; Without this workaround, the warning/build output disappears. See
|
||||
;; <https://github.com/jaor/geiser/issues/83> for details.
|
||||
(guix-geiser-eval-in-repl-synchronously
|
||||
"(begin
|
||||
(guix-warning-port (current-warning-port))
|
||||
(current-build-output-port (current-error-port)))"
|
||||
repl 'no-history 'no-display))
|
||||
|
||||
(defvar guix-devel-repl-processes nil
|
||||
"List of REPL processes configured by `guix-devel-setup-repl'.")
|
||||
|
||||
(defun guix-devel-setup-repl-maybe (&optional repl)
|
||||
"Setup (if needed) REPL for using `guix-devel-...' commands."
|
||||
(let ((process (get-buffer-process (or repl (guix-geiser-repl)))))
|
||||
(when (and process
|
||||
(not (memq process guix-devel-repl-processes)))
|
||||
(guix-devel-setup-repl repl)
|
||||
(push process guix-devel-repl-processes))))
|
||||
|
||||
(defmacro guix-devel-with-definition (def-var &rest body)
|
||||
"Run BODY with the current guile definition bound to DEF-VAR.
|
||||
Bind DEF-VAR variable to the name of the current top-level
|
||||
definition, setup the current REPL, use the current module, and
|
||||
run BODY."
|
||||
(declare (indent 1) (debug (symbolp body)))
|
||||
`(let ((,def-var (guix-guile-current-definition)))
|
||||
(guix-devel-setup-repl-maybe)
|
||||
(guix-devel-use-modules (guix-guile-current-module))
|
||||
,@body))
|
||||
|
||||
(defun guix-devel-build-package-definition ()
|
||||
"Build a package defined by the current top-level variable definition."
|
||||
(interactive)
|
||||
(guix-devel-with-definition def
|
||||
(when (or (not guix-operation-confirm)
|
||||
(guix-operation-prompt (format "Build '%s'?" def)))
|
||||
(guix-geiser-eval-in-repl
|
||||
(concat ",run-in-store "
|
||||
(guix-guile-make-call-expression
|
||||
"build-package" def
|
||||
"#:use-substitutes?" (guix-guile-boolean
|
||||
guix-use-substitutes)
|
||||
"#:dry-run?" (guix-guile-boolean guix-dry-run)))))))
|
||||
|
||||
(defun guix-devel-build-package-source ()
|
||||
"Build the source of the current package definition."
|
||||
(interactive)
|
||||
(guix-devel-with-definition def
|
||||
(when (or (not guix-operation-confirm)
|
||||
(guix-operation-prompt
|
||||
(format "Build '%s' package source?" def)))
|
||||
(guix-geiser-eval-in-repl
|
||||
(concat ",run-in-store "
|
||||
(guix-guile-make-call-expression
|
||||
"build-package-source" def
|
||||
"#:use-substitutes?" (guix-guile-boolean
|
||||
guix-use-substitutes)
|
||||
"#:dry-run?" (guix-guile-boolean guix-dry-run)))))))
|
||||
|
||||
(defun guix-devel-lint-package ()
|
||||
"Check the current package.
|
||||
See Info node `(guix) Invoking guix lint' for details."
|
||||
(interactive)
|
||||
(guix-devel-with-definition def
|
||||
(guix-devel-use-modules "(guix scripts lint)")
|
||||
(when (or (not guix-operation-confirm)
|
||||
(y-or-n-p (format "Lint '%s' package?" def)))
|
||||
(guix-geiser-eval-in-repl
|
||||
(format "(run-checkers %s)" def)))))
|
||||
|
||||
|
||||
;;; Font-lock
|
||||
|
||||
(defvar guix-devel-modify-phases-keyword-regexp
|
||||
(rx (+ word))
|
||||
"Regexp for a 'modify-phases' keyword ('delete', 'replace', etc.).")
|
||||
|
||||
(defun guix-devel-modify-phases-font-lock-matcher (limit)
|
||||
"Find a 'modify-phases' keyword.
|
||||
This function is used as a MATCHER for `font-lock-keywords'."
|
||||
(ignore-errors
|
||||
(down-list)
|
||||
(or (re-search-forward guix-devel-modify-phases-keyword-regexp
|
||||
limit t)
|
||||
(set-match-data nil))
|
||||
(up-list)
|
||||
t))
|
||||
|
||||
(defun guix-devel-modify-phases-font-lock-pre ()
|
||||
"Skip the next sexp, and return the end point of the current list.
|
||||
This function is used as a PRE-MATCH-FORM for `font-lock-keywords'
|
||||
to find 'modify-phases' keywords."
|
||||
(let ((in-comment? (nth 4 (syntax-ppss))))
|
||||
;; If 'modify-phases' is commented, do not try to search for its
|
||||
;; keywords.
|
||||
(unless in-comment?
|
||||
(ignore-errors (forward-sexp))
|
||||
(save-excursion (up-list) (point)))))
|
||||
|
||||
(defconst guix-devel-keywords
|
||||
'("call-with-compressed-output-port"
|
||||
"call-with-container"
|
||||
"call-with-decompressed-port"
|
||||
"call-with-derivation-narinfo"
|
||||
"call-with-derivation-substitute"
|
||||
"call-with-error-handling"
|
||||
"call-with-temporary-directory"
|
||||
"call-with-temporary-output-file"
|
||||
"define-enumerate-type"
|
||||
"define-gexp-compiler"
|
||||
"define-lift"
|
||||
"define-monad"
|
||||
"define-operation"
|
||||
"define-record-type*"
|
||||
"emacs-substitute-sexps"
|
||||
"emacs-substitute-variables"
|
||||
"mbegin"
|
||||
"mlet"
|
||||
"mlet*"
|
||||
"munless"
|
||||
"mwhen"
|
||||
"run-with-state"
|
||||
"run-with-store"
|
||||
"signature-case"
|
||||
"substitute*"
|
||||
"substitute-keyword-arguments"
|
||||
"test-assertm"
|
||||
"use-package-modules"
|
||||
"use-service-modules"
|
||||
"use-system-modules"
|
||||
"with-atomic-file-output"
|
||||
"with-atomic-file-replacement"
|
||||
"with-derivation-narinfo"
|
||||
"with-derivation-substitute"
|
||||
"with-directory-excursion"
|
||||
"with-error-handling"
|
||||
"with-monad"
|
||||
"with-mutex"
|
||||
"with-store"))
|
||||
|
||||
(defvar guix-devel-font-lock-keywords
|
||||
`((,(rx (or "#~" "#$" "#$@" "#+" "#+@")) .
|
||||
'guix-devel-gexp-symbol)
|
||||
(,(guix-guile-keyword-regexp (regexp-opt guix-devel-keywords))
|
||||
(1 'font-lock-keyword-face))
|
||||
(,(guix-guile-keyword-regexp "modify-phases")
|
||||
(1 'font-lock-keyword-face)
|
||||
(guix-devel-modify-phases-font-lock-matcher
|
||||
(guix-devel-modify-phases-font-lock-pre)
|
||||
nil
|
||||
(0 'guix-devel-modify-phases-keyword nil t))))
|
||||
"A list of `font-lock-keywords' for `guix-devel-mode'.")
|
||||
|
||||
|
||||
;;; Indentation
|
||||
|
||||
(defmacro guix-devel-scheme-indent (&rest rules)
|
||||
"Set `scheme-indent-function' according to RULES.
|
||||
Each rule should have a form (SYMBOL VALUE). See `put' for details."
|
||||
(declare (indent 0))
|
||||
`(progn
|
||||
,@(mapcar (lambda (rule)
|
||||
`(put ',(car rule) 'scheme-indent-function ,(cadr rule)))
|
||||
rules)))
|
||||
|
||||
(defun guix-devel-indent-package (state indent-point normal-indent)
|
||||
"Indentation rule for 'package' form."
|
||||
(let* ((package-eol (line-end-position))
|
||||
(count (if (and (ignore-errors (down-list) t)
|
||||
(< (point) package-eol)
|
||||
(looking-at "inherit\\>"))
|
||||
1
|
||||
0)))
|
||||
(lisp-indent-specform count state indent-point normal-indent)))
|
||||
|
||||
(defun guix-devel-indent-modify-phases-keyword (count)
|
||||
"Return indentation function for 'modify-phases' keywords."
|
||||
(lambda (state indent-point normal-indent)
|
||||
(when (ignore-errors
|
||||
(goto-char (nth 1 state)) ; start of keyword sexp
|
||||
(backward-up-list)
|
||||
(looking-at "(modify-phases\\>"))
|
||||
(lisp-indent-specform count state indent-point normal-indent))))
|
||||
|
||||
(defalias 'guix-devel-indent-modify-phases-keyword-1
|
||||
(guix-devel-indent-modify-phases-keyword 1))
|
||||
(defalias 'guix-devel-indent-modify-phases-keyword-2
|
||||
(guix-devel-indent-modify-phases-keyword 2))
|
||||
|
||||
(guix-devel-scheme-indent
|
||||
(bag 0)
|
||||
(build-system 0)
|
||||
(call-with-compressed-output-port 2)
|
||||
(call-with-container 1)
|
||||
(call-with-decompressed-port 2)
|
||||
(call-with-error-handling 0)
|
||||
(container-excursion 1)
|
||||
(emacs-batch-edit-file 1)
|
||||
(emacs-batch-eval 0)
|
||||
(emacs-substitute-sexps 1)
|
||||
(emacs-substitute-variables 1)
|
||||
(file-system 0)
|
||||
(graft 0)
|
||||
(manifest-entry 0)
|
||||
(manifest-pattern 0)
|
||||
(mbegin 1)
|
||||
(mlet 2)
|
||||
(mlet* 2)
|
||||
(modify-phases 1)
|
||||
(munless 1)
|
||||
(mwhen 1)
|
||||
(operating-system 0)
|
||||
(origin 0)
|
||||
(package 'guix-devel-indent-package)
|
||||
(run-with-state 1)
|
||||
(run-with-store 1)
|
||||
(signature-case 1)
|
||||
(substitute* 1)
|
||||
(substitute-keyword-arguments 1)
|
||||
(test-assertm 1)
|
||||
(with-atomic-file-output 1)
|
||||
(with-derivation-narinfo 1)
|
||||
(with-derivation-substitute 2)
|
||||
(with-directory-excursion 1)
|
||||
(with-error-handling 0)
|
||||
(with-monad 1)
|
||||
(with-mutex 1)
|
||||
(with-store 1)
|
||||
(wrap-program 1)
|
||||
|
||||
;; 'modify-phases' keywords:
|
||||
(replace 'guix-devel-indent-modify-phases-keyword-1)
|
||||
(add-after 'guix-devel-indent-modify-phases-keyword-2)
|
||||
(add-before 'guix-devel-indent-modify-phases-keyword-2))
|
||||
|
||||
|
||||
(defvar guix-devel-keys-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map (kbd "b") 'guix-devel-build-package-definition)
|
||||
(define-key map (kbd "s") 'guix-devel-build-package-source)
|
||||
(define-key map (kbd "l") 'guix-devel-lint-package)
|
||||
(define-key map (kbd "k") 'guix-devel-copy-module-as-kill)
|
||||
(define-key map (kbd "u") 'guix-devel-use-module)
|
||||
map)
|
||||
"Keymap with subkeys for `guix-devel-mode-map'.")
|
||||
|
||||
(defvar guix-devel-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map (kbd "C-c .") guix-devel-keys-map)
|
||||
map)
|
||||
"Keymap for `guix-devel-mode'.")
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode guix-devel-mode
|
||||
"Minor mode for `scheme-mode' buffers.
|
||||
|
||||
With a prefix argument ARG, enable the mode if ARG is positive,
|
||||
and disable it otherwise. If called from Lisp, enable the mode
|
||||
if ARG is omitted or nil.
|
||||
|
||||
When Guix Devel mode is enabled, it provides the following key
|
||||
bindings:
|
||||
|
||||
\\{guix-devel-mode-map}"
|
||||
:init-value nil
|
||||
:lighter " Guix"
|
||||
:keymap guix-devel-mode-map
|
||||
(if guix-devel-mode
|
||||
(progn
|
||||
(setq-local font-lock-multiline t)
|
||||
(font-lock-add-keywords nil guix-devel-font-lock-keywords))
|
||||
(setq-local font-lock-multiline nil)
|
||||
(font-lock-remove-keywords nil guix-devel-font-lock-keywords))
|
||||
(when font-lock-mode
|
||||
(font-lock-fontify-buffer)))
|
||||
|
||||
;;;###autoload
|
||||
(defun guix-devel-activate-mode-maybe ()
|
||||
"Activate `guix-devel-mode' depending on
|
||||
`guix-devel-activate-mode' variable."
|
||||
(when guix-devel-activate-mode
|
||||
(guix-devel-mode)))
|
||||
|
||||
|
||||
(defvar guix-devel-emacs-font-lock-keywords
|
||||
(eval-when-compile
|
||||
`((,(rx "(" (group "guix-devel-with-definition") symbol-end) . 1))))
|
||||
|
||||
(font-lock-add-keywords 'emacs-lisp-mode
|
||||
guix-devel-emacs-font-lock-keywords)
|
||||
|
||||
(provide 'guix-devel)
|
||||
|
||||
;;; guix-devel.el ends here
|
||||
103
emacs/guix-emacs.el
Normal file
103
emacs/guix-emacs.el
Normal file
@@ -0,0 +1,103 @@
|
||||
;;; 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)
|
||||
(require 'cl-lib)
|
||||
|
||||
(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-in-directory (directory)
|
||||
"Return list of Emacs 'autoloads' files in DIRECTORY."
|
||||
(directory-files directory 'full-name "-autoloads\\.el\\'" 'no-sort))
|
||||
|
||||
(defun guix-emacs-subdirs (directory)
|
||||
"Return list of DIRECTORY subdirectories."
|
||||
(cl-remove-if (lambda (file)
|
||||
(or (string-match-p (rx "/." string-end) file)
|
||||
(string-match-p (rx "/.." string-end) file)
|
||||
(not (file-directory-p file))))
|
||||
(directory-files directory 'full-name nil 'no-sort)))
|
||||
|
||||
(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 ((elisp-root-dir (guix-emacs-directory profile)))
|
||||
(if (file-directory-p elisp-root-dir)
|
||||
(let ((elisp-pkgs-dir (expand-file-name "guix.d" elisp-root-dir))
|
||||
(root-autoloads (guix-emacs-find-autoloads-in-directory
|
||||
elisp-root-dir)))
|
||||
(if (file-directory-p elisp-pkgs-dir)
|
||||
(let ((pkgs-autoloads
|
||||
(cl-mapcan #'guix-emacs-find-autoloads-in-directory
|
||||
(guix-emacs-subdirs elisp-pkgs-dir))))
|
||||
(append root-autoloads pkgs-autoloads))
|
||||
root-autoloads))
|
||||
(message "Directory '%s' does not exist." elisp-root-dir)
|
||||
nil)))
|
||||
|
||||
;;;###autoload
|
||||
(defun guix-emacs-load-autoloads (&optional all)
|
||||
"Load autoloads for Emacs packages installed in a user profile.
|
||||
Add autoloads directories to `load-path'.
|
||||
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)
|
||||
(cl-pushnew (file-name-directory file) load-path
|
||||
:test #'string=)
|
||||
(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
|
||||
88
emacs/guix-external.el
Normal file
88
emacs/guix-external.el
Normal file
@@ -0,0 +1,88 @@
|
||||
;;; guix-external.el --- External programs -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides auxiliary code for running external programs.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'guix-config)
|
||||
|
||||
(defgroup guix-external nil
|
||||
"Settings for external programs."
|
||||
:group 'guix)
|
||||
|
||||
(defcustom guix-guile-program guix-config-guile-program
|
||||
"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."
|
||||
:type 'string
|
||||
:group 'guix-external)
|
||||
|
||||
(defcustom guix-dot-program
|
||||
(if (file-name-absolute-p guix-config-dot-program)
|
||||
guix-config-dot-program
|
||||
(executable-find "dot"))
|
||||
"Name of the 'dot' executable."
|
||||
:type 'string
|
||||
:group 'guix-external)
|
||||
|
||||
(defcustom guix-dot-default-arguments
|
||||
'("-Tpng")
|
||||
"Default arguments for 'dot' program."
|
||||
:type '(repeat string)
|
||||
:group 'guix-external)
|
||||
|
||||
(defcustom guix-dot-file-name-function #'guix-png-file-name
|
||||
"Function used to define a file name of a temporary 'dot' file.
|
||||
The function is called without arguments."
|
||||
:type '(choice (function-item guix-png-file-name)
|
||||
(function :tag "Other function"))
|
||||
:group 'guix-external)
|
||||
|
||||
(defun guix-dot-arguments (output-file &rest args)
|
||||
"Return a list of dot arguments for writing a graph into OUTPUT-FILE.
|
||||
If ARGS is nil, use `guix-dot-default-arguments'."
|
||||
(or guix-dot-program
|
||||
(error (concat "Couldn't find 'dot'.\n"
|
||||
"Set guix-dot-program to a proper value")))
|
||||
(apply #'list
|
||||
guix-dot-program
|
||||
(concat "-o" output-file)
|
||||
(or args guix-dot-default-arguments)))
|
||||
|
||||
(defun guix-dot-file-name ()
|
||||
"Call `guix-dot-file-name-function'."
|
||||
(funcall guix-dot-file-name-function))
|
||||
|
||||
(defun guix-png-file-name ()
|
||||
"Return '.png' file name in the `temporary-file-directory'."
|
||||
(concat (make-temp-name
|
||||
(concat (file-name-as-directory temporary-file-directory)
|
||||
"guix-emacs-graph-"))
|
||||
".png"))
|
||||
|
||||
(provide 'guix-external)
|
||||
|
||||
;;; guix-external.el ends here
|
||||
114
emacs/guix-geiser.el
Normal file
114
emacs/guix-geiser.el
Normal file
@@ -0,0 +1,114 @@
|
||||
;;; guix-geiser.el --- Interacting with Geiser -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides functions to evaluate guile code using Geiser.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'geiser-mode)
|
||||
(require 'guix-guile)
|
||||
|
||||
(defun guix-geiser-repl ()
|
||||
"Return the current Geiser REPL."
|
||||
(or geiser-repl--repl
|
||||
(geiser-repl--repl/impl 'guile)
|
||||
(error "Geiser REPL not found")))
|
||||
|
||||
(defun guix-geiser-eval (str &optional repl)
|
||||
"Evaluate STR with guile expression using Geiser REPL.
|
||||
If REPL is nil, use the current Geiser REPL.
|
||||
Return a list of strings with result values of evaluation."
|
||||
(with-current-buffer (or repl (guix-geiser-repl))
|
||||
(let ((res (geiser-eval--send/wait `(:eval (:scm ,str)))))
|
||||
(if (geiser-eval--retort-error res)
|
||||
(error "Error in evaluating guile expression: %s"
|
||||
(geiser-eval--retort-output res))
|
||||
(cdr (assq 'result res))))))
|
||||
|
||||
(defun guix-geiser-eval-read (str &optional repl)
|
||||
"Evaluate STR with guile expression using Geiser REPL.
|
||||
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-geiser-eval str repl))))))
|
||||
|
||||
(defun guix-repl-send (cmd &optional save-history)
|
||||
"Send CMD input string to the current REPL buffer.
|
||||
This is the same as `geiser-repl--send', but with SAVE-HISTORY
|
||||
argument. If SAVE-HISTORY is non-nil, save CMD in the REPL
|
||||
history."
|
||||
(when (and cmd (eq major-mode 'geiser-repl-mode))
|
||||
(geiser-repl--prepare-send)
|
||||
(goto-char (point-max))
|
||||
(comint-kill-input)
|
||||
(insert cmd)
|
||||
(let ((comint-input-filter (if save-history
|
||||
comint-input-filter
|
||||
'ignore)))
|
||||
(comint-send-input nil t))))
|
||||
|
||||
(defun guix-geiser-eval-in-repl (str &optional repl no-history no-display)
|
||||
"Switch to Geiser REPL and evaluate STR with guile expression there.
|
||||
If NO-HISTORY is non-nil, do not save STR in the REPL history.
|
||||
If NO-DISPLAY is non-nil, do not switch to the REPL buffer."
|
||||
(let ((repl (or repl (guix-geiser-repl))))
|
||||
(with-current-buffer repl
|
||||
;; XXX Since Geiser 0.8, `geiser-repl--send' has SAVE-HISTORY
|
||||
;; argument, so use this function eventually and remove
|
||||
;; `guix-repl-send'.
|
||||
(guix-repl-send str (not no-history)))
|
||||
(unless no-display
|
||||
(geiser-repl--switch-to-buffer repl))))
|
||||
|
||||
(defun guix-geiser-eval-in-repl-synchronously (str &optional repl
|
||||
no-history no-display)
|
||||
"Evaluate STR in Geiser REPL synchronously, i.e. wait until the
|
||||
REPL operation will be finished.
|
||||
See `guix-geiser-eval-in-repl' for the meaning of arguments."
|
||||
(let* ((repl (if repl (get-buffer repl) (guix-geiser-repl)))
|
||||
(running? nil)
|
||||
(filter (lambda (output)
|
||||
(setq running?
|
||||
(and (get-buffer-process repl)
|
||||
(not (guix-guile-prompt? output))))))
|
||||
(comint-output-filter-functions
|
||||
(cons filter comint-output-filter-functions)))
|
||||
(guix-geiser-eval-in-repl str repl no-history no-display)
|
||||
(while running?
|
||||
(sleep-for 0.1))))
|
||||
|
||||
(defun guix-geiser-call (proc &rest args)
|
||||
"Call (PROC ARGS ...) synchronously using the current Geiser REPL.
|
||||
PROC and ARGS should be strings."
|
||||
(guix-geiser-eval
|
||||
(apply #'guix-guile-make-call-expression proc args)))
|
||||
|
||||
(defun guix-geiser-call-in-repl (proc &rest args)
|
||||
"Call (PROC ARGS ...) in the current Geiser REPL.
|
||||
PROC and ARGS should be strings."
|
||||
(guix-geiser-eval-in-repl
|
||||
(apply #'guix-guile-make-call-expression proc args)))
|
||||
|
||||
(provide 'guix-geiser)
|
||||
|
||||
;;; guix-geiser.el ends here
|
||||
98
emacs/guix-guile.el
Normal file
98
emacs/guix-guile.el
Normal file
@@ -0,0 +1,98 @@
|
||||
;;; guix-guile.el --- Auxiliary tools for working with guile code -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides functions for parsing guile code, making guile
|
||||
;; expressions, etc.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'geiser-guile)
|
||||
|
||||
(defvar guix-guile-definition-regexp
|
||||
(rx bol "(define"
|
||||
(zero-or-one "*")
|
||||
(zero-or-one "-public")
|
||||
(one-or-more space)
|
||||
(zero-or-one "(")
|
||||
(group (one-or-more (or word (syntax symbol)))))
|
||||
"Regexp used to find the guile definition.")
|
||||
|
||||
(defun guix-guile-current-definition ()
|
||||
"Return string with name of the current top-level guile definition."
|
||||
(save-excursion
|
||||
(beginning-of-defun)
|
||||
(if (looking-at guix-guile-definition-regexp)
|
||||
(match-string-no-properties 1)
|
||||
(error "Couldn't find the current definition"))))
|
||||
|
||||
(defun guix-guile-current-module ()
|
||||
"Return a string with the current guile module.
|
||||
Return nil, if current buffer does not define a module."
|
||||
;; Modified version of `geiser-guile--get-module'.
|
||||
(save-excursion
|
||||
(geiser-syntax--pop-to-top)
|
||||
(when (or (re-search-backward geiser-guile--module-re nil t)
|
||||
(looking-at geiser-guile--library-re)
|
||||
(re-search-forward geiser-guile--module-re nil t))
|
||||
(match-string-no-properties 1))))
|
||||
|
||||
(defun guix-guile-boolean (arg)
|
||||
"Return a string with guile boolean value.
|
||||
Transform elisp ARG (nil or non-nil) to the guile boolean (#f or #t)."
|
||||
(concat "#" (prin1-to-string (if arg 't 'f))))
|
||||
|
||||
(defun guix-guile-keyword-regexp (keyword)
|
||||
"Return regexp to find guile KEYWORD."
|
||||
(format "(\\(%s\\)\\_>" keyword))
|
||||
|
||||
(defun guix-guile-make-call-expression (proc &rest args)
|
||||
"Return \"(PROC ARGS ...)\" string.
|
||||
PROC and ARGS should be strings."
|
||||
(format "(%s %s)"
|
||||
proc
|
||||
(mapconcat #'identity args " ")))
|
||||
|
||||
(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-guile-prompt? (string)
|
||||
"Return non-nil, if STRING contains a Guile prompt."
|
||||
(or (string-match-p geiser-guile--prompt-regexp string)
|
||||
(string-match-p geiser-guile--debugger-prompt-regexp string)))
|
||||
|
||||
(provide 'guix-guile)
|
||||
|
||||
;;; guix-guile.el ends here
|
||||
108
emacs/guix-help-vars.el
Normal file
108
emacs/guix-help-vars.el
Normal file
@@ -0,0 +1,108 @@
|
||||
;;; guix-help-vars.el --- Variables related to --help output
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides regular expressions to parse various "guix
|
||||
;; ... --help" outputs and lists of non-receivable items (system types,
|
||||
;; hash formats, etc.).
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
;;; Regexps for parsing "guix ..." outputs
|
||||
|
||||
(defvar guix-help-parse-option-regexp
|
||||
(rx bol " "
|
||||
(zero-or-one (group "-" (not (any "- ")))
|
||||
",")
|
||||
(one-or-more " ")
|
||||
(group "--" (one-or-more (or wordchar "-")))
|
||||
(group (zero-or-one "[")
|
||||
(zero-or-one "="))
|
||||
(zero-or-more (not space))
|
||||
(one-or-more space)
|
||||
(group (one-or-more any)))
|
||||
"Common regexp used to find command options.")
|
||||
|
||||
(defvar guix-help-parse-command-regexp
|
||||
(rx bol " "
|
||||
(group wordchar (one-or-more (or wordchar "-"))))
|
||||
"Regexp used to find guix commands.
|
||||
'Command' means any option not prefixed with '-'. For example,
|
||||
guix subcommand, system action, importer, etc.")
|
||||
|
||||
(defvar guix-help-parse-long-option-regexp
|
||||
(rx (or " " ", ")
|
||||
(group "--" (one-or-more (or wordchar "-"))
|
||||
(zero-or-one "=")))
|
||||
"Regexp used to find long options.")
|
||||
|
||||
(defvar guix-help-parse-short-option-regexp
|
||||
(rx bol (one-or-more blank)
|
||||
"-" (group (not (any "- "))))
|
||||
"Regexp used to find short options.")
|
||||
|
||||
(defvar guix-help-parse-package-regexp
|
||||
(rx bol (group (one-or-more (not blank))))
|
||||
"Regexp used to find names of the packages.")
|
||||
|
||||
(defvar guix-help-parse-list-regexp
|
||||
(rx bol (zero-or-more blank) "- "
|
||||
(group (one-or-more (or wordchar "-"))))
|
||||
"Regexp used to find various lists (lint checkers, graph types).")
|
||||
|
||||
(defvar guix-help-parse-regexp-group 1
|
||||
"Parenthesized expression of regexps used to find commands and
|
||||
options.")
|
||||
|
||||
|
||||
;;; Non-receivable lists of system types, hash formats, etc.
|
||||
|
||||
(defvar guix-help-system-types
|
||||
'("x86_64-linux" "i686-linux" "armhf-linux" "mips64el-linux")
|
||||
"List of supported systems.")
|
||||
|
||||
(defvar guix-help-source-types
|
||||
'("package" "all" "transitive")
|
||||
"List of supported sources types.")
|
||||
|
||||
(defvar guix-help-hash-formats
|
||||
'("nix-base32" "base32" "base16" "hex" "hexadecimal")
|
||||
"List of supported hash formats.")
|
||||
|
||||
(defvar guix-help-refresh-subsets
|
||||
'("core" "non-core")
|
||||
"List of supported 'refresh' subsets.")
|
||||
|
||||
(defvar guix-help-key-policies
|
||||
'("interactive" "always" "never")
|
||||
"List of supported key download policies.")
|
||||
|
||||
(defvar guix-help-verify-options
|
||||
'("repair" "contents")
|
||||
"List of supported 'verify' options")
|
||||
|
||||
(defvar guix-help-elpa-archives
|
||||
'("gnu" "melpa" "melpa-stable")
|
||||
"List of supported ELPA archives.")
|
||||
|
||||
(provide 'guix-help-vars)
|
||||
|
||||
;;; guix-help-vars.el ends here
|
||||
65
emacs/guix-helper.scm.in
Normal file
65
emacs/guix-helper.scm.in
Normal file
@@ -0,0 +1,65 @@
|
||||
;;; 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
emacs/guix-history.el
Normal file
92
emacs/guix-history.el
Normal file
@@ -0,0 +1,92 @@
|
||||
;;; 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
|
||||
886
emacs/guix-info.el
Normal file
886
emacs/guix-info.el
Normal file
@@ -0,0 +1,886 @@
|
||||
;;; guix-info.el --- Info buffers for displaying entries -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
;; 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 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)
|
||||
|
||||
(defgroup guix-info-faces nil
|
||||
"Faces for info buffers."
|
||||
:group 'guix-info
|
||||
:group 'guix-faces)
|
||||
|
||||
(defface guix-info-param-title
|
||||
'((t :inherit font-lock-type-face))
|
||||
"Face used for titles of parameters."
|
||||
:group 'guix-info-faces)
|
||||
|
||||
(defface guix-info-file-path
|
||||
'((t :inherit link))
|
||||
"Face used for file paths."
|
||||
:group 'guix-info-faces)
|
||||
|
||||
(defface guix-info-url
|
||||
'((t :inherit link))
|
||||
"Face used for URLs."
|
||||
:group 'guix-info-faces)
|
||||
|
||||
(defface guix-info-time
|
||||
'((t :inherit font-lock-constant-face))
|
||||
"Face used for timestamps."
|
||||
:group 'guix-info-faces)
|
||||
|
||||
(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-faces)
|
||||
|
||||
(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-faces)
|
||||
|
||||
(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-assq-value 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-assq-value 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-assq-value 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 (list guix-root-map 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-faces)
|
||||
|
||||
(defface guix-package-info-name
|
||||
'((t :inherit font-lock-keyword-face))
|
||||
"Face used for a name of a package."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(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-faces)
|
||||
|
||||
(defface guix-package-info-version
|
||||
'((t :inherit font-lock-builtin-face))
|
||||
"Face used for a version of a package."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(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-faces)
|
||||
|
||||
(defface guix-package-info-description
|
||||
'((t))
|
||||
"Face used for a description of a package."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(defface guix-package-info-license
|
||||
'((t :inherit font-lock-string-face))
|
||||
"Face used for a license of a package."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(defface guix-package-info-location
|
||||
'((t :inherit link))
|
||||
"Face used for a location of a package."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(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-faces)
|
||||
|
||||
(defface guix-package-info-uninstalled-outputs
|
||||
'((t :weight bold))
|
||||
"Face used for uninstalled outputs of a package."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(defface guix-package-info-obsolete
|
||||
'((t :inherit error))
|
||||
"Face used if a package is obsolete."
|
||||
:group 'guix-package-info-faces)
|
||||
|
||||
(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.")
|
||||
|
||||
(defcustom guix-package-info-fill-heading t
|
||||
"If nil, insert heading parameters in a raw form, without
|
||||
filling them to fit the window."
|
||||
:type 'boolean
|
||||
:group 'guix-package-info)
|
||||
|
||||
(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-assq-value entry 'name) " "
|
||||
(guix-assq-value entry 'version))
|
||||
'guix-package-info-heading)
|
||||
(insert "\n\n")
|
||||
(mapc (lambda (param)
|
||||
(let ((val (guix-assq-value entry param))
|
||||
(face (guix-get-symbol (symbol-name param)
|
||||
'info 'package)))
|
||||
(when val
|
||||
(let* ((col (min (window-width) fill-column))
|
||||
(val (if guix-package-info-fill-heading
|
||||
(guix-get-filled-string val col)
|
||||
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-faces)
|
||||
|
||||
(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-assq-value entry 'obsolete)
|
||||
(guix-package-info-insert-obsolete-text))
|
||||
(and (guix-assq-value entry 'non-unique)
|
||||
(guix-assq-value 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-assq-value entry 'installed))
|
||||
(obsolete (guix-assq-value entry 'obsolete))
|
||||
(installed-entry (cl-find-if
|
||||
(lambda (entry)
|
||||
(string= (guix-assq-value 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-assq-value entry 'package-id)
|
||||
(guix-assq-value 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-faces)
|
||||
|
||||
(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-assq-value 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-assq-value entry 'source-file))
|
||||
(entry-id (guix-assq-value entry 'id))
|
||||
(package-id (or (guix-assq-value 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-assq-value 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-assq-value entry 'installed))
|
||||
(obsolete (guix-assq-value 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-faces)
|
||||
|
||||
(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-faces)
|
||||
|
||||
(defface guix-generation-info-not-current
|
||||
'((t nil))
|
||||
"Face used if a generation is not the current one."
|
||||
:group 'guix-generation-info-faces)
|
||||
|
||||
(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-assq-value entry 'number))))
|
||||
|
||||
(provide 'guix-info)
|
||||
|
||||
;;; guix-info.el ends here
|
||||
19
emacs/guix-init.el
Normal file
19
emacs/guix-init.el
Normal file
@@ -0,0 +1,19 @@
|
||||
(require 'guix-autoloads)
|
||||
(require 'guix-emacs)
|
||||
|
||||
(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))
|
||||
|
||||
(add-hook 'scheme-mode-hook 'guix-devel-activate-mode-maybe)
|
||||
|
||||
(provide 'guix-init)
|
||||
894
emacs/guix-list.el
Normal file
894
emacs/guix-list.el
Normal file
@@ -0,0 +1,894 @@
|
||||
;;; guix-list.el --- List buffers for displaying entries -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with 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)
|
||||
|
||||
(defgroup guix-list-faces nil
|
||||
"Faces for list buffers."
|
||||
:group 'guix-list
|
||||
:group 'guix-faces)
|
||||
|
||||
(defface guix-list-file-path
|
||||
'((t :inherit guix-info-file-path))
|
||||
"Face used for file paths."
|
||||
:group 'guix-list-faces)
|
||||
|
||||
(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-assq-value 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-assq-value 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-assq-value 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-assq-value entry param))
|
||||
(fun (guix-assq-value 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-current-package-id ()
|
||||
"Return ID of the current package."
|
||||
(cl-ecase major-mode
|
||||
(guix-package-list-mode
|
||||
(guix-list-current-id))
|
||||
(guix-output-list-mode
|
||||
(guix-assq-value (guix-list-current-entry) 'package-id))))
|
||||
|
||||
(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-assq-value 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."
|
||||
(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 (&optional arg)
|
||||
"Mark the current line and move to the next line.
|
||||
With ARG, mark all lines."
|
||||
(interactive "P")
|
||||
(if arg
|
||||
(guix-list-mark-all)
|
||||
(guix-list--mark 'general t)))
|
||||
|
||||
(defun guix-list-mark-all (&optional 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)
|
||||
(or mark-name (setq mark-name '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-assq-value 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 (make-composed-keymap guix-root-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 "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)))
|
||||
|
||||
(defun guix-list-edit-package ()
|
||||
"Go to the location of the current package."
|
||||
(interactive)
|
||||
(guix-edit (guix-list-current-package-id)))
|
||||
|
||||
|
||||
;;; 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-faces)
|
||||
|
||||
(defface guix-package-list-obsolete
|
||||
'((t :inherit guix-package-info-obsolete))
|
||||
"Face used if a package is obsolete."
|
||||
:group 'guix-package-list-faces)
|
||||
|
||||
(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 "e") 'guix-list-edit-package)
|
||||
(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-assq-value entry 'obsolete)
|
||||
'guix-package-list-obsolete)
|
||||
((guix-assq-value 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-assq-value 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-assq-value 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-assq-value 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-assq-value 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-assq-value 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*"
|
||||
:required (package-id))
|
||||
|
||||
(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 "e") 'guix-list-edit-package)
|
||||
(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-assq-value 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-assq-value 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-assq-value entry 'installed)))
|
||||
(or installed
|
||||
(user-error "This output is not installed"))
|
||||
(when (or (guix-assq-value 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-assq-value entry 'current))
|
||||
(number (guix-assq-value 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
|
||||
1009
emacs/guix-main.scm
Normal file
1009
emacs/guix-main.scm
Normal file
File diff suppressed because it is too large
Load Diff
208
emacs/guix-messages.el
Normal file
208
emacs/guix-messages.el
Normal file
@@ -0,0 +1,208 @@
|
||||
;;; guix-messages.el --- Minibuffer messages
|
||||
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with 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-assq-value 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-assq-value 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
|
||||
356
emacs/guix-pcomplete.el
Normal file
356
emacs/guix-pcomplete.el
Normal file
@@ -0,0 +1,356 @@
|
||||
;;; guix-pcomplete.el --- Functions for completing guix commands -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides completions for "guix" command that may be used in
|
||||
;; `shell', `eshell' and wherever `pcomplete' works.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'pcomplete)
|
||||
(require 'pcmpl-unix)
|
||||
(require 'cl-lib)
|
||||
(require 'guix-utils)
|
||||
(require 'guix-help-vars)
|
||||
|
||||
|
||||
;;; Interacting with guix
|
||||
|
||||
(defcustom guix-pcomplete-guix-program (executable-find "guix")
|
||||
"Name of the 'guix' program.
|
||||
It is used to find guix commands, options, packages, etc."
|
||||
:type 'file
|
||||
:group 'pcomplete
|
||||
:group 'guix)
|
||||
|
||||
(defun guix-pcomplete-run-guix (&rest args)
|
||||
"Run `guix-pcomplete-guix-program' with ARGS.
|
||||
Insert the output to the current buffer."
|
||||
(apply #'call-process
|
||||
guix-pcomplete-guix-program nil t nil args))
|
||||
|
||||
(defun guix-pcomplete-run-guix-and-search (regexp &optional group
|
||||
&rest args)
|
||||
"Run `guix-pcomplete-guix-program' with ARGS and search for matches.
|
||||
Return a list of strings matching REGEXP.
|
||||
GROUP specifies a parenthesized expression used in REGEXP."
|
||||
(with-temp-buffer
|
||||
(apply #'guix-pcomplete-run-guix args)
|
||||
(let (result)
|
||||
(guix-while-search regexp
|
||||
(push (match-string-no-properties group) result))
|
||||
(nreverse result))))
|
||||
|
||||
(defmacro guix-pcomplete-define-options-finder (name docstring regexp
|
||||
&optional filter)
|
||||
"Define function NAME to receive guix options and commands.
|
||||
|
||||
The defined function takes an optional COMMAND argument. This
|
||||
function will run 'guix COMMAND --help' (or 'guix --help' if
|
||||
COMMAND is nil) using `guix-pcomplete-run-guix-and-search' and
|
||||
return its result.
|
||||
|
||||
If FILTER is specified, it should be a function. The result is
|
||||
passed to this FILTER as argument and the result value of this
|
||||
function call is returned."
|
||||
(declare (doc-string 2) (indent 1))
|
||||
`(guix-memoized-defun ,name (&optional command)
|
||||
,docstring
|
||||
(let* ((args '("--help"))
|
||||
(args (if command (cons command args) args))
|
||||
(res (apply #'guix-pcomplete-run-guix-and-search
|
||||
,regexp guix-help-parse-regexp-group args)))
|
||||
,(if filter
|
||||
`(funcall ,filter res)
|
||||
'res))))
|
||||
|
||||
(guix-pcomplete-define-options-finder guix-pcomplete-commands
|
||||
"If COMMAND is nil, return a list of available guix commands.
|
||||
If COMMAND is non-nil (it should be a string), return available
|
||||
subcommands, actions, etc. for this guix COMMAND."
|
||||
guix-help-parse-command-regexp)
|
||||
|
||||
(guix-pcomplete-define-options-finder guix-pcomplete-long-options
|
||||
"Return a list of available long options for guix COMMAND."
|
||||
guix-help-parse-long-option-regexp)
|
||||
|
||||
(guix-pcomplete-define-options-finder guix-pcomplete-short-options
|
||||
"Return a string with available short options for guix COMMAND."
|
||||
guix-help-parse-short-option-regexp
|
||||
(lambda (list)
|
||||
(guix-concat-strings list "")))
|
||||
|
||||
(guix-memoized-defun guix-pcomplete-all-packages ()
|
||||
"Return a list of all available Guix packages."
|
||||
(guix-pcomplete-run-guix-and-search
|
||||
guix-help-parse-package-regexp
|
||||
guix-help-parse-regexp-group
|
||||
"package" "--list-available"))
|
||||
|
||||
(guix-memoized-defun guix-pcomplete-installed-packages (&optional profile)
|
||||
"Return a list of Guix packages installed in PROFILE."
|
||||
(let* ((args (and profile
|
||||
(list (concat "--profile=" profile))))
|
||||
(args (append '("package" "--list-installed") args)))
|
||||
(apply #'guix-pcomplete-run-guix-and-search
|
||||
guix-help-parse-package-regexp
|
||||
guix-help-parse-regexp-group
|
||||
args)))
|
||||
|
||||
(guix-memoized-defun guix-pcomplete-lint-checkers ()
|
||||
"Return a list of all available lint checkers."
|
||||
(guix-pcomplete-run-guix-and-search
|
||||
guix-help-parse-list-regexp
|
||||
guix-help-parse-regexp-group
|
||||
"lint" "--list-checkers"))
|
||||
|
||||
(guix-memoized-defun guix-pcomplete-graph-types ()
|
||||
"Return a list of all available graph types."
|
||||
(guix-pcomplete-run-guix-and-search
|
||||
guix-help-parse-list-regexp
|
||||
guix-help-parse-regexp-group
|
||||
"graph" "--list-types"))
|
||||
|
||||
|
||||
;;; Completing
|
||||
|
||||
(defvar guix-pcomplete-option-regexp (rx string-start "-")
|
||||
"Regexp to match an option.")
|
||||
|
||||
(defvar guix-pcomplete-long-option-regexp (rx string-start "--")
|
||||
"Regexp to match a long option.")
|
||||
|
||||
(defvar guix-pcomplete-long-option-with-arg-regexp
|
||||
(rx string-start
|
||||
(group "--" (one-or-more any)) "="
|
||||
(group (zero-or-more any)))
|
||||
"Regexp to match a long option with its argument.
|
||||
The first parenthesized group defines the option and the second
|
||||
group - the argument.")
|
||||
|
||||
(defvar guix-pcomplete-short-option-with-arg-regexp
|
||||
(rx string-start
|
||||
(group "-" (not (any "-")))
|
||||
(group (zero-or-more any)))
|
||||
"Regexp to match a short option with its argument.
|
||||
The first parenthesized group defines the option and the second
|
||||
group - the argument.")
|
||||
|
||||
(defun guix-pcomplete-match-option ()
|
||||
"Return non-nil, if the current argument is an option."
|
||||
(pcomplete-match guix-pcomplete-option-regexp 0))
|
||||
|
||||
(defun guix-pcomplete-match-long-option ()
|
||||
"Return non-nil, if the current argument is a long option."
|
||||
(pcomplete-match guix-pcomplete-long-option-regexp 0))
|
||||
|
||||
(defun guix-pcomplete-match-long-option-with-arg ()
|
||||
"Return non-nil, if the current argument is a long option with value."
|
||||
(pcomplete-match guix-pcomplete-long-option-with-arg-regexp 0))
|
||||
|
||||
(defun guix-pcomplete-match-short-option-with-arg ()
|
||||
"Return non-nil, if the current argument is a short option with value."
|
||||
(pcomplete-match guix-pcomplete-short-option-with-arg-regexp 0))
|
||||
|
||||
(defun guix-pcomplete-long-option-arg (option args)
|
||||
"Return a long OPTION's argument from a list of arguments ARGS."
|
||||
(let* ((re (concat "\\`" option "=\\(.*\\)"))
|
||||
(args (cl-member-if (lambda (arg)
|
||||
(string-match re arg))
|
||||
args))
|
||||
(cur (car args)))
|
||||
(when cur
|
||||
(match-string-no-properties 1 cur))))
|
||||
|
||||
(defun guix-pcomplete-short-option-arg (option args)
|
||||
"Return a short OPTION's argument from a list of arguments ARGS."
|
||||
(let* ((re (concat "\\`" option "\\(.*\\)"))
|
||||
(args (cl-member-if (lambda (arg)
|
||||
(string-match re arg))
|
||||
args))
|
||||
(cur (car args)))
|
||||
(when cur
|
||||
(let ((arg (match-string-no-properties 1 cur)))
|
||||
(if (string= "" arg)
|
||||
(cadr args) ; take the next arg
|
||||
arg)))))
|
||||
|
||||
(defun guix-pcomplete-complete-comma-args (entries)
|
||||
"Complete comma separated arguments using ENTRIES."
|
||||
(let ((index pcomplete-index))
|
||||
(while (= index pcomplete-index)
|
||||
(let* ((args (if (or (guix-pcomplete-match-long-option-with-arg)
|
||||
(guix-pcomplete-match-short-option-with-arg))
|
||||
(pcomplete-match-string 2 0)
|
||||
(pcomplete-arg 0)))
|
||||
(input (if (string-match ".*,\\(.*\\)" args)
|
||||
(match-string-no-properties 1 args)
|
||||
args)))
|
||||
(pcomplete-here* entries input)))))
|
||||
|
||||
(defun guix-pcomplete-complete-command-arg (command)
|
||||
"Complete argument for guix COMMAND."
|
||||
(cond
|
||||
((member command
|
||||
'("archive" "build" "graph" "edit" "environment"
|
||||
"lint" "refresh" "size"))
|
||||
(while t
|
||||
(pcomplete-here (guix-pcomplete-all-packages))))
|
||||
(t (pcomplete-here* (pcomplete-entries)))))
|
||||
|
||||
(defun guix-pcomplete-complete-option-arg (command option &optional input)
|
||||
"Complete argument for COMMAND's OPTION.
|
||||
INPUT is the current partially completed string."
|
||||
(cl-flet ((option? (short long)
|
||||
(or (string= option short)
|
||||
(string= option long)))
|
||||
(command? (&rest commands)
|
||||
(member command commands))
|
||||
(complete (entries)
|
||||
(pcomplete-here entries input nil t))
|
||||
(complete* (entries)
|
||||
(pcomplete-here* entries input t)))
|
||||
(cond
|
||||
((option? "-L" "--load-path")
|
||||
(complete* (pcomplete-dirs)))
|
||||
((string= "--key-download" option)
|
||||
(complete* guix-help-key-policies))
|
||||
|
||||
((command? "package")
|
||||
(cond
|
||||
;; For '--install[=]' and '--remove[=]', try to complete a package
|
||||
;; name (INPUT) after the "=" sign, and then the rest packages
|
||||
;; separated with spaces.
|
||||
((option? "-i" "--install")
|
||||
(complete (guix-pcomplete-all-packages))
|
||||
(while (not (guix-pcomplete-match-option))
|
||||
(pcomplete-here (guix-pcomplete-all-packages))))
|
||||
((option? "-r" "--remove")
|
||||
(let* ((profile (or (guix-pcomplete-short-option-arg
|
||||
"-p" pcomplete-args)
|
||||
(guix-pcomplete-long-option-arg
|
||||
"--profile" pcomplete-args)))
|
||||
(profile (and profile (expand-file-name profile))))
|
||||
(complete (guix-pcomplete-installed-packages profile))
|
||||
(while (not (guix-pcomplete-match-option))
|
||||
(pcomplete-here (guix-pcomplete-installed-packages profile)))))
|
||||
((string= "--show" option)
|
||||
(complete (guix-pcomplete-all-packages)))
|
||||
((option? "-p" "--profile")
|
||||
(complete* (pcomplete-dirs)))
|
||||
((option? "-m" "--manifest")
|
||||
(complete* (pcomplete-entries)))))
|
||||
|
||||
((and (command? "archive" "build" "size")
|
||||
(option? "-s" "--system"))
|
||||
(complete* guix-help-system-types))
|
||||
|
||||
((and (command? "build")
|
||||
(option? "-r" "--root"))
|
||||
(complete* (pcomplete-entries)))
|
||||
|
||||
((and (command? "graph")
|
||||
(option? "-t" "--type"))
|
||||
(complete* (guix-pcomplete-graph-types)))
|
||||
|
||||
((and (command? "environment")
|
||||
(option? "-l" "--load"))
|
||||
(complete* (pcomplete-entries)))
|
||||
|
||||
((and (command? "hash" "download")
|
||||
(option? "-f" "--format"))
|
||||
(complete* guix-help-hash-formats))
|
||||
|
||||
((and (command? "lint")
|
||||
(option? "-c" "--checkers"))
|
||||
(guix-pcomplete-complete-comma-args
|
||||
(guix-pcomplete-lint-checkers)))
|
||||
|
||||
((and (command? "publish")
|
||||
(option? "-u" "--user"))
|
||||
(complete* (pcmpl-unix-user-names)))
|
||||
|
||||
((and (command? "refresh")
|
||||
(option? "-s" "--select"))
|
||||
(complete* guix-help-refresh-subsets))
|
||||
|
||||
((and (command? "size")
|
||||
(option? "-m" "--map-file"))
|
||||
(complete* (pcomplete-entries))))))
|
||||
|
||||
(defun guix-pcomplete-complete-options (command)
|
||||
"Complete options (with their arguments) for guix COMMAND."
|
||||
(while (guix-pcomplete-match-option)
|
||||
(let ((index pcomplete-index))
|
||||
(if (guix-pcomplete-match-long-option)
|
||||
|
||||
;; Long options.
|
||||
(if (guix-pcomplete-match-long-option-with-arg)
|
||||
(let ((option (pcomplete-match-string 1 0))
|
||||
(arg (pcomplete-match-string 2 0)))
|
||||
(guix-pcomplete-complete-option-arg
|
||||
command option arg))
|
||||
|
||||
(pcomplete-here* (guix-pcomplete-long-options command))
|
||||
;; We support '--opt arg' style (along with '--opt=arg'),
|
||||
;; because 'guix package --install/--remove' may be used this
|
||||
;; way. So try to complete an argument after the option has
|
||||
;; been completed.
|
||||
(unless (guix-pcomplete-match-option)
|
||||
(guix-pcomplete-complete-option-arg
|
||||
command (pcomplete-arg 0 -1))))
|
||||
|
||||
;; Short options.
|
||||
(let ((arg (pcomplete-arg 0)))
|
||||
(if (> (length arg) 2)
|
||||
;; Support specifying an argument after a short option without
|
||||
;; spaces (for example, '-L/tmp/foo').
|
||||
(guix-pcomplete-complete-option-arg
|
||||
command
|
||||
(substring-no-properties arg 0 2)
|
||||
(substring-no-properties arg 2))
|
||||
(pcomplete-opt (guix-pcomplete-short-options command))
|
||||
(guix-pcomplete-complete-option-arg
|
||||
command (pcomplete-arg 0 -1)))))
|
||||
|
||||
;; If there were no completions, move to the next argument and get
|
||||
;; out if the last argument is achieved.
|
||||
(when (= index pcomplete-index)
|
||||
(if (= pcomplete-index pcomplete-last)
|
||||
(throw 'pcompleted nil)
|
||||
(pcomplete-next-arg))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun pcomplete/guix ()
|
||||
"Completion for `guix'."
|
||||
(let ((commands (guix-pcomplete-commands)))
|
||||
(pcomplete-here* (cons "--help" commands))
|
||||
(let ((command (pcomplete-arg 'first 1)))
|
||||
(when (member command commands)
|
||||
(guix-pcomplete-complete-options command)
|
||||
(let ((subcommands (guix-pcomplete-commands command)))
|
||||
(when subcommands
|
||||
(pcomplete-here* subcommands)))
|
||||
(guix-pcomplete-complete-options command)
|
||||
(guix-pcomplete-complete-command-arg command)))))
|
||||
|
||||
(provide 'guix-pcomplete)
|
||||
|
||||
;;; guix-pcomplete.el ends here
|
||||
48
emacs/guix-popup.el
Normal file
48
emacs/guix-popup.el
Normal file
@@ -0,0 +1,48 @@
|
||||
;;; guix-popup.el --- Popup windows library
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides `guix-define-popup' macro which is just an alias
|
||||
;; to `magit-define-popup'. According to the manual (info
|
||||
;; "(magit-popup) Defining prefix and suffix commands") `magit-popup'
|
||||
;; library will eventually be superseded by a more general library.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'magit-popup)
|
||||
|
||||
(defalias 'guix-define-popup 'magit-define-popup)
|
||||
|
||||
(defvar guix-popup-font-lock-keywords
|
||||
(eval-when-compile
|
||||
`((,(rx "("
|
||||
(group "guix-define-popup")
|
||||
symbol-end
|
||||
(zero-or-more blank)
|
||||
(zero-or-one
|
||||
(group (one-or-more (or (syntax word) (syntax symbol))))))
|
||||
(1 font-lock-keyword-face)
|
||||
(2 font-lock-function-name-face nil t)))))
|
||||
|
||||
(font-lock-add-keywords 'emacs-lisp-mode guix-popup-font-lock-keywords)
|
||||
|
||||
(provide 'guix-popup)
|
||||
|
||||
;;; guix-popup.el ends here
|
||||
210
emacs/guix-prettify.el
Normal file
210
emacs/guix-prettify.el
Normal file
@@ -0,0 +1,210 @@
|
||||
;;; guix-prettify.el --- Prettify Guix store file names
|
||||
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with 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:
|
||||
|
||||
(require 'guix-utils)
|
||||
|
||||
(defgroup guix-prettify nil
|
||||
"Prettify Guix store file names."
|
||||
:prefix "guix-prettify-"
|
||||
:group 'guix
|
||||
: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
|
||||
;; The following file names / URLs should be abbreviated:
|
||||
|
||||
;; /gnu/store/…-foo-0.1
|
||||
;; /nix/store/…-foo-0.1
|
||||
;; http://hydra.gnu.org/nar/…-foo-0.1
|
||||
;; http://hydra.gnu.org/log/…-foo-0.1
|
||||
|
||||
(rx "/" (or "store" "nar" "log") "/"
|
||||
;; 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))
|
||||
(guix-while-search guix-prettify-regexp
|
||||
(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
|
||||
64
emacs/guix-profiles.el
Normal file
64
emacs/guix-profiles.el
Normal file
@@ -0,0 +1,64 @@
|
||||
;;; 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:
|
||||
|
||||
(require 'guix-config)
|
||||
|
||||
(defvar guix-user-profile
|
||||
(expand-file-name "~/.guix-profile")
|
||||
"User profile.")
|
||||
|
||||
(defvar guix-default-profile
|
||||
(concat guix-config-state-directory
|
||||
"/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
|
||||
176
emacs/guix-read.el
Normal file
176
emacs/guix-read.el
Normal file
@@ -0,0 +1,176 @@
|
||||
;;; guix-read.el --- Minibuffer readers
|
||||
|
||||
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file provides functions to prompt a user for packages, system
|
||||
;; types, hash formats and other guix related stuff.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'guix-help-vars)
|
||||
(require 'guix-utils)
|
||||
(require 'guix-base)
|
||||
|
||||
(defun guix-read-file-name (prompt &optional dir default-filename
|
||||
mustmatch initial predicate)
|
||||
"Read file name.
|
||||
This function is similar to `read-file-name' except it also
|
||||
expands the file name."
|
||||
(expand-file-name (read-file-name prompt dir default-filename
|
||||
mustmatch initial predicate)))
|
||||
|
||||
(defmacro guix-define-reader (name read-fun completions prompt)
|
||||
"Define NAME function to read from minibuffer.
|
||||
READ-FUN may be `completing-read', `completing-read-multiple' or
|
||||
another function with the same arguments."
|
||||
`(defun ,name (&optional prompt initial-contents)
|
||||
(,read-fun ,(if prompt
|
||||
`(or prompt ,prompt)
|
||||
'prompt)
|
||||
,completions nil nil initial-contents)))
|
||||
|
||||
(defmacro guix-define-readers (&rest args)
|
||||
"Define reader functions.
|
||||
|
||||
ARGS should have a form [KEYWORD VALUE] ... The following
|
||||
keywords are available:
|
||||
|
||||
- `completions-var' - variable used to get completions.
|
||||
|
||||
- `completions-getter' - function used to get completions.
|
||||
|
||||
- `single-reader', `single-prompt' - name of a function to read
|
||||
a single value, and a prompt for it.
|
||||
|
||||
- `multiple-reader', `multiple-prompt' - name of a function to
|
||||
read multiple values, and a prompt for it.
|
||||
|
||||
- `multiple-separator' - if specified, another
|
||||
`<multiple-reader-name>-string' function returning a string
|
||||
of multiple values separated the specified separator will be
|
||||
defined."
|
||||
(let (completions-var
|
||||
completions-getter
|
||||
single-reader
|
||||
single-prompt
|
||||
multiple-reader
|
||||
multiple-prompt
|
||||
multiple-separator)
|
||||
|
||||
;; Process the keyword args.
|
||||
(while (keywordp (car args))
|
||||
(pcase (pop args)
|
||||
(`:completions-var (setq completions-var (pop args)))
|
||||
(`:completions-getter (setq completions-getter (pop args)))
|
||||
(`:single-reader (setq single-reader (pop args)))
|
||||
(`:single-prompt (setq single-prompt (pop args)))
|
||||
(`:multiple-reader (setq multiple-reader (pop args)))
|
||||
(`:multiple-prompt (setq multiple-prompt (pop args)))
|
||||
(`:multiple-separator (setq multiple-separator (pop args)))
|
||||
(_ (pop args))))
|
||||
|
||||
(let ((completions
|
||||
(cond ((and completions-var completions-getter)
|
||||
`(or ,completions-var
|
||||
(setq ,completions-var
|
||||
(funcall ',completions-getter))))
|
||||
(completions-var
|
||||
completions-var)
|
||||
(completions-getter
|
||||
`(funcall ',completions-getter)))))
|
||||
`(progn
|
||||
,(when (and completions-var
|
||||
(not (boundp completions-var)))
|
||||
`(defvar ,completions-var nil))
|
||||
|
||||
,(when single-reader
|
||||
`(guix-define-reader ,single-reader completing-read
|
||||
,completions ,single-prompt))
|
||||
|
||||
,(when multiple-reader
|
||||
`(guix-define-reader ,multiple-reader completing-read-multiple
|
||||
,completions ,multiple-prompt))
|
||||
|
||||
,(when (and multiple-reader multiple-separator)
|
||||
(let ((name (intern (concat (symbol-name multiple-reader)
|
||||
"-string"))))
|
||||
`(defun ,name (&optional prompt initial-contents)
|
||||
(guix-concat-strings
|
||||
(,multiple-reader prompt initial-contents)
|
||||
,multiple-separator))))))))
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-system-types
|
||||
:single-reader guix-read-system-type
|
||||
:single-prompt "System type: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-source-types
|
||||
:single-reader guix-read-source-type
|
||||
:single-prompt "Source type: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-hash-formats
|
||||
:single-reader guix-read-hash-format
|
||||
:single-prompt "Hash format: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-refresh-subsets
|
||||
:single-reader guix-read-refresh-subset
|
||||
:single-prompt "Refresh subset: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-key-policies
|
||||
:single-reader guix-read-key-policy
|
||||
:single-prompt "Key policy: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-elpa-archives
|
||||
:single-reader guix-read-elpa-archive
|
||||
:single-prompt "ELPA archive: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-var guix-help-verify-options
|
||||
:multiple-reader guix-read-verify-options
|
||||
:multiple-prompt "Verify option,s: "
|
||||
:multiple-separator ",")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-getter guix-graph-type-names
|
||||
:single-reader guix-read-graph-type
|
||||
:single-prompt "Graph node type: ")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-getter guix-lint-checker-names
|
||||
:multiple-reader guix-read-lint-checker-names
|
||||
:multiple-prompt "Linter,s: "
|
||||
:multiple-separator ",")
|
||||
|
||||
(guix-define-readers
|
||||
:completions-getter guix-package-names
|
||||
:single-reader guix-read-package-name
|
||||
:single-prompt "Package: "
|
||||
:multiple-reader guix-read-package-names
|
||||
:multiple-prompt "Package,s: "
|
||||
:multiple-separator " ")
|
||||
|
||||
(provide 'guix-read)
|
||||
|
||||
;;; guix-read.el ends here
|
||||
310
emacs/guix-utils.el
Normal file
310
emacs/guix-utils.el
Normal file
@@ -0,0 +1,310 @@
|
||||
;;; guix-utils.el --- General utility functions -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; GNU Guix is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with 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-concat-strings (strings separator &optional location)
|
||||
"Return new string by concatenating STRINGS with SEPARATOR.
|
||||
If LOCATION is a symbol `head', add another SEPARATOR to the
|
||||
beginning of the returned string; if `tail' - add SEPARATOR to
|
||||
the end of the string; if nil, do not add SEPARATOR; otherwise
|
||||
add both to the end and to the beginning."
|
||||
(let ((str (mapconcat #'identity strings separator)))
|
||||
(cond ((null location)
|
||||
str)
|
||||
((eq location 'head)
|
||||
(concat separator str))
|
||||
((eq location 'tail)
|
||||
(concat str separator))
|
||||
(t
|
||||
(concat separator str separator)))))
|
||||
|
||||
(defun guix-shell-quote-argument (argument)
|
||||
"Quote shell command ARGUMENT.
|
||||
This function is similar to `shell-quote-argument', but less strict."
|
||||
(if (equal argument "")
|
||||
"''"
|
||||
(replace-regexp-in-string
|
||||
"\n" "'\n'"
|
||||
(replace-regexp-in-string
|
||||
(rx (not (any alnum "-=,./\n"))) "\\\\\\&" argument))))
|
||||
|
||||
(defun guix-command-symbol (&optional args)
|
||||
"Return symbol by concatenating 'guix' and ARGS (strings)."
|
||||
(intern (guix-concat-strings (cons "guix" args) "-")))
|
||||
|
||||
(defun guix-command-string (&optional args)
|
||||
"Return 'guix ARGS ...' string with quoted shell arguments."
|
||||
(let ((args (mapcar #'guix-shell-quote-argument args)))
|
||||
(guix-concat-strings (cons "guix" args) " ")))
|
||||
|
||||
(defun guix-copy-as-kill (string &optional no-message?)
|
||||
"Put STRING into `kill-ring'.
|
||||
If NO-MESSAGE? is non-nil, do not display a message about it."
|
||||
(kill-new string)
|
||||
(unless no-message?
|
||||
(message "'%s' has been added to kill ring." string)))
|
||||
|
||||
(defun guix-copy-command-as-kill (args &optional no-message?)
|
||||
"Put 'guix ARGS ...' string into `kill-ring'.
|
||||
See also `guix-copy-as-kill'."
|
||||
(guix-copy-as-kill (guix-command-string args) no-message?))
|
||||
|
||||
(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))
|
||||
|
||||
(defcustom guix-find-file-function #'find-file
|
||||
"Function used to find a file.
|
||||
The function is called by `guix-find-file' with a file name as a
|
||||
single argument."
|
||||
:type '(choice (function-item find-file)
|
||||
(function-item org-open-file)
|
||||
(function :tag "Other function"))
|
||||
:group 'guix)
|
||||
|
||||
(defun guix-find-file (file)
|
||||
"Find FILE if it exists."
|
||||
(if (file-exists-p file)
|
||||
(funcall guix-find-file-function file)
|
||||
(message "File '%s' does not exist." file)))
|
||||
|
||||
(defvar url-handler-regexp)
|
||||
|
||||
(defun guix-find-file-or-url (file-or-url)
|
||||
"Find FILE-OR-URL."
|
||||
(require 'url-handlers)
|
||||
(let ((file-name-handler-alist
|
||||
(cons (cons url-handler-regexp 'url-file-handler)
|
||||
file-name-handler-alist)))
|
||||
(find-file file-or-url)))
|
||||
|
||||
(defmacro guix-while-search (regexp &rest body)
|
||||
"Evaluate BODY after each search for REGEXP in the current buffer."
|
||||
(declare (indent 1) (debug t))
|
||||
`(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward ,regexp nil t)
|
||||
,@body)))
|
||||
|
||||
|
||||
;;; Alist accessors
|
||||
|
||||
(defmacro guix-define-alist-accessor (name assoc-fun)
|
||||
"Define NAME function to access alist values using ASSOC-FUN."
|
||||
`(defun ,name (alist &rest keys)
|
||||
,(format "Return value from ALIST by KEYS using `%s'.
|
||||
ALIST is alist of alists of alists ... which can be consecutively
|
||||
accessed with KEYS."
|
||||
assoc-fun)
|
||||
(if (or (null alist) (null keys))
|
||||
alist
|
||||
(apply #',name
|
||||
(cdr (,assoc-fun (car keys) alist))
|
||||
(cdr keys)))))
|
||||
|
||||
(guix-define-alist-accessor guix-assq-value assq)
|
||||
(guix-define-alist-accessor guix-assoc-value assoc)
|
||||
|
||||
|
||||
;;; 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))
|
||||
|
||||
|
||||
;;; Memoizing
|
||||
|
||||
(defun guix-memoize (function)
|
||||
"Return a memoized version of FUNCTION."
|
||||
(let ((cache (make-hash-table :test 'equal)))
|
||||
(lambda (&rest args)
|
||||
(let ((result (gethash args cache 'not-found)))
|
||||
(if (eq result 'not-found)
|
||||
(let ((result (apply function args)))
|
||||
(puthash args result cache)
|
||||
result)
|
||||
result)))))
|
||||
|
||||
(defmacro guix-memoized-defun (name arglist docstring &rest body)
|
||||
"Define a memoized function NAME.
|
||||
See `defun' for the meaning of arguments."
|
||||
(declare (doc-string 3) (indent 2))
|
||||
`(defalias ',name
|
||||
(guix-memoize (lambda ,arglist ,@body))
|
||||
;; Add '(name args ...)' string with real arglist to the docstring,
|
||||
;; because *Help* will display '(name &rest ARGS)' for a defined
|
||||
;; function (since `guix-memoize' returns a lambda with '(&rest
|
||||
;; args)').
|
||||
,(format "(%S %s)\n\n%s"
|
||||
name
|
||||
(mapconcat #'symbol-name arglist " ")
|
||||
docstring)))
|
||||
|
||||
(defmacro guix-memoized-defalias (symbol definition &optional docstring)
|
||||
"Set SYMBOL's function definition to memoized version of DEFINITION."
|
||||
(declare (doc-string 3) (indent 1))
|
||||
`(defalias ',symbol
|
||||
(guix-memoize #',definition)
|
||||
,(or docstring
|
||||
(format "Memoized version of `%S'." definition))))
|
||||
|
||||
(defvar guix-memoized-font-lock-keywords
|
||||
(eval-when-compile
|
||||
`((,(rx "("
|
||||
(group "guix-memoized-" (or "defun" "defalias"))
|
||||
symbol-end
|
||||
(zero-or-more blank)
|
||||
(zero-or-one
|
||||
(group (one-or-more (or (syntax word) (syntax symbol))))))
|
||||
(1 font-lock-keyword-face)
|
||||
(2 font-lock-function-name-face nil t)))))
|
||||
|
||||
(font-lock-add-keywords 'emacs-lisp-mode guix-memoized-font-lock-keywords)
|
||||
|
||||
(provide 'guix-utils)
|
||||
|
||||
;;; guix-utils.el ends here
|
||||
213
emacs/guix.el
Normal file
213
emacs/guix.el
Normal file
@@ -0,0 +1,213 @@
|
||||
;;; guix.el --- Interface for GNU Guix package manager
|
||||
|
||||
;; Copyright © 2014, 2015 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)
|
||||
(require 'guix-read)
|
||||
|
||||
(defgroup guix nil
|
||||
"Interface for Guix package manager."
|
||||
:prefix "guix-"
|
||||
:group 'external)
|
||||
|
||||
(defgroup guix-faces nil
|
||||
"Guix faces."
|
||||
:group 'guix
|
||||
:group 'faces)
|
||||
|
||||
(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)))
|
||||
|
||||
;;;###autoload
|
||||
(defun guix-edit (id-or-name)
|
||||
"Edit (go to location of) package with ID-OR-NAME."
|
||||
(interactive (list (guix-read-package-name)))
|
||||
(let ((loc (guix-package-location id-or-name)))
|
||||
(if loc
|
||||
(guix-find-location loc)
|
||||
(message "Couldn't find package location."))))
|
||||
|
||||
(provide 'guix)
|
||||
|
||||
;;; guix.el ends here
|
||||
@@ -1,12 +0,0 @@
|
||||
abi <abi/4.0>,
|
||||
|
||||
include <tunables/global>
|
||||
include <tunables/guix>
|
||||
|
||||
# There’s no point in confining the guix executable, since it can run
|
||||
# any user code and so everything is expected. We just need to
|
||||
# explicitly enable userns for systems with the
|
||||
# kernel.apparmor_restrict_unprivileged_userns sysctl.
|
||||
profile guix @{guix_storedir}/{*-guix-command,*-guix-*/bin/guix} flags=(unconfined) {
|
||||
userns,
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user