Merge branch 'master' into python-tests
This commit is contained in:
		
						commit
						cc0725914e
					
				
					 315 changed files with 30354 additions and 19031 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -128,3 +128,4 @@ stamp-h[0-9] | |||
| tmp | ||||
| /doc/os-config-lightweight-desktop.texi | ||||
| /nix/scripts/download | ||||
| /etc/indent-package.el | ||||
|  |  | |||
							
								
								
									
										23
									
								
								.mailmap
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								.mailmap
									
										
									
									
									
								
							|  | @ -2,24 +2,32 @@ | |||
| # contributors reported by "git log" and "git shortlog" commands. | ||||
| 
 | ||||
| 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> | ||||
| 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> | ||||
| 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@member.fsf.org> <ericbavier@gmail.com> | ||||
| Eric Dvorsak <eric@dvorsak.fr> <yenda1@gmail.com> | ||||
| George Clemmer <myglc2@gmail.com> | ||||
| Ivan Vilata i Balaguer <ivan@selidor.net> | ||||
| 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> | ||||
|  | @ -27,6 +35,8 @@ Joshua Grant <tadni@riseup.net> <youlysses@riseup.net> | |||
| Kei Kebreau <kei@openmailbox.org> | ||||
| Leo Famulari <leo@famulari.name> <lfamular@gmail.com> | ||||
| Ludovic Courtès <ludo@gnu.org> <ludovic.courtes@inria.fr> | ||||
| Marek Benc <dusxmt@gmx.com> <merkur32@gmail.com> | ||||
| Marius Bakke <mbakke@fastmail.com> <m.bakke@warwick.ac.uk> | ||||
| Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org> | ||||
| Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org> | ||||
| Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com> | ||||
|  | @ -35,13 +45,20 @@ ng0 <ng0@libertad.pw> <ngillmann@runbox.com> | |||
| ng0 <ng0@libertad.pw> <niasterisk@grrlz.net> | ||||
| ng0 <ng0@libertad.pw> <ng@niasterisk.space> | ||||
| ng0 <ng0@libertad.pw> | ||||
| Pjotr Prins <pjotr.public01@thebird.nl> | ||||
| Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl> | ||||
| 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> | ||||
| Ricardo Wurmus <rekado@elephly.net> | ||||
| Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de> | ||||
| Sou Bunnbu (宋文武) <iyzsong@gmail.com> | ||||
| Sou Bunnbu (宋文武) <iyzsong@gmail.com> <iyzsong@member.fsf.org> | ||||
| Stefan Reichör <stefan@xsteve.at> | ||||
| Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com> | ||||
| Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz> | ||||
| Thomas Danckaert <thomas.danckaert@gmail.com> <post@thomasdanckaert.be> | ||||
| Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com> | ||||
| Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz> | ||||
| Vincent Legoll <vincent.legoll@gmail.com> <vincent.legoll@idgrilles.fr> | ||||
|  |  | |||
							
								
								
									
										5
									
								
								HACKING
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								HACKING
									
										
									
									
									
								
							|  | @ -4,6 +4,7 @@ | |||
| 
 | ||||
| Copyright © 2012, 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org> | ||||
| Copyright © 2017 Leo Famulari <leo@famulari.name> | ||||
| 
 | ||||
|   Copying and distribution of this file, with or without modification, | ||||
|   are permitted in any medium without royalty provided the copyright | ||||
|  | @ -43,6 +44,10 @@ configure Git to automatically sign commits, run: | |||
|   git config commit.gpgsign true | ||||
|   git config user.signingkey CABBA6EA1DC0FF33 | ||||
| 
 | ||||
| You can prevent yourself from accidentally pushing unsigned commits to Savannah | ||||
| by using the pre-push Git hook called 'pre-push'. It's located at | ||||
| 'etc/git/pre-push'. | ||||
| 
 | ||||
| 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. | ||||
|  |  | |||
							
								
								
									
										33
									
								
								Makefile.am
									
										
									
									
									
								
							
							
						
						
									
										33
									
								
								Makefile.am
									
										
									
									
									
								
							|  | @ -61,6 +61,7 @@ MODULES =					\ | |||
|   guix/zlib.scm					\ | ||||
|   guix/build-system.scm				\ | ||||
|   guix/build-system/ant.scm			\ | ||||
|   guix/build-system/cargo.scm			\ | ||||
|   guix/build-system/cmake.scm			\ | ||||
|   guix/build-system/emacs.scm			\ | ||||
|   guix/build-system/asdf.scm			\ | ||||
|  | @ -69,6 +70,7 @@ MODULES =					\ | |||
|   guix/build-system/haskell.scm			\ | ||||
|   guix/build-system/perl.scm			\ | ||||
|   guix/build-system/python.scm			\ | ||||
|   guix/build-system/ocaml.scm			\ | ||||
|   guix/build-system/waf.scm			\ | ||||
|   guix/build-system/r.scm			\ | ||||
|   guix/build-system/ruby.scm			\ | ||||
|  | @ -83,6 +85,7 @@ MODULES =					\ | |||
|   guix/ui.scm					\ | ||||
|   guix/build/ant-build-system.scm		\ | ||||
|   guix/build/download.scm			\ | ||||
|   guix/build/cargo-build-system.scm		\ | ||||
|   guix/build/cmake-build-system.scm		\ | ||||
|   guix/build/emacs-build-system.scm		\ | ||||
|   guix/build/asdf-build-system.scm		\ | ||||
|  | @ -93,6 +96,7 @@ MODULES =					\ | |||
|   guix/build/gnu-dist.scm			\ | ||||
|   guix/build/perl-build-system.scm		\ | ||||
|   guix/build/python-build-system.scm		\ | ||||
|   guix/build/ocaml-build-system.scm		\ | ||||
|   guix/build/r-build-system.scm			\ | ||||
|   guix/build/ruby-build-system.scm		\ | ||||
|   guix/build/waf-build-system.scm		\ | ||||
|  | @ -156,8 +160,11 @@ MODULES =					\ | |||
| if HAVE_GUILE_JSON | ||||
| 
 | ||||
| MODULES +=					\ | ||||
|   guix/docker.scm	   			\ | ||||
|   guix/import/github.scm   			\ | ||||
|   guix/import/json.scm				\ | ||||
|   guix/import/crate.scm				\ | ||||
|   guix/scripts/import/crate.scm			\ | ||||
|   guix/import/pypi.scm				\ | ||||
|   guix/scripts/import/pypi.scm			\ | ||||
|   guix/import/cpan.scm				\ | ||||
|  | @ -166,6 +173,14 @@ MODULES +=					\ | |||
| 
 | ||||
| endif | ||||
| 
 | ||||
| if HAVE_GUILE_SSH | ||||
| 
 | ||||
| MODULES +=					\ | ||||
|   guix/ssh.scm					\ | ||||
|   guix/scripts/copy.scm | ||||
| 
 | ||||
| endif HAVE_GUILE_SSH | ||||
| 
 | ||||
| if BUILD_DAEMON_OFFLOAD | ||||
| 
 | ||||
| MODULES +=					\ | ||||
|  | @ -178,8 +193,8 @@ dist_noinst_DATA = guix/tests.scm guix/tests/http.scm | |||
| 
 | ||||
| # Linux-Libre configurations. | ||||
| KCONFIGS =					\ | ||||
|   gnu/packages/linux-libre-4.8-i686.conf	\ | ||||
|   gnu/packages/linux-libre-4.8-x86_64.conf	\ | ||||
|   gnu/packages/linux-libre-4.9-i686.conf	\ | ||||
|   gnu/packages/linux-libre-4.9-x86_64.conf	\ | ||||
|   gnu/packages/linux-libre-4.4-i686.conf	\ | ||||
|   gnu/packages/linux-libre-4.4-x86_64.conf	\ | ||||
|   gnu/packages/linux-libre-4.1-i686.conf	\ | ||||
|  | @ -280,7 +295,8 @@ if HAVE_GUILE_JSON | |||
| SCM_TESTS += 					\ | ||||
|   tests/pypi.scm				\ | ||||
|   tests/cpan.scm				\ | ||||
|   tests/gem.scm | ||||
|   tests/gem.scm					\ | ||||
|   tests/crate.scm | ||||
| 
 | ||||
| endif | ||||
| 
 | ||||
|  | @ -377,6 +393,8 @@ EXTRA_DIST =						\ | |||
|   build-aux/generate-authors.scm			\ | ||||
|   build-aux/test-driver.scm				\ | ||||
|   build-aux/run-system-tests.scm			\ | ||||
|   d3.v3.js						\ | ||||
|   graph.js						\ | ||||
|   srfi/srfi-37.scm.in					\ | ||||
|   srfi/srfi-64.scm					\ | ||||
|   srfi/srfi-64.upstream.scm				\ | ||||
|  | @ -458,10 +476,6 @@ AM_DISTCHECK_CONFIGURE_FLAGS =			\ | |||
|   --with-nix-prefix="$(NIX_PREFIX)"		\ | ||||
|   --enable-daemon | ||||
| 
 | ||||
| dist_emacsui_DATA = emacs/guix-main.scm | ||||
| nodist_emacsui_DATA = emacs/guix-helper.scm | ||||
| include emacs/local.mk | ||||
| 
 | ||||
| # The self-contained tarball. | ||||
| guix-binary.%.tar.xz: | ||||
| 	$(AM_V_GEN)GUIX_PACKAGE_PATH= \ | ||||
|  | @ -500,6 +514,7 @@ assert-no-store-file-names: | |||
| 	     --exclude=*.info-[0-9] --exclude=*.dot				\ | ||||
| 	     --exclude=*.eps --exclude-dir=bootstrap				\ | ||||
| 	     --exclude=guix-prettify.el						\ | ||||
| 	     --exclude=ChangeLog						\ | ||||
| 	     -E "$(storedir)/[a-z0-9]{32}-" $(distdir) ;			\ | ||||
| 	then									\ | ||||
| 	  echo "error: store file names embedded in the distribution" >&2 ;	\ | ||||
|  | @ -540,10 +555,6 @@ AM_V_DOT = $(AM_V_DOT_$(V)) | |||
| AM_V_DOT_ = $(AM_V_DOT_$(AM_DEFAULT_VERBOSITY)) | ||||
| AM_V_DOT_0 = @echo "  DOT     " $@; | ||||
| 
 | ||||
| AM_V_EMACS = $(AM_V_EMACS_$(V)) | ||||
| AM_V_EMACS_ = $(AM_V_EMACS_$(AM_DEFAULT_VERBOSITY)) | ||||
| AM_V_EMACS_0 = @echo "  EMACS   " $@; | ||||
| 
 | ||||
| AM_V_HELP2MAN = $(AM_V_HELP2MAN_$(V)) | ||||
| AM_V_HELP2MAN_ = $(AM_V_HELP2MAN_$(AM_DEFAULT_VERBOSITY)) | ||||
| AM_V_HELP2MAN_0 = @echo "  HELP2MAN" $@; | ||||
|  |  | |||
							
								
								
									
										478
									
								
								NEWS
									
										
									
									
									
								
							
							
						
						
									
										478
									
								
								NEWS
									
										
									
									
									
								
							|  | @ -10,6 +10,484 @@ Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> | |||
| 
 | ||||
| Please send Guix bug reports to bug-guix@gnu.org. | ||||
| 
 | ||||
| * Changes in 0.12.0 (since 0.11.0) | ||||
| 
 | ||||
| ** Package management | ||||
| 
 | ||||
| *** Guix can now be built with Guile 2.1/2.2 | ||||
| *** New ‘--with-graft’ package transformation option | ||||
| *** Grafting is now faster than before | ||||
| *** The ‘replacement’ of a package can now have a different name | ||||
| *** ‘guix-daemon’ offloading support now uses Guile-SSH | ||||
| *** New ‘guix offload test’ command | ||||
| *** New updaters for ‘guix refresh’: ‘kernel.org’, ‘cpan’, ‘crates’ | ||||
| *** ‘guix refresh --list-updaters’ shows updater coverage | ||||
| *** New ‘cargo-build-system’ and importer for Rust packages | ||||
| *** New ‘asdf-build-system’ for Common Lisp packages | ||||
| *** Python build system now uses setuptools by default | ||||
| *** New updater for CPAN packages | ||||
| *** Added ‘--recursive’ option for importer for the CRAN/Bioconductor importer | ||||
| *** New d3.js backend for ‘guix graph’ | ||||
| *** ‘guix package’ now displays generation diffs | ||||
| *** New services | ||||
| New services for CUPS printing, SPICE vdagent, SDDM, a login service, kmscon service, opensmtpd mail service, git service, wpa-supplicant service, rottlog, OpenSSH, Cuirass, and NFS related services. | ||||
| *** New arm-none-eabi cross-compiler toolchains | ||||
| *** New 'guix system' actions: ‘switch-generation’ and ‘roll-back’ | ||||
| 
 | ||||
| ** Distribution | ||||
| 
 | ||||
| *** GuixSD can now be installed to a LUKS-encrypted root | ||||
|     (<http://bugs.gnu.org/21843>) | ||||
| *** ‘openssl’ has a new “doc” output for its man pages | ||||
| *** Added support for a native GNU/Hurd system | ||||
| *** New system tests for the OpenSSH and Dropbear daemons | ||||
| *** New tests for the GuixSD installation on encrypted or RAID roots | ||||
| *** New ‘netmask’ option for ‘static-networking-service’ | ||||
| *** New “i686-w64-mingw32” cross-compilation target (MinGW) | ||||
| *** A modular set of packages supersede the monolithic ‘qt’ package | ||||
| *** 853 new packages | ||||
| 
 | ||||
| abc, acme-client, aircrack-ng, ams-lv2, ao-cad, arachne-pnr, | ||||
| arm-none-eabi-nano-toolchain, arm-none-eabi-nano-toolchain, | ||||
| arm-none-eabi-toolchain, arm-none-eabi-toolchain, asn1c, aspell-dict-de, | ||||
| aspell-dict-el, aspell-dict-grc, aspell-dict-he, aspell-dict-sv, assimp, | ||||
| attica, autossh, b43-tools, baloo, bambam, bamm, bcftools, biber, biber-next, | ||||
| bind, bluefish, bluez-qt, bpp-core, bpp-phyl, bpp-popgen, bpp-seq, bppsuite, | ||||
| breeze-icons, bs1770gain, bwm-ng, c-toxcore, cairo-xcb, capnproto, | ||||
| cargo-bootstrap, cbatticon, ccid, cfitsio, chez-fmt, chez-irregex, | ||||
| chez-matchable, chez-mit, chez-scmutils, chez-sockets, chez-srfi, chez-web, | ||||
| chromaprint, cl-alexandria, cl-bordeaux-threads, cl-clx, cl-fiveam, | ||||
| cl-flexi-streams, cl-ppcre, cl-slynk, cl-stumpwm, cl-trivial-gray-streams, | ||||
| clipit, clojure, cmark, coda, cryptsetup-static, cuirass, darkhttpd, dash, | ||||
| dbacl, dbus-c++, denemo, ding, direnv, discrover, dlib, dnscrypt-proxy, | ||||
| dnscrypt-wrapper, dotconf, drumkv1, dtc, ecl-alexandria, ecl-bordeaux-threads, | ||||
| ecl-cl-ppcre, ecl-clx, ecl-fiveam, ecl-flexi-streams, ecl-slynk, ecl-stumpwm, | ||||
| ecl-trivial-gray-streams, econnman, ecryptfs-utils, edi, editres, efibootmgr, | ||||
| efivar, emacs-ahungry-theme, emacs-auto-complete, emacs-bui, | ||||
| emacs-cyberpunk-theme, emacs-d-mode, emacs-danneskjold-theme, emacs-el-search, | ||||
| emacs-emms-mode-line-cycle, emacs-es-mode, emacs-evil, emacs-flx, | ||||
| emacs-goto-chg, emacs-guix, emacs-neotree, emacs-nginx-mode, emacs-org, | ||||
| emacs-org-trello, emacs-paredit, emacs-request, emacs-rudel, emacs-stream, | ||||
| enet, epic5, eschalot, espeak, exonerate, extempore, fatfsck-static, fbida, | ||||
| fcgi, fcgiwrap, femtolisp, filteraudio, fio, font-adobe-source-code-pro, | ||||
| font-fira-mono, freealut, gcc-cross-sans-libc-arm-none-eabi, | ||||
| gcc-cross-sans-libc-arm-none-eabi, gcompris, gctp, gdb-arm-none-eabi, | ||||
| geierlein, geteltorito, gettext-minimal, gforth, ghc-array, | ||||
| ghc-base16-bytestring, ghc-binary, ghc-bytestring, ghc-bytestring-handle, | ||||
| ghc-chell, ghc-chell-quickcheck, ghc-colour, ghc-conduit-extra, | ||||
| ghc-constraints, ghc-cryptohash, ghc-data-accessor, | ||||
| ghc-data-accessor-transformers, ghc-data-ordlist, ghc-directory, ghc-easyplot, | ||||
| ghc-fgl-arbitrary, ghc-findbin, ghc-fsnotify, ghc-gnuplot, ghc-graphviz, | ||||
| ghc-hashtables, ghc-haskeline, ghc-hinotify, ghc-hmatrix, ghc-hmatrix-gsl, | ||||
| ghc-hmatrix-gsl-stats, ghc-hmatrix-special, ghc-hs-bibutils, ghc-ieee754, | ||||
| ghc-lifted-async, ghc-monads-tf, ghc-options, ghc-pandoc-citeproc, | ||||
| ghc-patience, ghc-process, ghc-regex-applicative, ghc-regex-compat-tdfa, | ||||
| ghc-regex-tdfa, ghc-rfc5051, ghc-sandi, ghc-shelly, ghc-storable-complex, | ||||
| ghc-system-fileio, ghc-system-filepath, ghc-tar, ghc-tasty-rerun, | ||||
| ghc-tasty-th, ghc-terminal-size, ghc-transformers, ghc-transformers, | ||||
| ghc-utility-ht, ghc-wl-pprint-text, ghc-xml-conduit, ghc-xml-types, glfw, | ||||
| gloox, gnome-calculator, gnome-dictionary, gnome-system-monitor, gnuastro, | ||||
| goaccess, gobby, gparted, gpgmepp, grantlee, greenisland, grub-efi, gsm, | ||||
| gtkwave, gucharmap, guile-aspell, guile-bytestructures, guile-commonmark, | ||||
| guile2.2-commonmark, guile2.2-irregex, guile2.2-json, guile2.2-minikanren, | ||||
| guile2.2-redis, guitarix-lv2, gx-guvnor-lv2, gx-hyperion-lv2, | ||||
| gx-overdriver-lv2, gx-push-pull-lv2, gx-saturator-lv2, gx-slow-gear-lv2, | ||||
| gx-super-fuzz-lv2, gx-suppa-tone-bender-lv2, gx-switchless-wah-lv2, | ||||
| gx-tone-mender-lv2, gx-vbass-preamp-lv2, gx-vintage-fuzz-master-lv2, | ||||
| gx-voodoo-fuzz-lv2, gxtuner, gzstream, handbrake, hdf-eos2, hdf-eos5, hdf4, | ||||
| hdf4-alt, hidapi, highlight, httptunnel, hyperrogue, icestorm, ii, impressive, | ||||
| infamous-plugins, infernal, ingen, interrobang, iperf, ircii, iverilog, | ||||
| jack-keyboard, jalv-select, jimtcl, jsoncpp, jupyter, kactivities, | ||||
| kactivities-stats, kapidox, karchive, kauth, kbookmarks, kcmutils, kcodecs, | ||||
| kcompletion, kconfig, kconfigwidgets, kcoreaddons, kcrash, kdbusaddons, | ||||
| kdeclarative, kded, kdesignerplugin, kdesu, kdevelop, kdevelop-pg-qt, | ||||
| kdevplatform, kdnssd, kdoctools, kemoticons, keyutils, kfilemetadata, | ||||
| kglobalaccel, kguiaddons, ki18n, kicad, kicad-library, kiconthemes, kidletime, | ||||
| kimageformats, kinit, kio, kiss-fft-for-extempore, kitemmodels, kitemviews, | ||||
| kjobwidgets, kmscon, knewstuff, knotifications, knotifyconfig, kobodeluxe, | ||||
| kpackage, kparts, kpeople, kplotting, kpmcore, kpty, krunner, kservice, | ||||
| ksyntaxhighlighting, ktexteditor, ktextwidgets, kunitconversion, kwallet, | ||||
| kwayland, kwidgetsaddons, kxmlgui, kxmlrpcclient, laby, lci, lekha, libaacs, | ||||
| libasr, libbdplus, libhdate, libicns, libidn2, libjaylink, libjpeg-turbo, | ||||
| libjxr, libkomparediff2, libksysguard, libnet6, libnfsidmap, libosinfo, | ||||
| libpqxx, libpsyc, libseccomp, libtermkey, libtoxcore, libtsm, libunique, | ||||
| libvirt, libvirt-glib, limnoria, linux-libre-arm-generic, llvm-with-rtti, | ||||
| lmdb, lndir, lua-lgi, lua-lpeg, lua5.1-expat, lua5.1-filesystem, lua5.1-sec, | ||||
| lua5.1-sec, lua5.1-socket, lvm2-static, m17n-db, m17n-lib, mash, mb2md, | ||||
| mcelog, mcl, mdadm-static, mhonarc, microcom, minced, mingw-w64, mktorrent, | ||||
| mlocate, mobile-broadband-provider-info, mod-host, mod-utilities, | ||||
| modemmanager-qt, mono, mpop, mps-youtube, mrrescue, mtd-utils, mumble, musl, | ||||
| nanovg-for-extempore, nethogs, netsurf, networkmanager-qt, newick-utils, | ||||
| newlib, newlib-nano, newsbeuter, nfs-utils, nickle, non-session-manager, | ||||
| notifymuch, obby, ocaml-menhir, ola, onionshare, openfwwf-firmware, openh264, | ||||
| openocd, opensmtpd, opensmtpd-extras, optipng, p7zip, pam-krb5, par2cmdline, | ||||
| pcb-rnd, pcsc-lite, pdf2svg, pdfposter, perl-array-utils, | ||||
| perl-autovivification, perl-business-isbn, perl-business-isbn-data, | ||||
| perl-business-ismn, perl-business-issn, perl-class-errorhandler, | ||||
| perl-crypt-openssl-bignum, perl-crypt-openssl-random, perl-crypt-openssl-rsa, | ||||
| perl-curses, perl-data-compare, perl-data-uniqid, perl-date-simple, | ||||
| perl-datetime-calendar-julian, perl-datetime-format-mail, | ||||
| perl-datetime-format-w3cdtf, perl-digest-md5, perl-encode-detect, | ||||
| perl-encode-eucjpascii, perl-encode-hanextra, perl-encode-jis2k, | ||||
| perl-env-path, perl-extutils-libbuilder, perl-feed-find, | ||||
| perl-file-find-object, perl-file-find-object-rule, perl-file-grep, | ||||
| perl-file-path, perl-file-slurper, perl-geo-ip, perl-getopt-long, perl-graph, | ||||
| perl-graph-readwrite, perl-io-socket-inet6, perl-ipc-cmd, | ||||
| perl-lingua-translit, perl-mail-spf, perl-modern-perl, perl-mojolicious, | ||||
| perl-mozilla-ca, perl-net-cidr-lite, perl-net-dns, | ||||
| perl-net-dns-resolver-programmable, perl-net-patricia, perl-net-psyc, | ||||
| perl-net-statsd, perl-netaddr-ip, perl-parse-yapp, perl-path-tiny, | ||||
| perl-socket6, perl-sort-key, perl-test-files, perl-test-manifest, | ||||
| perl-test-trailingspace, perl-text-bibtex, perl-text-csv-xs, perl-text-roman, | ||||
| perl-tie-cycle, perl-unicode-collate, perl-unicode-normalize, | ||||
| perl-unicode-utf8, perl-uri-fetch, perl-uri-template, perl-www-opensearch, | ||||
| perl-xml-atom, perl-xml-feed, perl-xml-libxslt, perl-xml-rss, perl-xml-writer, | ||||
| perl-xml-xpath, phonon, php, picocom, pinentry-gnome3, plantuml, | ||||
| plasma-framework, portmidi-for-extempore, prank, prosody, proteinortho, | ||||
| proxychains-ng, psyclpc, pybitmessage, python-aniso8601, python-argcomplete, | ||||
| python-axolotl, python-axolotl-curve25519, python-bcrypt, python-betamax, | ||||
| python-binaryornot, python-biom-format, python-bleach, python-cachecontrol, | ||||
| python-consul, python-cov-core, python-discogs-client, python-django, | ||||
| python-django-filter, python-django-simple-math-captcha, python-entrypoints, | ||||
| python-feedparser, python-flask-babel, python-flask-basicauth, | ||||
| python-flask-restful, python-flask-restful-swagger, python-flask-restplus, | ||||
| python-flask-sqlalchemy, python-freezegun, python-furl, python-future, | ||||
| python-git-review, python-glances, python-graphene, python-graphql-core, | ||||
| python-graphql-relay, python-i3-py, python-imagesize, python-ipaddress, | ||||
| python-ipykernel, python-ipywidgets, python-jupyter-client, | ||||
| python-jupyter-console, python-jupyter-core, python-kivy, python-kivy-next, | ||||
| python-libvirt, python-lirc, python-lit, python-mailmanclient, python-natsort, | ||||
| python-nautilus, python-nbconvert, python-nbformat, python-nltk, python-nose2, | ||||
| python-notebook, python-notmuch, python-odfpy, python-orderedmultidict, | ||||
| python-pafy, python-peewee, python-pika, python-polib, python-promise, | ||||
| python-publicsuffix, python-publicsuffix2, python-pycodestyle, python-pyev, | ||||
| python-pymongo, python-pypdf2, python-pyserial, python-pytest-django, | ||||
| python-pytest-flakes, python-pytest-mock, python-pytest-pep8, | ||||
| python-pythondialog, python-pyxb, python-q, python-rednose, python-reportlab, | ||||
| python-requests-oauthlib, python-rst.linker, python-s3transfer, | ||||
| python-sadisplay, python-schematics, python-setproctitle, python-sh, | ||||
| python-socksipy-branch, python-sqlalchemy-utils, python-stem, | ||||
| python-termcolor, python-termstyle, python-testpath, python-url, | ||||
| python-validictory, python-webencodings, python-whoosh, | ||||
| python-widgetsnbextension, python-xopen, python2-argcomplete, python2-axolotl, | ||||
| python2-axolotl-curve25519, python2-bcrypt, python2-betamax, | ||||
| python2-binaryornot, python2-biom-format, python2-bleach, | ||||
| python2-cachecontrol, python2-consul, python2-cov-core, | ||||
| python2-discogs-client, python2-django, python2-django-filter, | ||||
| python2-django-simple-math-captcha, python2-entrypoints, python2-feedparser, | ||||
| python2-flask-babel, python2-flask-restful-swagger, python2-freezegun, | ||||
| python2-furl, python2-future, python2-git-review, python2-glances, | ||||
| python2-graphene, python2-graphql-core, python2-graphql-relay, python2-i3-py, | ||||
| python2-imagesize, python2-ipykernel, python2-ipywidgets, | ||||
| python2-jupyter-client, python2-jupyter-console, python2-jupyter-core, | ||||
| python2-kivy, python2-kivy-next, python2-libvirt, python2-lirc, python2-lit, | ||||
| python2-mailmanclient, python2-natsort, python2-nbconvert, python2-nbformat, | ||||
| python2-nltk, python2-nose2, python2-notebook, python2-odfpy, | ||||
| python2-orderedmultidict, python2-pathlib2, python2-peewee, python2-pika, | ||||
| python2-polib, python2-promise, python2-publicsuffix, python2-publicsuffix2, | ||||
| python2-pycodestyle, python2-pyev, python2-pymongo, python2-pypdf, | ||||
| python2-pypdf2, python2-pyserial, python2-pytest-django, | ||||
| python2-pytest-flakes, python2-pytest-mock, python2-pytest-pep8, python2-pyxb, | ||||
| python2-q, python2-reportlab, python2-requests-oauthlib, python2-rpython, | ||||
| python2-rst.linker, python2-s3transfer, python2-sadisplay, python2-schematics, | ||||
| python2-setproctitle, python2-sh, python2-socksipy-branch, | ||||
| python2-sqlalchemy-utils, python2-stem, python2-termcolor, python2-testpath, | ||||
| python2-url, python2-validictory, python2-webencodings, python2-whoosh, | ||||
| python2-widgetsnbextension, python2-wxpython, python2-xopen, qmidiarp, | ||||
| qsyncthingtray, qtgraphicaleffects, qtox, qtquickcontrols, qtquickcontrols2, | ||||
| qtwebkit, quickswitch-i3, qwt, r-annotate, r-annotationforge, r-backports, | ||||
| r-bamsignals, r-batchjobs, r-bbmisc, r-bigmemory, r-bigmemory-sri, | ||||
| r-bioccheck, r-biocinstaller, r-biocstyle, r-biocviews, r-bit, r-bit64, | ||||
| r-bsgenome-celegans-ucsc-ce10, r-category, r-cellranger, r-checkmate, | ||||
| r-chipkernels, r-deseq2, r-dynamictreecut, r-e1071, r-fail, r-fastcluster, | ||||
| r-gdata, r-genefilter, r-geneplotter, r-getopt, r-gkmsvm, r-googlesheets, | ||||
| r-gostats, r-gplots, r-grohmm, r-gseabase, r-gtools, r-hmisc, r-hms, | ||||
| r-htmltable, r-hwriter, r-kernlab, r-kernsmooth, r-matrix, | ||||
| r-mutationalpatterns, r-optparse, r-pheatmap, r-preprocesscore, r-purrr, | ||||
| r-quadprog, r-r4rna, r-rbgl, r-rcas, r-rematch, r-rhtslib, r-rjson, r-rocr, | ||||
| r-rpart, r-rtsne, r-segmented, r-sendmailr, r-seqgl, r-sfsmisc, r-shortread, | ||||
| r-spams, r-survival, r-synchronicity, r-systempiper, r-tibble, | ||||
| r-txdb-hsapiens-ucsc-hg19-knowngene, r-viridislite, r-wgcna, radeontop, raxml, | ||||
| rcas-web, re2, remind, rkflashtool, roary, rpcbind, ruby-gherkin, | ||||
| ruby-net-http-digest-auth, rustc, samplv1, sane-backends-minimal, | ||||
| sbcl-alexandria, sbcl-bordeaux-threads, sbcl-cl-ppcre, sbcl-clx, sbcl-fiveam, | ||||
| sbcl-flexi-streams, sbcl-slynk, sbcl-stumpwm, sbcl-stumpwm-with-slynk, | ||||
| sbcl-trivial-gray-streams, schismtracker, sdcc, sddm, sendmail, sent, seq24, | ||||
| seqtk, sg3-utils, sic, snappy, solid, sonata, sonnet, speech-dispatcher, | ||||
| sqlcipher, squeak-vm, sshoot, sshuttle, sslh, stagit, stb-image-for-extempore, | ||||
| steghide, stfl, stress-make, sunxi-tools, supertuxkart, surfraw, | ||||
| swh-plugins-lv2, swish-e, tcp-wrappers, telepathy-idle, | ||||
| telepathy-mission-control, teximpatient, threadweaver, tint2, tintin++, | ||||
| tinyxml2, tomb, u-boot-am335x_boneblack, u-boot-malta, u-boot-vexpress_ca9x4, | ||||
| uget, utox, vc, viewnior, vifm, vim-full, virt-manager, vis, | ||||
| wayland-protocols, wcslib, weston, wgetpaste, whois, wxwidgets-gtk2, x265, | ||||
| xcalib, xcb-util-xrm, xlsx2csv, xonsh, xorg-server-xwayland, xpad, yadifa, | ||||
| yaml-cpp, yosys, ytalk, zzuf | ||||
| *** 864 package updates | ||||
| 
 | ||||
| abcde-2.7.2, accountsservice-0.6.43, adns-1.5.1, aisleriot-3.20.2, | ||||
| allegro-5.2.0, alot-0.4, alsa-utils-1.1.2, apl-1.6, aragorn-1.2.38, | ||||
| ardour-5.5, argon2-20161029, aria2-1.29.0, armadillo-7.500.0, | ||||
| armadillo-7.500.0, aspell-dict-en-2016.11.20-0, at-spi2-core-2.20.2, | ||||
| atlas-3.10.3, autoconf-2.69, autoconf-archive-2016.09.16, autogen-5.18.12, | ||||
| autojump-22.3.4, avr-binutils-2.27, avr-gcc-5.4.0, avr-toolchain-5.4.0, | ||||
| awesome-3.5.9, awscli-1.11.5, babl-0.1.18, bash-4.4.0, bash-completion-2.4, | ||||
| bash-minimal-4.4.0, bash-static-4.4.0, bdb-6.2.23, bedtools-2.26.0, | ||||
| beets-1.4.1, binutils-2.27, binutils-static-stripped-tarball-2.27, | ||||
| bioperl-minimal-1.7.0, bison-3.0.4, bitcoin-core-0.13.0, blender-2.78a, | ||||
| bluez-5.43, boost-1.61.0, borg-1.0.8, bowtie-2.2.9, btrfs-progs-4.8.5, | ||||
| bullet-2.85.1, bundler-1.13.6, c-ares-1.12.0, c-reduce-2.5.0, calibre-2.74.0, | ||||
| caribou-0.4.21, ccache-3.3.3, cereal-1.2.1, certbot-0.9.3, chess-6.2.4, | ||||
| chromium-bsu-0.9.16.1, claws-mail-3.14.1, clipper-1.1, cmake-3.6.1, | ||||
| cmocka-1.1.0, connman-1.33, coq-8.5pl2, cppcheck-1.76.1, cpupower-4.8.15, | ||||
| cryptsetup-1.7.3, cssc-1.4.0, cups-2.2.1, cups-filters-1.11.5, | ||||
| cups-minimal-2.2.1, curl-7.50.3, cutadapt-1.12, dblatex-0.3.9, dbus-1.10.14, | ||||
| dbus-glib-0.106, dconf-editor-3.20.3, dejagnu-1.6, diamond-0.8.29, dico-2.4, | ||||
| diffoscope-63, diffutils-3.5, direvent-5.1, docbook-xml-4.4, docbook-xml-4.5, | ||||
| docbook-xsl-1.79.1, dovecot-2.2.27, dropbear-2016.74, drumstick-1.1.0, | ||||
| efl-1.18.4, eigen-3.2.9, elfutils-0.167, emacs-25.1, emacs-dash-2.13.0, | ||||
| emacs-debbugs-0.12, emacs-emms-4.2, emacs-emms-player-mpv-0.0.10, | ||||
| emacs-expand-region-0.11.0, emacs-f-0.18.2, emacs-hl-todo-1.7.4, | ||||
| emacs-hydra-0.13.6, emacs-magit-popup-2.8.0, emacs-minimal-25.1, | ||||
| emacs-no-x-25.1, emacs-no-x-toolkit-25.1, emacs-s-1.11.0, | ||||
| emacs-smartparens-1.8.0, emacs-with-editor-2.5.8, encfs-1.9.1, | ||||
| enlightenment-0.21.5, entr-3.6, eog-3.20.4, epiphany-3.22.1, ethtool-4.8, | ||||
| eudev-3.2, evince-3.20.1, evolution-data-server-3.20.5, exfat-utils-1.2.5, | ||||
| expat-2.2.0, extra-cmake-modules-5.28.0, extremetuxracer-0.7.3, faust-2.0.a51, | ||||
| ffmpeg-2.8.9, ffmpeg-3.2.2, fftw-3.3.5, fftw-3.3.5, fftw-openmpi-3.3.5, | ||||
| fftwf-3.3.5, fftwf-3.3.5, file-5.28, file-roller-3.20.3, fish-2.4.0, | ||||
| flashrom-0.9.9, flex-2.6.1, font-dejavu-2.37, font-gnu-unifont-9.0.02, | ||||
| fontconfig-2.12.1, fossil-1.35, freefall-4.8.15, freeipmi-1.5.5, | ||||
| fuse-exfat-1.2.5, gajim-0.16.6, gambit-c-4.8.5, ganv-1.4.2-1.31685d283, | ||||
| gawk-4.1.4, gcc-4.9.4, gcc-5.4.0, gcc-6.2.0, gcc-objc++-4.9.4, gcc-objc-4.9.4, | ||||
| gcc-stripped-tarball-4.9.4, gcc-toolchain-6.2.0, gccgo-4.9.4, gcj-4.9.4, | ||||
| gdb-7.12, gedit-3.20.2, geiser-0.9, geiser-next-0.9, geoclue-2.4.4, | ||||
| gettext-0.19.8.1, gexiv2-0.10.4, gfortran-5.4.0, ghc-8.0.1, ghc-cmark-0.5.3.1, | ||||
| ghc-cryptonite-0.19, ghc-fgl-5.5.3.0, ghc-highlighting-kate-0.6.3, | ||||
| ghc-pandoc-1.17.2, ghc-pandoc-types-1.16.1.1, ghc-tagsoup-0.14, | ||||
| ghc-texmath-0.8.6.5, ghc-tls-1.3.8, ghc-trifecta-1.6, giac-xcas-1.2.2-103, | ||||
| gimp-2.8.18, girara-0.2.6, git-2.11.0, git-2.9.3, glew-2.0.0, glib-2.48.2, | ||||
| glib-networking-2.48.2, glibc-2.23, glibc-2.24, glibc-locales-2.24, | ||||
| glibc-utf8-locales-2.24, global-6.5.5, gmp-6.1.1, gmsh-2.15.0, gnome-3.20.4, | ||||
| gnome-bluetooth-3.20.0, gnome-desktop-3.20.2, gnome-klotski-3.20.2, | ||||
| gnome-maps-3.18.3, gnome-mines-3.20.1, gnome-mpv-0.10, | ||||
| gnome-online-accounts-3.20.3, gnome-screenshot-3.20.1, gnome-session-3.20.2, | ||||
| gnome-shell-3.20.4, gnome-sudoku-3.20.5, gnome-terminal-3.20.2, | ||||
| gnome-themes-standard-3.20.2, gnu-c-manual-0.2.5, gnucash-2.6.14, | ||||
| gnumach-headers-1.8, gnumeric-1.12.32, gnupg-1.4.21, gnupg-2.0.30, | ||||
| gnupg-2.1.16, gnuplot-5.0.5, gnurl-7.51.0, gnutls-3.5.4, go-1.7.4, | ||||
| goffice-0.10.32, gphoto2-2.5.11, graphicsmagick-1.3.25-1.56c8cae, gsl-2.3, | ||||
| gst-libav-1.10.2, gst-plugins-bad-1.10.2, gst-plugins-base-1.10.2, | ||||
| gst-plugins-good-1.10.2, gst-plugins-ugly-1.10.2, gstreamer-1.10.2, | ||||
| gtk+-3.20.9, gtk-doc-1.25, gtk-vnc-0.6.0, gtkmm-3.20.1, gtksourceview-3.20.4, | ||||
| guile-2.0.12, guile-daemon-0.1.1, guile-irregex-0.9.6, guile-lib-0.2.3, | ||||
| guile-ncurses-2.1, guile-next-2.1.5, guile-ssh-0.10.2, | ||||
| guile-static-stripped-2.0.12, guile-static-stripped-tarball-2.0.12, | ||||
| guile-xosd-0.2.1, guitarix-0.35.2, guix-0.11.0, guix-0.11.0-8.8d12, | ||||
| gvfs-1.28.3, gvpe-3.0, gzochi-0.10.1, harfbuzz-1.3.3, haskell-mode-16.1, | ||||
| hdf5-1.8.18, hdf5-parallel-openmpi-1.8.18, hexchat-2.12.2, higan-101, | ||||
| hop-2.5.1, hplip-3.16.11, httping-2.5, hunspell-1.5.4, hurd-core-headers-0.9, | ||||
| hurd-headers-0.9, hurd-minimal-0.9, hydra-20151030.1ff48da, hydrogen-0.9.7, | ||||
| i3-wm-4.13, ibus-1.5.14, icecat-45.5.1-gnu1, icedtea-3.2.0, idris-0.12.3, | ||||
| imagemagick-6.9.6-8, info-reader-6.3, inputproto-2.3.2, iproute2-4.9.0, | ||||
| irrlicht-1.8.4, irssi-0.8.20, isc-dhcp-4.3.5, iw-4.9, jansson-2.9, | ||||
| jasper-2.0.6, java-ngs-1.2.5, jbig2dec-0.13, jpegoptim-1.4.4, json-c-0.12.1, | ||||
| json-glib-1.2.2, julia-0.5.0, keepassx-2.0.3, khal-0.8.4, | ||||
| kwindowsystem-5.28.0, ldb-1.1.27, ldc-0.17.2, ledger-3.1.1, letsencrypt-0.9.3, | ||||
| lftp-4.7.4, libass-0.13.4, libcdio-0.94, libdrm-2.4.68, libev-4.23, | ||||
| libgcrypt-1.7.3, libgit2-0.24.3, libgpg-error-1.24, libgphoto2-2.5.11, | ||||
| libgsf-1.14.40, libgtop-2.34.1, libgweather-3.20.3, libiberty-4.9.4, | ||||
| libidn-1.33, libinput-1.5.1, libinput-minimal-1.5.1, libjpeg-9b, | ||||
| libksba-1.3.5, libmateweather-1.16.1, libmicrohttpd-0.9.52, libmikmod-3.3.10, | ||||
| libpng-1.6.25, libpsl-0.16.1, libraw-0.17.2, libraw1394-2.1.2, librecad-2.1.3, | ||||
| libreoffice-5.1.5.2, libressl-2.5.0, librsvg-2.40.16, libsigc++-2.10.0, | ||||
| libsodium-1.0.11, libsoup-2.56.0, libstdc++-4.9.4, libstdc++-doc-5.4.0, | ||||
| libtasn1-4.9, libtiff-4.0.7, libuninameslist-20160701, libupnp-1.6.20, | ||||
| libva-1.7.1, libvpx-1.6.0, libwebp-0.5.1, libwnck-3.20.1, libx11-1.6.4, | ||||
| libx264-20161205-2245, libxcb-1.11.1, libxfixes-5.0.3, libxfont-1.5.2, | ||||
| libxi-1.7.8, libxmp-4.4.1, libxrandr-1.5.1, libxrender-0.9.10, libxtst-1.2.3, | ||||
| libxv-1.0.11, libxvmc-1.0.10, lilv-0.22.0, lilypond-2.19.51, links-2.14, | ||||
| linux-libre-4.4.39, linux-libre-4.8.15, linux-libre-headers-4.4.18, | ||||
| linux-pam-1.3.0, llvm-3.6.2, llvm-3.7.1, llvm-3.7.1, llvm-3.8.1, | ||||
| lm-sensors-3.4.0, love-0.10.2, lrzip-0.631, lua-5.3.3, lv2-1.14.0, | ||||
| lvm2-2.02.166, lynx-2.8.9dev.9, mafft-7.305, magit-2.8.0, mailutils-3.0, | ||||
| make-4.2.1, man-pages-4.09, manaplus-1.6.8.14, mariadb-10.1.19, | ||||
| mate-desktop-1.16.1, mate-icon-theme-1.16.0, mate-menus-1.16.0, | ||||
| mate-themes-3.20.9, maxima-5.39.0, mercurial-3.9, mesa-13.0.2, | ||||
| mesa-headers-13.0.2, metabat-0.32.4-1.cbdca756, mig-1.8, miniupnpc-2.0, | ||||
| mit-krb5-1.14.3, mosh-1.2.6, mozjs-24.2.0, mpd-0.19.19, mpd-mpc-0.28, | ||||
| mpg123-1.23.8, mpg321-0.3.2, mpv-0.22.0, mumps-5.0.2, mumps-metis-5.0.2, | ||||
| mumps-metis-openmpi-5.0.2, mumps-openmpi-5.0.2, mupdf-1.10a, mutt-1.7.1, | ||||
| mutter-3.20.3, mysql-5.7.16, nano-2.7.2, nasm-2.12.02, nautilus-3.20.2, | ||||
| ncbi-vdb-2.7.0, ncdu-1.12, ncmpc-0.25, ncmpcpp-0.7.7, nestopia-ue-1.47, | ||||
| netcdf-4.4.1.1, netcdf-parallel-openmpi-4.4.1.1, nettle-3.2, | ||||
| network-manager-1.4.2, network-manager-applet-1.4.2, nginx-1.11.6, | ||||
| ngs-sdk-1.2.5, nmap-7.31, node-6.8.0, non-sequencer-1.9.5-2.a22f33f, | ||||
| notmuch-0.23.3, npth-1.3, nss-3.27.2, nss-certs-3.27.2, ntp-4.2.8p9, | ||||
| obs-0.16.6, octave-4.2.0, offlineimap-7.0.12, opam-1.2.2, openal-1.17.2, | ||||
| openblas-0.2.19, openconnect-7.08, openjpeg-2.1.1, openssh-7.4p1, | ||||
| openssl-1.0.2j, openssl-1.1.0c, opusfile-0.8, orc-0.4.26, orfm-0.6.1, | ||||
| owncloud-client-2.2.4, oxygen-icons-5.28.0, p11-kit-0.23.2, pangomm-2.40.1, | ||||
| parallel-20161122, pardre-1.1.5-1, pciutils-3.5.2, perf-4.8.15, perl-5.24.0, | ||||
| perl-apache-logformat-compiler-0.33, perl-catalyst-action-rest-1.20, | ||||
| perl-catalyst-plugin-accesslog-1.10, perl-catalyst-plugin-session-0.40, | ||||
| perl-catalyst-view-json-0.36, perl-catalyst-view-tt-0.44, perl-cgi-4.35, | ||||
| perl-class-method-modifiers-2.12, perl-dbd-mysql-4.041, perl-dbd-sqlite-1.52, | ||||
| perl-dbix-class-0.082840, perl-dbix-class-cursor-cached-1.001004, | ||||
| perl-dbix-class-introspectablem2m-0.001002, | ||||
| perl-dbix-class-schema-loader-0.07046, perl-email-address-1.908, | ||||
| perl-email-messageid-1.406, perl-email-mime-1.937, | ||||
| perl-email-mime-contenttype-1.018, perl-email-sender-1.300028, | ||||
| perl-email-simple-2.211, perl-encode-locale-1.05, perl-eval-closure-0.14, | ||||
| perl-finance-quote-1.38, perl-html-parser-3.72, perl-http-body-1.22, | ||||
| perl-http-cookiejar-0.008, perl-http-message-6.11, | ||||
| perl-http-server-simple-0.51, perl-http-tiny-0.070, perl-io-socket-ssl-2.038, | ||||
| perl-libwww-6.15, perl-module-build-0.4220, perl-namespace-autoclean-0.28, | ||||
| perl-test-mockobject-1.20150527, perl-test-simple-1.302062, | ||||
| perl-unicode-linebreak-2016.003, perl-xml-compile-1.54, | ||||
| perl-xml-compile-cache-1.05, perl-xml-compile-soap-3.20, | ||||
| perl-xml-compile-wsdl11-3.05, perl-xml-dom-1.46, perl-xml-libxml-simple-0.97, | ||||
| pies-1.3, pinentry-1.0.0, pinentry-gtk2-1.0.0, pinentry-qt-1.0.0, | ||||
| pinentry-tty-1.0.0, poppler-0.47.0, poppler-qt4-0.47.0, poppler-qt5-0.47.0, | ||||
| postgresql-9.5.5, privoxy-3.0.26, procps-3.3.12, pulseaudio-9.0, python-3.4.5, | ||||
| python-3.5.2, python-acme-0.9.3, python-beautifulsoup4-4.5.1, | ||||
| python-billiard-3.3.0.23, python-biopython-1.68, python-botocore-1.4.62, | ||||
| python-celery-3.1.24, python-certifi-2016.8.31, python-cryptography-1.7.1, | ||||
| python-cryptography-vectors-1.7.1, python-cython-0.24.1, | ||||
| python-dateutil-2.5.2, python-dnspython-1.15.0, python-docutils-0.13.1, | ||||
| python-efl-1.18.0, python-fake-factory-0.7.2, python-file-5.28, | ||||
| python-flake8-2.5.4, python-flask-0.11.1, python-gst-1.10.2, | ||||
| python-html5lib-1.0b10, python-icalendar-3.11, python-ipython-4.0.3, | ||||
| python-jellyfish-0.5.6, python-joblib-0.10.3, python-kombu-3.0.37, | ||||
| python-llfuse-1.1.1, python-mccabe-0.4.0, python-minimal-3.5.2, | ||||
| python-minimal-wrapper-3.5.2, python-msgpack-0.4.8, python-munkres-1.0.8, | ||||
| python-musicbrainzngs-0.6, python-mutagen-1.35.1, python-os-testr-0.8.0, | ||||
| python-passlib-1.7.0, python-pillow-3.3.3, python-plastid-0.4.6, | ||||
| python-prompt-toolkit-1.0.7, python-py3status-3.1, python-pyasn1-0.1.9, | ||||
| python-pyflakes-1.0.0, python-pylast-1.6.0, python-pyld-0.7.1, | ||||
| python-pyopenssl-16.2.0, python-pyqt-5.7, python-pysam-0.9.1.4, | ||||
| python-pytest-2.9.2, python-rarfile-2.8, python-requests-mock-1.0.0, | ||||
| python-rsa-3.4.2, python-setuptools-31.0.0, python-simplejson-3.10.0, | ||||
| python-sip-4.18.1, python-tempest-lib-1.0.0, python-traitlets-4.2.0, | ||||
| python-twobitreader-3.1.4, python-urllib3-1.18.1, python-urwid-1.3.1, | ||||
| python-urwidtrees-1.0.2, python-vcversioner-2.16.0.0, | ||||
| python-virtualenv-15.0.3, python-waf-1.9.5, python-werkzeug-0.11.11, | ||||
| python-wrapper-3.5.2, python-xlrd-1.0.0, python2-acme-0.9.3, | ||||
| python2-beautifulsoup4-4.5.1, python2-billiard-3.3.0.23, | ||||
| python2-biopython-1.68, python2-botocore-1.4.62, python2-celery-3.1.24, | ||||
| python2-certifi-2016.8.31, python2-cryptography-1.7.1, | ||||
| python2-cryptography-vectors-1.7.1, python2-cython-0.24.1, | ||||
| python2-dateutil-2.5.2, python2-dnspython-1.15.0, python2-docutils-0.13.1, | ||||
| python2-efl-1.18.0, python2-fake-factory-0.7.2, python2-file-5.28, | ||||
| python2-flake8-2.5.4, python2-flask-0.11.1, python2-gst-1.10.2, | ||||
| python2-html5lib-1.0b10, python2-ipaddress-1.0.16, python2-ipython-4.0.3, | ||||
| python2-jellyfish-0.5.6, python2-joblib-0.10.3, python2-kombu-3.0.37, | ||||
| python2-llfuse-1.1.1, python2-mccabe-0.4.0, python2-msgpack-0.4.8, | ||||
| python2-munkres-1.0.8, python2-musicbrainzngs-0.6, python2-mutagen-1.35.1, | ||||
| python2-notmuch-0.23.3, python2-os-testr-0.8.0, python2-passlib-1.7.0, | ||||
| python2-pbcore-1.2.10, python2-pep8-1.7.0, python2-pillow-3.3.3, | ||||
| python2-plastid-0.4.6, python2-prompt-toolkit-1.0.7, python2-pyasn1-0.1.9, | ||||
| python2-pyflakes-1.0.0, python2-pylast-1.6.0, python2-pyld-0.7.1, | ||||
| python2-pyopenssl-16.2.0, python2-pyqt-5.7, python2-pysam-0.9.1.4, | ||||
| python2-rarfile-2.8, python2-requests-mock-1.0.0, python2-rsa-3.4.2, | ||||
| python2-setuptools-31.0.0, python2-simplejson-3.10.0, python2-sip-4.18.1, | ||||
| python2-tempest-lib-1.0.0, python2-traitlets-4.2.0, | ||||
| python2-twobitreader-3.1.4, python2-urllib3-1.18.1, python2-urwid-1.3.1, | ||||
| python2-urwidtrees-1.0.2, python2-vcversioner-2.16.0.0, | ||||
| python2-virtualenv-15.0.3, python2-waf-1.9.5, python2-werkzeug-0.11.11, | ||||
| python2-xlrd-1.0.0, qemu-2.7.0, qemu-minimal-2.7.0, qpdf-6.0.0, qsynth-0.4.3, | ||||
| qt-5.6.2, qtbase-5.7.0, qtconnectivity-5.7.0, qtdeclarative-5.7.0, | ||||
| qtimageformats-5.7.0, qtlocation-5.7.0, qtmultimedia-5.7.0, qtractor-0.8.0, | ||||
| qtscript-5.7.0, qtsensors-5.7.0, qtserialport-5.7.0, qtsvg-5.7.0, | ||||
| qttools-5.7.0, qtwayland-5.7.0, qtwebchannel-5.7.0, qtwebsockets-5.7.0, | ||||
| qtx11extras-5.7.0, qtxmlpatterns-5.7.0, r-3.3.2, r-acepack-1.4.1, | ||||
| r-acsnminer-0.16.8.25, r-annotationdbi-1.36.0, r-biobase-2.34.0, | ||||
| r-biocgenerics-0.20.0, r-biocparallel-1.8.1, r-biomart-2.30.0, | ||||
| r-biostrings-2.42.0, r-bsgenome-1.42.0, r-cluster-2.0.5, r-codetools-0.2-15, | ||||
| r-colorspace-1.2-7, r-crayon-1.3.2, r-curl-2.2, r-dbi-0.5-1, | ||||
| r-devtools-1.12.0, r-digest-0.6.10, r-dnacopy-1.48.0, r-dplyr-0.5.0, r-dt-0.2, | ||||
| r-edger-3.16.1, r-evaluate-0.10, r-foreign-0.8-67, r-futile-logger-1.4.3, | ||||
| r-gdtools-0.1.1, r-genomation-1.6.0, r-genomationdata-1.6.0, | ||||
| r-genomeinfodb-1.10.0, r-genomicalignments-1.10.0, r-genomicfeatures-1.26.0, | ||||
| r-genomicranges-1.26.1, r-go-db-3.4.0, r-graph-1.52.0, r-htmlwidgets-0.7, | ||||
| r-httr-1.2.1, r-impute-1.48.0, r-iranges-2.8.0, r-irlba-2.1.2, r-jsonlite-1.1, | ||||
| r-knitr-1.14, r-lambda-r-1.1.9, r-lattice-0.20-34, r-lazyeval-0.2.0, | ||||
| r-limma-3.30.2, r-matrixstats-0.51.0, r-mgcv-1.8-15, r-mime-0.5, | ||||
| r-motifrg-1.18.0, r-multitaper-1.0-12, r-openssl-0.9.5, r-org-ce-eg-db-3.4.0, | ||||
| r-org-dm-eg-db-3.4.0, r-org-hs-eg-db-3.4.0, r-org-mm-eg-db-3.4.0, | ||||
| r-permute-0.9-4, r-plotly-4.5.2, r-plotrix-3.6-3, r-plyr-1.8.4, | ||||
| r-pracma-1.9.5, r-proto-1.0.0, r-r-oo-1.21.0, r-r-utils-2.4.0, r-r6-2.2.0, | ||||
| r-rcpp-0.12.7, r-rcpparmadillo-0.7.500.0.0, r-readr-1.0.0, r-reshape2-1.4.2, | ||||
| r-rmarkdown-1.1, r-rsamtools-1.26.1, r-rstudioapi-0.6, r-rtracklayer-1.34.1, | ||||
| r-rversions-1.0.3, r-s4vectors-0.12.0, r-seqinr-3.3-3, r-seqlogo-1.40.0, | ||||
| r-seqpattern-1.6.0, r-snow-0.4-2, r-sparsem-1.72, r-stringi-1.1.2, | ||||
| r-stringr-1.1.0, r-summarizedexperiment-1.4.0, r-tidyr-0.6.0, r-topgo-2.26.0, | ||||
| r-variantannotation-1.20.0, r-vegan-2.4-1, r-withr-1.0.2, r-xml2-1.0.0, | ||||
| r-xvector-0.14.0, r-zlibbioc-1.20.0, racket-6.6, rage-0.2.1, | ||||
| raul-0.8.4-1.f8bf77d3c, readline-7.0, red-eclipse-1.5.6, redis-3.2.4, | ||||
| retroarch-1.3.6, rhythmbox-3.4, rofi-1.2.0, ruby-2.1.10, ruby-2.2.6, | ||||
| ruby-2.3.3, ruby-activesupport-5.0.0, ruby-arel-7.1.4, | ||||
| ruby-cucumber-core-1.5.0, ruby-domain-name-0.5.20161021, ruby-hoe-3.15.2, | ||||
| ruby-http-cookie-1.0.3, ruby-lumberjack-1.0.10, | ||||
| ruby-mime-types-data-3.2016.0521, ruby-puma-3.6.0, ruby-rack-2.0.1, | ||||
| ruby-rake-compiler-1.0.1, ruby-rspec-3.5.0, ruby-rspec-core-3.5.4, | ||||
| ruby-rspec-expectations-3.5.0, ruby-rspec-mocks-3.5.0, ruby-sdoc-0.4.2, | ||||
| ruby-sequel-4.40.0, ruby-shoulda-context-1.2.2, ruby-simplecov-0.12.0, | ||||
| ruby-spring-1.7.2, ruby-sqlite3-1.3.12, ruby-tzinfo-data-1.2016.9, | ||||
| ruby-yard-0.9.5-1.d816482a, rush-1.8, samba-4.5.3, samtools-1.3.1, | ||||
| sane-backends-1.0.25, scribus-1.5.2, sdl2-2.0.5, serd-0.22.0, | ||||
| shared-mime-info-1.7, shepherd-0.3.2, shotwell-0.25.0.1, signify-20, | ||||
| simple-scan-3.22.0.1, slock-1.3, sord-0.14.0, sqlite-3.14.1, sqlite-3.15.1, | ||||
| sra-tools-2.7.0, st-0.7, star-2.5.2b, starfighter-1.6, subread-1.5.1, | ||||
| subversion-1.8.17, supertux-0.5.0, swig-3.0.10, synergy-1.8.2, synthv1-0.8.0, | ||||
| taglib-1.10, talloc-2.1.8, tbb-2017_20160916, tdb-1.3.11, termite-12, | ||||
| tevent-0.9.31, texinfo-6.3, thefuck-3.11, tig-2.2, tilda-1.3.3, tiled-0.17.0, | ||||
| tmux-2.3, tor-0.2.9.8, torsocks-2.2.0, transmission-2.92, tuxguitar-1.3.2, | ||||
| tzdata-2016j, udisks-2.1.8, usbredir-0.7.1-1.ac80a59, usbutils-008, | ||||
| utf8proc-2.0.2, util-linux-2.28.1, vala-0.32.1, valgrind-3.12.0, | ||||
| vapoursynth-35, vdirsyncer-0.14.0, videoproto-2.3.3, vim-8.0.0133, | ||||
| vsearch-2.3.4, vte-0.44.2, vtk-7.1.0, w3m-0.5.3+git20161120, | ||||
| warzone2100-3.2.1, webkitgtk-2.14.2, weechat-1.6, weex-2.8.2, | ||||
| windowmaker-0.95.7, wine-1.9.24, wireless-regdb-2016.06.10, wireshark-2.2.2, | ||||
| wpa-supplicant-2.6, wpa-supplicant-minimal-2.6, wxmaxima-16.12.0, | ||||
| xapian-1.4.1, xboard-4.9.1, xf86-input-evdev-2.10.4, | ||||
| xf86-input-joystick-1.6.3, xf86-input-keyboard-1.9.0, | ||||
| xf86-input-libinput-0.23.0, xf86-input-mouse-1.9.2, | ||||
| xf86-input-synaptics-1.9.0, xf86-video-ati-7.8.0, xf86-video-nouveau-1.0.13, | ||||
| xf86-video-openchrome-0.5.0, xkbcomp-1.3.1, xkeyboard-config-2.18, xmp-4.1.0, | ||||
| xorg-server-1.18.4, xorriso-1.4.6, xproto-7.0.29, yoshimi-1.5.0, | ||||
| youtube-dl-2016.12.15, zathura-0.3.6, zathura-cb-0.1.5, zathura-djvu-0.2.5, | ||||
| zathura-pdf-poppler-0.2.6, zathura-ps-0.2.3, zile-2.4.13, zimg-2.3, | ||||
| zynaddsubfx-3.0.1 | ||||
| 
 | ||||
| ** Programming interfaces | ||||
| 
 | ||||
| *** New procedure ‘package-for-guile-2.2’ for Guile package variants | ||||
| *** New ‘package-input-rewriting’ customization procedure in (guix packages) | ||||
| *** New ‘deprecated-package’ procedure in (guix packages) | ||||
| *** New ‘file-append’ procedure in (guix gexp) | ||||
| *** New (guix modules) module, to determine the closure of a Guile module | ||||
| *** ‘wrap-program’ from (guix utils) now produces only one wrapper file. | ||||
| 
 | ||||
| ** Noteworthy bug fixes | ||||
| 
 | ||||
| *** ‘ld-wrapper’ no longer aborts if Guile 2.2 modules are in the search path | ||||
| *** ‘guix system reconfigure’ no longer unloads services depended on | ||||
| *** GuixSD ‘menu-entry’ can specify arbitrary kernel and initrd file names | ||||
|     (<http://bugs.gnu.org/20067>) | ||||
| *** Fix typo in device-opening code for ‘raid-device-type’ | ||||
| *** Grafts are applied to replacement packages (<http://bugs.gnu.org/24418>) | ||||
| *** guix-daemon does not fail when deduplicating would lead to ENOSPC | ||||
| *** ‘guix download’ now checks X.509 certificates by default (<http://bugs.gnu.org/24466>) | ||||
| *** Avoid bootstrapping issue for HTTPS downloads (<http://bugs.gnu.org/22774>) | ||||
| *** Failed build directories are owned by the user to ease debugging (<http://bugs.gnu.org/15890>) | ||||
| *** Significantly reduced the closure of Perl (<http://bugs.gnu.org/23077>) | ||||
| *** Fixed importer for Nixpkgs (<http://bugs.gnu.org/25053>) | ||||
| 
 | ||||
| ** Native language support | ||||
| 
 | ||||
| Updated translations: da (Danish), pl (Polish), de (German), pt_BR (Portuguese, Brazil), and fr (French). | ||||
| 
 | ||||
| * Changes in 0.11.0 (since 0.10.0) | ||||
| 
 | ||||
| ** Package management | ||||
|  |  | |||
|  | @ -37,12 +37,17 @@ | |||
|                 (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. | ||||
|                   ;; 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)) | ||||
|  |  | |||
|  | @ -1,84 +0,0 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
| ;;; GNU Guix is free software; you can redistribute it and/or modify it | ||||
| ;;; under the terms of the GNU General Public License as published by | ||||
| ;;; the Free Software Foundation; either version 3 of the License, or (at | ||||
| ;;; your option) any later version. | ||||
| ;;; | ||||
| ;;; GNU Guix is distributed in the hope that it will be useful, but | ||||
| ;;; WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| ;;; GNU General Public License for more details. | ||||
| ;;; | ||||
| ;;; You should have received a copy of the GNU General Public License | ||||
| ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| 
 | ||||
| ;;; | ||||
| ;;; 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 | ||||
| the GNU Shepherd (http://www.gnu.org/software/shepherd/). | ||||
| 
 | ||||
| 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))) | ||||
|  | @ -125,12 +125,6 @@ SYSTEM." | |||
|     "arm-linux-gnueabihf" | ||||
|     "i686-w64-mingw32")) | ||||
| 
 | ||||
| (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 %guixsd-supported-systems | ||||
|   '("x86_64-linux" "i686-linux")) | ||||
| 
 | ||||
|  | @ -156,14 +150,7 @@ system.") | |||
|     (expt 2 20)) | ||||
| 
 | ||||
|   (if (member system %guixsd-supported-systems) | ||||
|       (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 | ||||
|       (list (->job 'usb-image | ||||
|                    (run-with-store store | ||||
|                      (mbegin %store-monad | ||||
|                        (set-guile-for-build (default-guile)) | ||||
|  |  | |||
							
								
								
									
										22
									
								
								configure.ac
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								configure.ac
									
										
									
									
									
								
							|  | @ -2,7 +2,7 @@ | |||
| # Process this file with autoconf to produce a configure script. | ||||
| 
 | ||||
| AC_PREREQ(2.68) | ||||
| AC_INIT([GNU Guix], [0.11.0], [bug-guix@gnu.org], [guix], | ||||
| AC_INIT([GNU Guix], [0.12.0], [bug-guix@gnu.org], [guix], | ||||
|   [http://www.gnu.org/software/guix/]) | ||||
| AC_CONFIG_AUX_DIR([build-aux]) | ||||
| 
 | ||||
|  | @ -216,6 +216,11 @@ AC_MSG_CHECKING([for zlib's shared library name]) | |||
| AC_MSG_RESULT([$LIBZ]) | ||||
| AC_SUBST([LIBZ]) | ||||
| 
 | ||||
| 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"]) | ||||
| 
 | ||||
| AC_CACHE_SAVE | ||||
| 
 | ||||
| m4_include([config-daemon.ac]) | ||||
|  | @ -227,6 +232,10 @@ AM_MISSING_PROG([DOT], [dot]) | |||
| dnl Manual pages. | ||||
| AM_MISSING_PROG([HELP2MAN], [help2man]) | ||||
| 
 | ||||
| dnl Emacs (optional), for 'etc/indent-package.el'. | ||||
| AC_PATH_PROG([EMACS], [emacs], [/usr/bin/emacs]) | ||||
| AC_SUBST([EMACS]) | ||||
| 
 | ||||
| AC_CONFIG_FILES([Makefile | ||||
|                  po/guix/Makefile.in | ||||
|                  po/packages/Makefile.in | ||||
|  | @ -236,15 +245,6 @@ AC_CONFIG_FILES([scripts/guix], [chmod +x scripts/guix]) | |||
| 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]) | ||||
| 
 | ||||
| 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_CONFIG_FILES([etc/indent-package.el], [chmod +x etc/indent-package.el]) | ||||
| 
 | ||||
| AC_OUTPUT | ||||
|  |  | |||
|  | @ -187,9 +187,6 @@ facilities to directly operate on the syntax tree, such as raising an | |||
| s-expression or wrapping it, swallowing or rejecting the following | ||||
| s-expression, etc. | ||||
| 
 | ||||
| GNU Guix also comes with a minor mode that provides some additional | ||||
| functionality for Scheme buffers (@pxref{Emacs Development}). | ||||
| 
 | ||||
| 
 | ||||
| @node Coding Style | ||||
| @section Coding Style | ||||
|  | @ -240,6 +237,8 @@ especially when matching lists. | |||
| @node Formatting Code | ||||
| @subsection Formatting Code | ||||
| 
 | ||||
| @cindex formatting code | ||||
| @cindex coding style | ||||
| When writing Scheme code, we follow common wisdom among Scheme | ||||
| programmers.  In general, we follow the | ||||
| @url{http://mumble.net/~campbell/scheme/style.txt, Riastradh's Lisp | ||||
|  | @ -249,8 +248,20 @@ please do read it. | |||
| 
 | ||||
| Some special forms introduced in Guix, such as the @code{substitute*} | ||||
| macro, have special indentation rules.  These are defined in the | ||||
| @file{.dir-locals.el} file, which Emacs automatically uses.  If you do | ||||
| not use Emacs, please make sure to let your editor know the rules. | ||||
| @file{.dir-locals.el} file, which Emacs automatically uses. | ||||
| 
 | ||||
| @cindex indentation, of code | ||||
| @cindex formatting, of code | ||||
| If you do not use Emacs, please make sure to let your editor knows these | ||||
| rules.  To automatically indent a package definition, you can also run: | ||||
| 
 | ||||
| @example | ||||
| ./etc/indent-package.el gnu/packages/@var{file}.scm @var{package} | ||||
| @end example | ||||
| 
 | ||||
| @noindent | ||||
| This automatically indents the definition of @var{package} in | ||||
| @file{gnu/packages/@var{file}.scm} by running Emacs in batch mode. | ||||
| 
 | ||||
| We require all top-level procedures to carry a docstring.  This | ||||
| requirement can be relaxed for simple private procedures in the | ||||
|  | @ -361,6 +372,11 @@ Bundling unrelated changes together makes reviewing harder and slower. | |||
| Examples of unrelated changes include the addition of several packages, | ||||
| or a package update along with fixes to that package. | ||||
| 
 | ||||
| @item | ||||
| Please follow our code formatting rules, possibly running the | ||||
| @command{etc/indent-package.el} script to do that automatically for you | ||||
| (@pxref{Formatting Code}). | ||||
| 
 | ||||
| @end enumerate | ||||
| 
 | ||||
| When posting a patch to the mailing list, use @samp{[PATCH] @dots{}} as | ||||
|  | @ -368,4 +384,4 @@ a subject.  You may use your email client or the @command{git | |||
| send-email} command.  We prefer to get patches in plain text messages, | ||||
| either inline or as MIME attachments.  You are advised to pay attention if | ||||
| your email client changes anything like line breaks or indentation which | ||||
| could could potentially break the patches. | ||||
| could potentially break the patches. | ||||
|  |  | |||
							
								
								
									
										881
									
								
								doc/emacs.texi
									
										
									
									
									
								
							
							
						
						
									
										881
									
								
								doc/emacs.texi
									
										
									
									
									
								
							|  | @ -1,881 +0,0 @@ | |||
| @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. | ||||
| * Licenses: Emacs Licenses.		Interface for licenses of Guix packages. | ||||
| * Package Source Locations: Emacs Package Locations.	Interface for package location files. | ||||
| * 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. | ||||
| * Hydra: Emacs Hydra.			Interface for Guix build farm. | ||||
| @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 | ||||
| @code{guix-autoloads} file.  If you install Guix in your user profile, | ||||
| this auto-loading is done automatically by our Emacs package | ||||
| (@pxref{Application Setup}), so a universal recipe for configuring | ||||
| ``guix.el'' is: @command{guix package -i guix}.  If you do this, there | ||||
| is no need to read further. | ||||
| 
 | ||||
| For the manual installation, you need to add 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-autoloads 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.  Note | ||||
| that if you don't update this installation periodically, you may get an | ||||
| outdated Emacs code which does not work with the current Guile code of | ||||
| Guix. | ||||
| 
 | ||||
| @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, as it may be garbage-collected one day.  So a better choice | ||||
| would be to install Guix using Guix itself with @command{guix package -i | ||||
| guix}. | ||||
| 
 | ||||
| @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-autoloads nil t) | ||||
| @end example | ||||
| @end itemize | ||||
| 
 | ||||
| 
 | ||||
| @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 | ||||
| @itemx M-x guix-installed-user-packages | ||||
| @itemx M-x guix-installed-system-packages | ||||
| Display installed packages.  As described above, @kbd{M-x | ||||
| guix-installed-packages} uses an arbitrary profile that you can specify, | ||||
| while the other commands display packages installed in 2 special | ||||
| profiles: @file{~/.guix-profile} and @file{/run/current-system/profile} | ||||
| (only on GuixSD). | ||||
| 
 | ||||
| @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-packages-by-name | ||||
| Display package(s) with the specified name. | ||||
| 
 | ||||
| @item M-x guix-packages-by-license | ||||
| Display package(s) with the specified license. | ||||
| 
 | ||||
| @item M-x guix-packages-by-location | ||||
| Display package(s) located in the specified file.  These files usually | ||||
| have the following form: @file{gnu/packages/emacs.scm}, but don't type | ||||
| them manually!  Press @key{TAB} to complete the file name. | ||||
| 
 | ||||
| @item M-x guix-package-from-file | ||||
| Display package that the code within the specified file evaluates to. | ||||
| @xref{Invoking guix package, @code{--install-from-file}}, for an example | ||||
| of what such a file may look like. | ||||
| 
 | ||||
| @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-package-search-params} variable. | ||||
| 
 | ||||
| @item M-x guix-search-by-name | ||||
| Search for packages with names matching a specified regexp.  This | ||||
| command is the same as @code{guix-search-by-regexp}, except only a | ||||
| package ``name'' is searched. | ||||
| 
 | ||||
| @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 | ||||
| 
 | ||||
| Analogously on GuixSD you can also display system generations: | ||||
| 
 | ||||
| @table @kbd | ||||
| @item M-x guix-system-generations | ||||
| @item M-x guix-last-system-generations | ||||
| @item M-x guix-system-generations-by-time | ||||
| @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 restarted.  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 | ||||
| @cindex REPL | ||||
| @cindex read-eval-print loop | ||||
| 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 | ||||
| simply @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 current 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. | ||||
| @item B | ||||
| Display latest builds of the current package (@pxref{Emacs Hydra}). | ||||
| @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 browse license URL; | ||||
| @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 | ||||
| If nil, has the same meaning as @code{--no-substitutes} option | ||||
| (@pxref{Invoking guix build}). | ||||
| 
 | ||||
| @item guix-dry-run | ||||
| If non-nil, 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-ui-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)) | ||||
| @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-buffer-map | ||||
| Parent keymap with general keys for any buffer type. | ||||
| 
 | ||||
| @item guix-ui-map | ||||
| Parent keymap with general keys for buffers used for Guix package | ||||
| management (for packages, outputs and generations). | ||||
| 
 | ||||
| @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 (@dfn{ENTRY-TYPE} means @code{package}, | ||||
| @code{output} or @code{generation}): | ||||
| 
 | ||||
| @table @code | ||||
| @item guix-ENTRY-TYPE-list-format | ||||
| @itemx guix-ENTRY-TYPE-list-titles | ||||
| Specify the columns, their names, what and how is displayed in ``list'' | ||||
| buffers. | ||||
| 
 | ||||
| @item guix-ENTRY-TYPE-info-format | ||||
| @itemx guix-ENTRY-TYPE-info-titles | ||||
| @itemx guix-info-ignore-empty-values | ||||
| @itemx guix-info-param-title-format | ||||
| @itemx guix-info-multiline-prefix | ||||
| @itemx guix-info-indent | ||||
| @itemx guix-info-fill | ||||
| @itemx guix-info-delimiter | ||||
| Various settings for ``info'' buffers. | ||||
| 
 | ||||
| @end table | ||||
| 
 | ||||
| 
 | ||||
| @node Emacs Licenses | ||||
| @section Licenses | ||||
| 
 | ||||
| If you want to browse the URL of a particular license, or to look at a | ||||
| list of licenses, you may use the following commands: | ||||
| 
 | ||||
| @table @kbd | ||||
| 
 | ||||
| @item M-x guix-browse-license-url | ||||
| Choose a license from a completion list to browse its URL using | ||||
| @code{browse-url} function (@pxref{Browse-URL,,, emacs, The GNU Emacs | ||||
| Manual}). | ||||
| 
 | ||||
| @item M-x guix-licenses | ||||
| Display a list of available licenses.  You can press @kbd{@key{RET}} | ||||
| there to display packages with this license in the same way as @kbd{M-x | ||||
| guix-packages-by-license} would do (@pxref{Emacs Commands}). | ||||
| 
 | ||||
| @item M-x guix-find-license-definition | ||||
| Open @file{@dots{}/guix/licenses.scm} and move to the specified license. | ||||
| 
 | ||||
| @end table | ||||
| 
 | ||||
| 
 | ||||
| @node Emacs Package Locations | ||||
| @section Package Source Locations | ||||
| 
 | ||||
| As you know, package definitions are placed in Guile files, also known | ||||
| as @dfn{package locations}.  The following commands should help you not | ||||
| get lost in these locations: | ||||
| 
 | ||||
| @table @kbd | ||||
| 
 | ||||
| @item M-x guix-locations | ||||
| Display a list of package locations.  You can press @key{RET} there to | ||||
| display packages placed in the current location in the same way as | ||||
| @kbd{M-x guix-packages-by-location} would do (@pxref{Emacs Commands}). | ||||
| Note that when the point is on a location button, @key{RET} will open | ||||
| this location file. | ||||
| 
 | ||||
| @item M-x guix-find-location | ||||
| Open the given package definition source file (press @key{TAB} to choose | ||||
| a location from a completion list). | ||||
| 
 | ||||
| @item M-x guix-edit | ||||
| Find location of a specified package.  This is an Emacs analog of | ||||
| @command{guix edit} command (@pxref{Invoking guix edit}).  As with | ||||
| @kbd{M-x guix-packages-by-name}, you can press @key{TAB} to complete a | ||||
| package name. | ||||
| 
 | ||||
| @end table | ||||
| 
 | ||||
| If you are contributing to Guix, you may find it useful for @kbd{M-x | ||||
| guix-find-location} and @kbd{M-x guix-edit} to open locations from your | ||||
| Git checkout.  This can be done by setting @code{guix-directory} | ||||
| variable.  For example, after this: | ||||
| 
 | ||||
| @example | ||||
| (setq guix-directory "~/src/guix") | ||||
| @end example | ||||
| 
 | ||||
| @kbd{M-x guix-edit guix} opens | ||||
| @file{~/src/guix/gnu/packages/package-management.scm} file. | ||||
| 
 | ||||
| Also you can use @kbd{C-u} prefix argument to specify a directory just | ||||
| for the current @kbd{M-x guix-find-location} or @kbd{M-x guix-edit} | ||||
| command. | ||||
| 
 | ||||
| 
 | ||||
| @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 shepherd-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 and the same key bindings as the major mode, but | ||||
| prefixed with @kbd{C-c}.  By default, this minor mode is enabled in | ||||
| shell buffers (@pxref{Interactive Shell,,, emacs, The GNU Emacs | ||||
| Manual}).  If you don't like it, set | ||||
| @code{guix-build-log-minor-mode-activate} to nil. | ||||
| 
 | ||||
| 
 | ||||
| @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. | ||||
| 
 | ||||
| 
 | ||||
| @node Emacs Hydra | ||||
| @section Hydra | ||||
| 
 | ||||
| The continuous integration server at @code{hydra.gnu.org} builds all | ||||
| the distribution packages on the supported architectures and serves | ||||
| them as substitutes (@pxref{Substitutes}).  Continuous integration is | ||||
| currently orchestrated by @uref{https://nixos.org/hydra/, Hydra}. | ||||
| 
 | ||||
| This section describes an Emacs interface to query Hydra to know the | ||||
| build status of specific packages, discover recent and ongoing builds, | ||||
| view build logs, and so on.  This interface is mostly the same as the | ||||
| ``list''/``info'' interface for displaying packages and generations | ||||
| (@pxref{Emacs Package Management}). | ||||
| 
 | ||||
| The following commands are available: | ||||
| 
 | ||||
| @table @kbd | ||||
| 
 | ||||
| @item M-x guix-hydra-latest-builds | ||||
| Display latest failed or successful builds (you will be prompted for a | ||||
| number of builds).  With @kbd{C-u}, you will also be prompted for other | ||||
| parameters (project, jobset, job and system). | ||||
| 
 | ||||
| @item M-x guix-hydra-queued-builds | ||||
| Display scheduled or currently running builds (you will be prompted for | ||||
| a number of builds). | ||||
| 
 | ||||
| @item M-x guix-hydra-jobsets | ||||
| Display available jobsets (you will be prompted for a project). | ||||
| 
 | ||||
| @end table | ||||
| 
 | ||||
| In a list of builds you can press @kbd{L} key to display a build log of | ||||
| the current build.  Also both a list of builds and a list of jobsets | ||||
| provide @kbd{B} key to display latest builds of the current job or | ||||
| jobset (don't forget about @kbd{C-u}). | ||||
							
								
								
									
										797
									
								
								doc/guix.texi
									
										
									
									
									
								
							
							
						
						
									
										797
									
								
								doc/guix.texi
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -219,6 +219,8 @@ emacs		node	${EMACS}/html_node/emacs/ | |||
| easejs		mono	${GS}/easejs/manual/easejs.html | ||||
| easejs		node	${GS}/easejs/manual/ | ||||
| 
 | ||||
| emacs-guix	mono	https://notabug.org/alezost/emacs-guix | ||||
| 
 | ||||
| emacs-muse	node	${GS}/emacs-muse/manual/muse.html | ||||
| emacs-muse	node	${GS}/emacs-muse/manual/html_node/ | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,105 +1,111 @@ | |||
| digraph "Guix bag" { | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" [label = "glibc-intermediate-2.22", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" [label = "texinfo-6.0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red]; | ||||
|   "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [label = "make-boot0-4.1", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [label = "binutils-bootstrap-0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [label = "bootstrap-binaries-0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [label = "diffutils-boot0-3.3", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [label = "findutils-boot0-4.6.0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [label = "file-boot0-5.25", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [label = "perl-boot0-5.22.0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" [label = "gcc-cross-boot0-4.9.3", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [label = "binutils-cross-boot0-2.25.1", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" [label = "linux-libre-headers-3.14.37", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red]; | ||||
|   "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" [label = "glibc-intermediate-2.24", shape = box, fontname = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0", shape = box, fontname = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [label = "bootstrap-binaries-0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [label = "diffutils-boot0-3.5", shape = box, fontname = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" [label = "linux-libre-headers-4.4.18", shape = box, fontname = Helvetica]; | ||||
|   "/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/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]; | ||||
|   "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" [label = "coreutils-8.25", shape = box, fontname = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [label = "gzip-1.8", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [label = "bzip2-1.0.6", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [label = "xz-5.2.2", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [label = "file-5.28", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [label = "diffutils-3.5", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [label = "patch-2.7.5", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [label = "sed-4.2.2", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [label = "findutils-4.6.0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [label = "gawk-4.1.4", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [label = "grep-2.25", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [label = "coreutils-8.25", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [label = "make-4.2.1", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [label = "bash-4.4.0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [label = "ld-wrapper-0", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [label = "binutils-2.27", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [label = "gcc-4.9.4", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [label = "glibc-2.24", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [label = "glibc-utf8-locales-2.24", shape = box, fontname = Helvetica]; | ||||
|   "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" [label = "acl-2.2.52", shape = box, fontname = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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 = Helvetica]; | ||||
|   "/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]; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -1,25 +1,25 @@ | |||
| digraph "Guix package" { | ||||
|   "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]; | ||||
|   "72851008" [label = "coreutils-8.25", shape = box, fontname = Helvetica]; | ||||
|   "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 = Helvetica]; | ||||
|   "74872512" [label = "acl-2.2.52", shape = box, fontname = Helvetica]; | ||||
|   "74872512" -> "74873280" [color = red]; | ||||
|   "74872512" -> "49728512" [color = red]; | ||||
|   "74872512" -> "74872704" [color = red]; | ||||
|   "74873280" [label = "gettext-minimal-0.19.8.1", shape = box, fontname = Helvetica]; | ||||
|   "74873280" -> "41550784" [color = cyan3]; | ||||
|   "41550784" [label = "expat-2.2.0", shape = box, fontname = Helvetica]; | ||||
|   "74872704" [label = "attr-2.4.47", shape = box, fontname = Helvetica]; | ||||
|   "74872704" -> "74873280" [color = cyan3]; | ||||
|   "74872704" -> "49728512" [color = cyan3]; | ||||
|   "53180864" [label = "gmp-6.1.1", shape = box, fontname = Helvetica]; | ||||
|   "53180864" -> "50262784" [color = darkgoldenrod]; | ||||
|   "50262784" [label = "m4-1.4.17", shape = box, fontname = Helvetica]; | ||||
|   "75199232" [label = "libcap-2.24", shape = box, fontname = Helvetica]; | ||||
|   "75199232" -> "49728512" [color = blue]; | ||||
|   "75199232" -> "74872704" [color = blue]; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -1,75 +1,71 @@ | |||
| digraph "Guix shepherd-service" { | ||||
|   "user-file-systems" [label = "user-file-systems", shape = box, fontname = Helvetica]; | ||||
|   "user-processes" -> "user-file-systems" [color = red]; | ||||
|   "user-processes" -> "user-file-systems" [color = cyan3]; | ||||
|   "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]; | ||||
|   "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 = red]; | ||||
|   "term-tty3" -> "user-processes" [color = red]; | ||||
|   "term-tty2" -> "user-processes" [color = red]; | ||||
|   "term-tty1" -> "user-processes" [color = red]; | ||||
|   "networking" -> "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 = Helvetica]; | ||||
|   "guix-daemon" [label = "guix-daemon", shape = box, fontname = Helvetica]; | ||||
|   "urandom-seed" [label = "urandom-seed", shape = box, fontname = Helvetica]; | ||||
|   "syslogd" [label = "syslogd", shape = box, fontname = Helvetica]; | ||||
|   "ssh-daemon" -> "syslogd" [color = red]; | ||||
|   "ssh-daemon" -> "syslogd" [color = darkgoldenrod]; | ||||
|   "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" -> "term-tty6" [color = darkgoldenrod]; | ||||
|   "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" -> "term-tty5" [color = dimgrey]; | ||||
|   "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" -> "term-tty4" [color = darkviolet]; | ||||
|   "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" -> "term-tty3" [color = peachpuff4]; | ||||
|   "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" -> "term-tty2" [color = darkseagreen]; | ||||
|   "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" -> "term-tty1" [color = cyan3]; | ||||
|   "console-font-tty1" [label = "console-font-tty1", shape = box, fontname = Helvetica]; | ||||
|   "networking" [label = "networking", shape = box, fontname = Helvetica]; | ||||
|   "ssh-daemon" -> "networking" [color = red]; | ||||
|   "ssh-daemon" -> "networking" [color = darkgoldenrod]; | ||||
|   "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" -> "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 = Helvetica]; | ||||
|   "user-processes" -> "file-system-/dev/pts" [color = red]; | ||||
|   "user-processes" -> "file-system-/dev/pts" [color = cyan3]; | ||||
|   "file-system-/dev/shm" [label = "file-system-/dev/shm", shape = box, fontname = Helvetica]; | ||||
|   "user-processes" -> "file-system-/dev/shm" [color = cyan3]; | ||||
|   "file-system-/gnu/store" [label = "file-system-/gnu/store", shape = box, fontname = Helvetica]; | ||||
|   "user-processes" -> "file-system-/gnu/store" [color = cyan3]; | ||||
|   "udev" [label = "udev", shape = box, fontname = Helvetica]; | ||||
|   "term-tty6" -> "udev" [color = red]; | ||||
|   "term-tty6" -> "udev" [color = magenta]; | ||||
|   "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]; | ||||
|   "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 = Helvetica]; | ||||
|   "term-tty6" -> "host-name" [color = red]; | ||||
|   "term-tty6" -> "host-name" [color = magenta]; | ||||
|   "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]; | ||||
|   "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 = Helvetica]; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| # GNU Guix --- Functional package management for GNU
 | ||||
| # Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 | ||||
| # Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 | ||||
| # Copyright © 2012, 2013, 2014, 2015, 2016, 2017 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 Mathieu Lirzin <mthl@gnu.org>
 | ||||
|  | @ -37,7 +37,6 @@ DOT_VECTOR_GRAPHICS =				\ | |||
| EXTRA_DIST +=					\
 | ||||
|   %D%/htmlxref.cnf				\
 | ||||
|   %D%/contributing.texi				\
 | ||||
|   %D%/emacs.texi				\
 | ||||
|   %D%/fdl-1.3.texi				\
 | ||||
|   $(DOT_FILES)					\
 | ||||
|   $(DOT_VECTOR_GRAPHICS)			\
 | ||||
|  |  | |||
|  | @ -1,37 +0,0 @@ | |||
| ;;; guix-about.el --- Various info about Guix | ||||
| 
 | ||||
| ;; Copyright © 2016 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 Location as published by | ||||
| ;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details. | ||||
| 
 | ||||
| ;; You should have received a copy of the GNU General Public Location | ||||
| ;; along with this program.  If not, see <http://www.gnu.org/locations/>. | ||||
| 
 | ||||
| ;;; Commentary: | ||||
| 
 | ||||
| ;; This file provides the code to display various info about Guix (e.g., its | ||||
| ;; version). | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'guix-config) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-version () | ||||
|   "Display Guix version in the echo area." | ||||
|   (interactive) | ||||
|   (message "%s %s" guix-config-name guix-config-version)) | ||||
| 
 | ||||
| (provide 'guix-about) | ||||
| 
 | ||||
| ;;; guix-about.el ends here | ||||
|  | @ -1,393 +0,0 @@ | |||
| ;;; guix-backend.el --- Making and using Guix REPL | ||||
| 
 | ||||
| ;; Copyright © 2014, 2015, 2016 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>). | ||||
| ;; | ||||
| ;; 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 | ||||
| ;; `geiser-connect-local' command with `guix-repl-current-socket' 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) | ||||
| (require 'guix-profiles) | ||||
| 
 | ||||
| (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 '(guix-set-directory) | ||||
|   "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-repl-socket-file-name-function | ||||
|   #'guix-repl-socket-file-name | ||||
|   "Function used to define a socket file name used by Guix REPL. | ||||
| The function is called without arguments." | ||||
|   :type '(choice (function-item guix-repl-socket-file-name) | ||||
|                  (function :tag "Other function")) | ||||
|   :group 'guix-repl) | ||||
| 
 | ||||
| (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-repl) | ||||
| 
 | ||||
| (defvar guix-repl-current-socket nil | ||||
|   "Name of a socket file used by the current 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-repl-autoload-emacs-packages-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-autoload-emacs-packages-maybe () | ||||
|   "Load autoloads for Emacs packages if needed. | ||||
| See `guix-emacs-activate-after-operation' for details." | ||||
|   (and guix-emacs-activate-after-operation | ||||
|        ;; FIXME Since a user can work with a non-current profile (using | ||||
|        ;; C-u before `guix-search-by-name' and other commands), emacs | ||||
|        ;; packages can be installed to another profile, and the | ||||
|        ;; following code will not work (i.e., the autoloads for this | ||||
|        ;; profile will not be loaded). | ||||
|        (guix-emacs-autoload-packages guix-current-profile))) | ||||
| 
 | ||||
| (defun guix-repl-operation-success-message () | ||||
|   "Message telling about successful Guix operation." | ||||
|   (message "Guix operation has been performed.")) | ||||
| 
 | ||||
| (defun guix-get-guile-program (&optional socket) | ||||
|   "Return a value suitable for `geiser-guile-binary'." | ||||
|   (if (null socket) | ||||
|       guix-guile-program | ||||
|     (append (if (listp guix-guile-program) | ||||
|                 guix-guile-program | ||||
|               (list guix-guile-program)) | ||||
|             (list (concat "--listen=" socket))))) | ||||
| 
 | ||||
| (defun guix-repl-socket-file-name () | ||||
|   "Return a name of a socket file used by Guix REPL." | ||||
|   (make-temp-name | ||||
|    (concat (file-name-as-directory temporary-file-directory) | ||||
|            "guix-repl-"))) | ||||
| 
 | ||||
| (defun guix-repl-delete-socket-maybe () | ||||
|   "Delete `guix-repl-current-socket' file if it exists." | ||||
|   (and guix-repl-current-socket | ||||
|        (file-exists-p guix-repl-current-socket) | ||||
|        (delete-file guix-repl-current-socket))) | ||||
| 
 | ||||
| (add-hook 'kill-emacs-hook 'guix-repl-delete-socket-maybe) | ||||
| 
 | ||||
| (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) | ||||
|       (unless internal | ||||
|         ;; Guile leaves socket file after exit, so remove it if it | ||||
|         ;; exists (after the REPL restart). | ||||
|         (guix-repl-delete-socket-maybe) | ||||
|         (setq guix-repl-current-socket | ||||
|               (and guix-use-guile-server | ||||
|                    (or guix-repl-current-socket | ||||
|                        (funcall guix-repl-socket-file-name-function))))) | ||||
|       (let ((geiser-guile-binary (guix-get-guile-program | ||||
|                                   (unless internal | ||||
|                                     guix-repl-current-socket))) | ||||
|             (geiser-guile-init-file (unless internal guix-helper-file)) | ||||
|             (repl (get-buffer-create | ||||
|                    (guix-get-repl-buffer-name internal)))) | ||||
|         (guix-start-repl repl (and internal guix-repl-current-socket)) | ||||
|         (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 (expand-file-name 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))) | ||||
| 
 | ||||
|  | ||||
| ;;; Guix directory | ||||
| 
 | ||||
| (defvar guix-directory nil | ||||
|   "Default directory with Guix source. | ||||
| If it is not set by a user, it is set after starting Guile REPL. | ||||
| This directory is used to define package locations.") | ||||
| 
 | ||||
| (defun guix-read-directory () | ||||
|   "Return `guix-directory' or prompt for it. | ||||
| This function is intended for using in `interactive' forms." | ||||
|   (if current-prefix-arg | ||||
|       (read-directory-name "Directory with Guix modules: " | ||||
|                            guix-directory) | ||||
|     guix-directory)) | ||||
| 
 | ||||
| (defun guix-set-directory () | ||||
|   "Set `guix-directory' if needed." | ||||
|   (or guix-directory | ||||
|       (setq guix-directory | ||||
|             (guix-eval-read "%guix-dir")))) | ||||
| 
 | ||||
|  | ||||
| ;;; 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 | ||||
|  | @ -1,377 +0,0 @@ | |||
| ;;; guix-base.el --- Common definitions   -*- lexical-binding: t -*- | ||||
| 
 | ||||
| ;; Copyright © 2014, 2015, 2016 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 some base and common definitions for guix.el | ||||
| ;; package. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-backend) | ||||
| (require 'guix-guile) | ||||
| (require 'guix-read) | ||||
| (require 'guix-utils) | ||||
| (require 'guix-ui) | ||||
| (require 'guix-profiles) | ||||
| 
 | ||||
| (defgroup guix nil | ||||
|   "Settings for Guix package manager and friends." | ||||
|   :prefix "guix-" | ||||
|   :group 'external) | ||||
| 
 | ||||
| (defgroup guix-faces nil | ||||
|   "Guix faces." | ||||
|   :group 'guix | ||||
|   :group 'faces) | ||||
| 
 | ||||
| (defun guix-package-name-specification (name version &optional output) | ||||
|   "Return Guix package specification by its NAME, VERSION and OUTPUT." | ||||
|   (concat name "@" version | ||||
|           (when output (concat ":" output)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Location of profiles and manifests | ||||
| 
 | ||||
| (defun guix-generation-file (profile generation) | ||||
|   "Return the file name of a PROFILE's GENERATION." | ||||
|   (format "%s-%s-link" profile generation)) | ||||
| 
 | ||||
| (defun guix-packages-profile (profile &optional generation system?) | ||||
|   "Return a directory where packages are installed for the | ||||
| PROFILE's GENERATION. | ||||
| 
 | ||||
| If SYSTEM? is non-nil, then PROFILE is considered to be a system | ||||
| profile.  Unlike usual profiles, for a system profile, packages | ||||
| are placed in 'profile' subdirectory." | ||||
|   (let ((profile (if generation | ||||
|                      (guix-generation-file profile generation) | ||||
|                    profile))) | ||||
|     (if system? | ||||
|         (expand-file-name "profile" profile) | ||||
|       profile))) | ||||
| 
 | ||||
| (defun guix-manifest-file (profile &optional generation system?) | ||||
|   "Return the file name of a PROFILE's manifest. | ||||
| See `guix-packages-profile'." | ||||
|   (expand-file-name "manifest" | ||||
|                     (guix-packages-profile profile generation system?))) | ||||
| 
 | ||||
|  | ||||
| ;;; Actions on packages and generations | ||||
| 
 | ||||
| (defface guix-operation-option-key | ||||
|   '((t :inherit font-lock-warning-face)) | ||||
|   "Face used for the keys of operation options." | ||||
|   :group 'guix-faces) | ||||
| 
 | ||||
| (defcustom guix-operation-confirm t | ||||
|   "If nil, do not prompt to confirm an operation." | ||||
|   :type 'boolean | ||||
|   :group 'guix) | ||||
| 
 | ||||
| (defcustom guix-use-substitutes t | ||||
|   "If non-nil, use substitutes for the Guix packages." | ||||
|   :type 'boolean | ||||
|   :group 'guix) | ||||
| 
 | ||||
| (defvar guix-dry-run nil | ||||
|   "If non-nil, do not perform the real actions, just simulate.") | ||||
| 
 | ||||
| (defvar guix-temp-buffer-name " *Guix temp*" | ||||
|   "Name of a buffer used for displaying info before executing operation.") | ||||
| 
 | ||||
| (defvar guix-operation-option-true-string "yes" | ||||
|   "String displayed in the mode-line when operation option is t.") | ||||
| 
 | ||||
| (defvar guix-operation-option-false-string "no " | ||||
|   "String displayed in the mode-line when operation option is nil.") | ||||
| 
 | ||||
| (defvar guix-operation-option-separator "  |  " | ||||
|   "String used in the mode-line to separate operation options.") | ||||
| 
 | ||||
| (defvar guix-operation-options | ||||
|   '((?s "substitutes" guix-use-substitutes) | ||||
|     (?d "dry-run"     guix-dry-run)) | ||||
|   "List of available operation options. | ||||
| Each element of the list has a form: | ||||
| 
 | ||||
|   (KEY NAME VARIABLE) | ||||
| 
 | ||||
| KEY is a character that may be pressed during confirmation to | ||||
| toggle the option. | ||||
| NAME is a string displayed in the mode-line. | ||||
| VARIABLE is a name of an option variable.") | ||||
| 
 | ||||
| (defun guix-operation-option-by-key (key) | ||||
|   "Return operation option by KEY (character)." | ||||
|   (assq key guix-operation-options)) | ||||
| 
 | ||||
| (defun guix-operation-option-key (option) | ||||
|   "Return key (character) of the operation OPTION." | ||||
|   (car option)) | ||||
| 
 | ||||
| (defun guix-operation-option-name (option) | ||||
|   "Return name of the operation OPTION." | ||||
|   (nth 1 option)) | ||||
| 
 | ||||
| (defun guix-operation-option-variable (option) | ||||
|   "Return name of the variable of the operation OPTION." | ||||
|   (nth 2 option)) | ||||
| 
 | ||||
| (defun guix-operation-option-value (option) | ||||
|   "Return boolean value of the operation OPTION." | ||||
|   (symbol-value (guix-operation-option-variable option))) | ||||
| 
 | ||||
| (defun guix-operation-option-string-value (option) | ||||
|   "Convert boolean value of the operation OPTION to string and return it." | ||||
|   (if (guix-operation-option-value option) | ||||
|       guix-operation-option-true-string | ||||
|     guix-operation-option-false-string)) | ||||
| 
 | ||||
| (defun guix-operation-prompt (&optional prompt) | ||||
|   "Prompt a user for continuing the current operation. | ||||
| Return non-nil, if the operation should be continued; nil otherwise. | ||||
| Ask a user with PROMPT for continuing an operation." | ||||
|   (let* ((option-keys (mapcar #'guix-operation-option-key | ||||
|                               guix-operation-options)) | ||||
|          (keys (append '(?y ?n) option-keys)) | ||||
|          (prompt (concat (propertize (or prompt "Continue operation?") | ||||
|                                      'face 'minibuffer-prompt) | ||||
|                          " (" | ||||
|                          (mapconcat | ||||
|                           (lambda (key) | ||||
|                             (propertize (string key) | ||||
|                                         'face 'guix-operation-option-key)) | ||||
|                           keys | ||||
|                           ", ") | ||||
|                          ") "))) | ||||
|     (let ((mode-line mode-line-format)) | ||||
|       (prog1 (guix-operation-prompt-1 prompt keys) | ||||
|         (setq mode-line-format mode-line) | ||||
|         ;; Clear the minibuffer after prompting. | ||||
|         (message ""))))) | ||||
| 
 | ||||
| (defun guix-operation-prompt-1 (prompt keys) | ||||
|   "This function is internal for `guix-operation-prompt'." | ||||
|   (guix-operation-set-mode-line) | ||||
|   (let ((key (read-char-choice prompt (cons ?\C-g keys) t))) | ||||
|     (cl-case key | ||||
|       (?y t) | ||||
|       ((?n ?\C-g) nil) | ||||
|       (t (let* ((option (guix-operation-option-by-key key)) | ||||
|                 (var (guix-operation-option-variable option))) | ||||
|            (set var (not (symbol-value var))) | ||||
|            (guix-operation-prompt-1 prompt keys)))))) | ||||
| 
 | ||||
| (defun guix-operation-set-mode-line () | ||||
|   "Display operation options in the mode-line of the current buffer." | ||||
|   (setq mode-line-format | ||||
|         (concat (propertize " Options:   " | ||||
|                             'face 'mode-line-buffer-id) | ||||
|                 (mapconcat | ||||
|                  (lambda (option) | ||||
|                    (let ((key  (guix-operation-option-key option)) | ||||
|                          (name (guix-operation-option-name option)) | ||||
|                          (val  (guix-operation-option-string-value option))) | ||||
|                      (concat name | ||||
|                              " (" | ||||
|                              (propertize (string key) | ||||
|                                          'face 'guix-operation-option-key) | ||||
|                              "): " val))) | ||||
|                  guix-operation-options | ||||
|                  guix-operation-option-separator))) | ||||
|   (force-mode-line-update)) | ||||
| 
 | ||||
| (defun guix-package-source-path (package-id) | ||||
|   "Return a store file path to a source of a package PACKAGE-ID." | ||||
|   (message "Calculating the source derivation ...") | ||||
|   (guix-eval-read | ||||
|    (guix-make-guile-expression | ||||
|     'package-source-path package-id))) | ||||
| 
 | ||||
| (defun guix-package-store-path (package-id) | ||||
|   "Return a list of store directories of outputs of package PACKAGE-ID." | ||||
|   (message "Calculating the package derivation ...") | ||||
|   (guix-eval-read | ||||
|    (guix-make-guile-expression | ||||
|     'package-store-path package-id))) | ||||
| 
 | ||||
| (defvar guix-after-source-download-hook nil | ||||
|   "Hook run after successful performing a 'source-download' operation.") | ||||
| 
 | ||||
| (defun guix-package-source-build-derivation (package-id &optional prompt) | ||||
|   "Build source derivation of a package PACKAGE-ID. | ||||
| Ask a user with PROMPT for continuing an operation." | ||||
|   (when (or (not guix-operation-confirm) | ||||
|             (guix-operation-prompt (or prompt | ||||
|                                        "Build the source derivation?"))) | ||||
|     (guix-eval-in-repl | ||||
|      (guix-make-guile-expression | ||||
|       'package-source-build-derivation | ||||
|       package-id | ||||
|       :use-substitutes? (or guix-use-substitutes 'f) | ||||
|       :dry-run? (or guix-dry-run 'f)) | ||||
|      nil 'source-download))) | ||||
| 
 | ||||
| (defun guix-build-package (package-id &optional prompt) | ||||
|   "Build package with PACKAGE-ID. | ||||
| Ask a user with PROMPT for continuing the build operation." | ||||
|   (when (or (not guix-operation-confirm) | ||||
|             (guix-operation-prompt (or prompt "Build package?"))) | ||||
|     (guix-eval-in-repl | ||||
|      (format (concat ",run-in-store " | ||||
|                      "(build-package (package-by-id %d)" | ||||
|                      " #:use-substitutes? %s" | ||||
|                      " #:dry-run? %s)") | ||||
|              package-id | ||||
|              (guix-guile-boolean guix-use-substitutes) | ||||
|              (guix-guile-boolean guix-dry-run))))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-apply-manifest (profile file &optional operation-buffer) | ||||
|   "Apply manifest from FILE to PROFILE. | ||||
| This function has the same meaning as 'guix package --manifest' command. | ||||
| See Info node `(guix) Invoking guix package' for details. | ||||
| 
 | ||||
| Interactively, use the current profile and prompt for manifest | ||||
| FILE.  With a prefix argument, also prompt for PROFILE." | ||||
|   (interactive | ||||
|    (let* ((current-profile (guix-ui-current-profile)) | ||||
|           (profile (if current-prefix-arg | ||||
|                        (guix-profile-prompt) | ||||
|                      (or current-profile guix-current-profile))) | ||||
|           (file (read-file-name "File with manifest: ")) | ||||
|           (buffer (and current-profile (current-buffer)))) | ||||
|      (list profile file buffer))) | ||||
|   (when (or (not guix-operation-confirm) | ||||
|             (y-or-n-p (format "Apply manifest from '%s' to profile '%s'? " | ||||
|                               file profile))) | ||||
|     (guix-eval-in-repl | ||||
|      (guix-make-guile-expression | ||||
|       'guix-command | ||||
|       "package" | ||||
|       (concat "--profile="  (expand-file-name profile)) | ||||
|       (concat "--manifest=" (expand-file-name file))) | ||||
|      operation-buffer))) | ||||
| 
 | ||||
|  | ||||
| ;;; Executing guix commands | ||||
| 
 | ||||
| (defcustom guix-run-in-shell-function #'guix-run-in-shell | ||||
|   "Function used to run guix command. | ||||
| The function is called with a single argument - a command line string." | ||||
|   :type '(choice (function-item guix-run-in-shell) | ||||
|                  (function-item guix-run-in-eshell) | ||||
|                  (function :tag "Other function")) | ||||
|   :group 'guix) | ||||
| 
 | ||||
| (defcustom guix-shell-buffer-name "*shell*" | ||||
|   "Default name of a shell buffer used for running guix commands." | ||||
|   :type 'string | ||||
|   :group 'guix) | ||||
| 
 | ||||
| (declare-function comint-send-input "comint" t) | ||||
| 
 | ||||
| (defun guix-run-in-shell (string) | ||||
|   "Run command line STRING in `guix-shell-buffer-name' buffer." | ||||
|   (shell guix-shell-buffer-name) | ||||
|   (goto-char (point-max)) | ||||
|   (insert string) | ||||
|   (comint-send-input)) | ||||
| 
 | ||||
| (declare-function eshell-send-input "esh-mode" t) | ||||
| 
 | ||||
| (defun guix-run-in-eshell (string) | ||||
|   "Run command line STRING in eshell buffer." | ||||
|   (eshell) | ||||
|   (goto-char (point-max)) | ||||
|   (insert string) | ||||
|   (eshell-send-input)) | ||||
| 
 | ||||
| (defun guix-run-command-in-shell (args) | ||||
|   "Execute 'guix ARGS ...' command in a shell buffer." | ||||
|   (funcall guix-run-in-shell-function | ||||
|            (guix-command-string args))) | ||||
| 
 | ||||
| (defun guix-run-command-in-repl (args) | ||||
|   "Execute 'guix ARGS ...' command in Guix REPL." | ||||
|   (guix-eval-in-repl | ||||
|    (apply #'guix-make-guile-expression | ||||
|           'guix-command args))) | ||||
| 
 | ||||
| (defun guix-command-output (args) | ||||
|   "Return string with 'guix ARGS ...' output." | ||||
|   (cl-multiple-value-bind (output error) | ||||
|       (guix-eval (apply #'guix-make-guile-expression | ||||
|                         'guix-command-output args)) | ||||
|     ;; Remove trailing new space from the error string. | ||||
|     (message (replace-regexp-in-string "\n\\'" "" (read error))) | ||||
|     (read output))) | ||||
| 
 | ||||
| (defun guix-help-string (&optional commands) | ||||
|   "Return string with 'guix COMMANDS ... --help' output." | ||||
|   (guix-eval-read | ||||
|    (apply #'guix-make-guile-expression | ||||
|           'help-string commands))) | ||||
| 
 | ||||
|  | ||||
| ;;; Pull | ||||
| 
 | ||||
| (defcustom guix-update-after-pull t | ||||
|   "If non-nil, update Guix buffers after performing \\[guix-pull]." | ||||
|   :type 'boolean | ||||
|   :group 'guix) | ||||
| 
 | ||||
| (defvar guix-after-pull-hook | ||||
|   '(guix-restart-repl-after-pull guix-update-buffers-maybe-after-pull) | ||||
|   "Hook run after successful performing `guix-pull' operation.") | ||||
| 
 | ||||
| (defun guix-restart-repl-after-pull () | ||||
|   "Restart Guix REPL after `guix-pull' operation." | ||||
|   (guix-repl-exit) | ||||
|   (guix-start-process-maybe | ||||
|    "Restarting Guix REPL after pull operation ...")) | ||||
| 
 | ||||
| (defun guix-update-buffers-maybe-after-pull () | ||||
|   "Update buffers depending on `guix-update-after-pull'." | ||||
|   (when guix-update-after-pull | ||||
|     (mapc #'guix-ui-update-buffer | ||||
|           ;; No need to update "generation" buffers. | ||||
|           (guix-ui-buffers '(guix-package-list-mode | ||||
|                              guix-package-info-mode | ||||
|                              guix-output-list-mode | ||||
|                              guix-output-info-mode))) | ||||
|     (message "Guix buffers have been updated."))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-pull (&optional verbose) | ||||
|   "Run Guix pull operation. | ||||
| If VERBOSE is non-nil (with prefix argument), produce verbose output." | ||||
|   (interactive "P") | ||||
|   (let ((args (and verbose '("--verbose")))) | ||||
|     (guix-eval-in-repl | ||||
|      (apply #'guix-make-guile-expression | ||||
|             'guix-command "pull" args) | ||||
|      nil 'pull))) | ||||
| 
 | ||||
| (provide 'guix-base) | ||||
| 
 | ||||
| ;;; guix-base.el ends here | ||||
|  | @ -1,624 +0,0 @@ | |||
| ;;; guix-buffer.el --- Buffer interface for displaying data  -*- 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 general 'buffer' interface for displaying an | ||||
| ;; arbitrary data. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-history) | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (defvar guix-buffer-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (define-key map (kbd "l") 'guix-history-back) | ||||
|     (define-key map (kbd "r") 'guix-history-forward) | ||||
|     (define-key map (kbd "g") 'revert-buffer) | ||||
|     (define-key map (kbd "R") 'guix-buffer-redisplay) | ||||
|     map) | ||||
|   "Parent keymap for Guix buffer modes.") | ||||
| 
 | ||||
|  | ||||
| ;;; Buffer item | ||||
| 
 | ||||
| (cl-defstruct (guix-buffer-item | ||||
|                (:constructor nil) | ||||
|                (:constructor guix-buffer-make-item | ||||
|                              (entries buffer-type entry-type args)) | ||||
|                (:copier      nil)) | ||||
|   entries buffer-type entry-type args) | ||||
| 
 | ||||
| (defvar-local guix-buffer-item nil | ||||
|   "Data (structure) for the current Guix buffer. | ||||
| The structure consists of the following elements: | ||||
| 
 | ||||
| - `entries': list of the currently displayed entries. | ||||
| 
 | ||||
|   Each element of the list is an alist with an entry data of the | ||||
|   following form: | ||||
| 
 | ||||
|     ((PARAM . VAL) ...) | ||||
| 
 | ||||
|   PARAM is a name of the entry parameter. | ||||
|   VAL is a value of this parameter. | ||||
| 
 | ||||
| - `entry-type': type of the currently displayed entries. | ||||
| 
 | ||||
| - `buffer-type': type of the current buffer. | ||||
| 
 | ||||
| - `args': search arguments used to get the current entries.") | ||||
| (put 'guix-buffer-item 'permanent-local t) | ||||
| 
 | ||||
| (defmacro guix-buffer-with-item (item &rest body) | ||||
|   "Evaluate BODY using buffer ITEM. | ||||
| The following local variables are available inside BODY: | ||||
| `%entries', `%buffer-type', `%entry-type', `%args'. | ||||
| See `guix-buffer-item' for details." | ||||
|   (declare (indent 1) (debug t)) | ||||
|   (let ((item-var (make-symbol "item"))) | ||||
|     `(let ((,item-var ,item)) | ||||
|        (let ((%entries     (guix-buffer-item-entries     ,item-var)) | ||||
|              (%buffer-type (guix-buffer-item-buffer-type ,item-var)) | ||||
|              (%entry-type  (guix-buffer-item-entry-type  ,item-var)) | ||||
|              (%args        (guix-buffer-item-args        ,item-var))) | ||||
|          ,@body)))) | ||||
| 
 | ||||
| (defmacro guix-buffer-with-current-item (&rest body) | ||||
|   "Evaluate BODY using `guix-buffer-item'. | ||||
| See `guix-buffer-with-item' for details." | ||||
|   (declare (indent 0) (debug t)) | ||||
|   `(guix-buffer-with-item guix-buffer-item | ||||
|      ,@body)) | ||||
| 
 | ||||
| (defmacro guix-buffer-define-current-item-accessor (name) | ||||
|   "Define `guix-buffer-current-NAME' function to access NAME | ||||
| element of `guix-buffer-item' structure. | ||||
| NAME should be a symbol." | ||||
|   (let* ((name-str (symbol-name name)) | ||||
|          (accessor (intern (concat "guix-buffer-item-" name-str))) | ||||
|          (fun-name (intern (concat "guix-buffer-current-" name-str))) | ||||
|          (doc      (format "\ | ||||
| Return '%s' of the current Guix buffer. | ||||
| See `guix-buffer-item' for details." | ||||
|                            name-str))) | ||||
|     `(defun ,fun-name () | ||||
|        ,doc | ||||
|        (and guix-buffer-item | ||||
|             (,accessor guix-buffer-item))))) | ||||
| 
 | ||||
| (defmacro guix-buffer-define-current-item-accessors (&rest names) | ||||
|   "Define `guix-buffer-current-NAME' functions for NAMES. | ||||
| See `guix-buffer-define-current-item-accessor' for details." | ||||
|   `(progn | ||||
|      ,@(mapcar (lambda (name) | ||||
|                  `(guix-buffer-define-current-item-accessor ,name)) | ||||
|                names))) | ||||
| 
 | ||||
| (guix-buffer-define-current-item-accessors | ||||
|  entries entry-type buffer-type args) | ||||
| 
 | ||||
| (defmacro guix-buffer-define-current-args-accessor (n prefix name) | ||||
|   "Define `PREFIX-NAME' function to access Nth element of 'args' | ||||
| field of `guix-buffer-item' structure. | ||||
| PREFIX and NAME should be strings." | ||||
|   (let ((fun-name (intern (concat prefix "-" name))) | ||||
|         (doc      (format "\ | ||||
| Return '%s' of the current Guix buffer. | ||||
| '%s' is the element number %d in 'args' of `guix-buffer-item'." | ||||
|                           name name n))) | ||||
|     `(defun ,fun-name () | ||||
|        ,doc | ||||
|        (nth ,n (guix-buffer-current-args))))) | ||||
| 
 | ||||
| (defmacro guix-buffer-define-current-args-accessors (prefix &rest names) | ||||
|   "Define `PREFIX-NAME' functions for NAMES. | ||||
| See `guix-buffer-define-current-args-accessor' for details." | ||||
|   `(progn | ||||
|      ,@(cl-loop for name in names | ||||
|                 for i from 0 | ||||
|                 collect `(guix-buffer-define-current-args-accessor | ||||
|                           ,i ,prefix ,name)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Wrappers for defined variables | ||||
| 
 | ||||
| (defvar guix-buffer-data nil | ||||
|   "Alist with 'buffer' data. | ||||
| This alist is filled by `guix-buffer-define-interface' macro.") | ||||
| 
 | ||||
| (defun guix-buffer-value (buffer-type entry-type symbol) | ||||
|   "Return SYMBOL's value for BUFFER-TYPE/ENTRY-TYPE from `guix-buffer-data'." | ||||
|   (symbol-value | ||||
|    (guix-assq-value guix-buffer-data buffer-type entry-type symbol))) | ||||
| 
 | ||||
| (defun guix-buffer-get-entries (buffer-type entry-type args) | ||||
|   "Return ENTRY-TYPE entries. | ||||
| Call an appropriate 'get-entries' function from `guix-buffer' | ||||
| using ARGS as its arguments." | ||||
|   (apply (guix-buffer-value buffer-type entry-type 'get-entries) | ||||
|          args)) | ||||
| 
 | ||||
| (defun guix-buffer-mode-enable (buffer-type entry-type) | ||||
|   "Turn on major mode to display ENTRY-TYPE ENTRIES in BUFFER-TYPE buffer." | ||||
|   (funcall (guix-buffer-value buffer-type entry-type 'mode))) | ||||
| 
 | ||||
| (defun guix-buffer-mode-initialize (buffer-type entry-type) | ||||
|   "Set up the current BUFFER-TYPE buffer to display ENTRY-TYPE entries." | ||||
|   (let ((fun (guix-buffer-value buffer-type entry-type 'mode-init))) | ||||
|     (when fun | ||||
|       (funcall fun)))) | ||||
| 
 | ||||
| (defun guix-buffer-insert-entries (entries buffer-type entry-type) | ||||
|   "Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer." | ||||
|   (funcall (guix-buffer-value buffer-type entry-type 'insert-entries) | ||||
|            entries)) | ||||
| 
 | ||||
| (defun guix-buffer-show-entries-default (entries buffer-type entry-type) | ||||
|   "Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer." | ||||
|   (let ((inhibit-read-only t)) | ||||
|     (erase-buffer) | ||||
|     (guix-buffer-mode-enable buffer-type entry-type) | ||||
|     (guix-buffer-insert-entries entries buffer-type entry-type) | ||||
|     (goto-char (point-min)))) | ||||
| 
 | ||||
| (defun guix-buffer-show-entries (entries buffer-type entry-type) | ||||
|   "Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer." | ||||
|   (funcall (guix-buffer-value buffer-type entry-type 'show-entries) | ||||
|            entries)) | ||||
| 
 | ||||
| (defun guix-buffer-message (entries buffer-type entry-type args) | ||||
|   "Display a message for BUFFER-ITEM after showing entries." | ||||
|   (let ((fun (guix-buffer-value buffer-type entry-type 'message))) | ||||
|     (when fun | ||||
|       (apply fun entries args)))) | ||||
| 
 | ||||
| (defun guix-buffer-name (buffer-type entry-type args) | ||||
|   "Return name of BUFFER-TYPE buffer for displaying ENTRY-TYPE entries." | ||||
|   (let ((str-or-fun (guix-buffer-value buffer-type entry-type | ||||
|                                        'buffer-name))) | ||||
|     (if (stringp str-or-fun) | ||||
|         str-or-fun | ||||
|       (apply str-or-fun args)))) | ||||
| 
 | ||||
| (defun guix-buffer-param-title (buffer-type entry-type param) | ||||
|   "Return PARAM title for BUFFER-TYPE/ENTRY-TYPE." | ||||
|   (or (guix-assq-value (guix-buffer-value buffer-type entry-type 'titles) | ||||
|                        param) | ||||
|       ;; Fallback to a title defined in 'info' interface. | ||||
|       (unless (eq buffer-type 'info) | ||||
|         (guix-assq-value (guix-buffer-value 'info entry-type 'titles) | ||||
|                          param)) | ||||
|       (guix-symbol-title param))) | ||||
| 
 | ||||
| (defun guix-buffer-history-size (buffer-type entry-type) | ||||
|   "Return history size for BUFFER-TYPE/ENTRY-TYPE." | ||||
|   (guix-buffer-value buffer-type entry-type 'history-size)) | ||||
| 
 | ||||
| (defun guix-buffer-revert-confirm? (buffer-type entry-type) | ||||
|   "Return 'revert-confirm' value for BUFFER-TYPE/ENTRY-TYPE." | ||||
|   (guix-buffer-value buffer-type entry-type 'revert-confirm)) | ||||
| 
 | ||||
|  | ||||
| ;;; Displaying entries | ||||
| 
 | ||||
| (defun guix-buffer-display (buffer) | ||||
|   "Switch to a Guix BUFFER." | ||||
|   (pop-to-buffer buffer | ||||
|                  '((display-buffer-reuse-window | ||||
|                     display-buffer-same-window)))) | ||||
| 
 | ||||
| (defun guix-buffer-history-item (buffer-item) | ||||
|   "Make and return a history item for displaying BUFFER-ITEM." | ||||
|   (list #'guix-buffer-set buffer-item)) | ||||
| 
 | ||||
| (defun guix-buffer-set (buffer-item &optional history) | ||||
|   "Set up the current buffer for displaying BUFFER-ITEM. | ||||
| HISTORY should be one of the following: | ||||
| 
 | ||||
|   `nil' - do not save BUFFER-ITEM in history, | ||||
| 
 | ||||
|   `add' - add it to history, | ||||
| 
 | ||||
|   `replace' - replace the current history item." | ||||
|   (guix-buffer-with-item buffer-item | ||||
|     (when %entries | ||||
|       ;; Set buffer item before showing entries, so that its value can | ||||
|       ;; be used by the code for displaying entries. | ||||
|       (setq guix-buffer-item buffer-item) | ||||
|       (guix-buffer-show-entries %entries %buffer-type %entry-type) | ||||
|       (when history | ||||
|         (funcall (cl-ecase history | ||||
|                    (add     #'guix-history-add) | ||||
|                    (replace #'guix-history-replace)) | ||||
|                  (guix-buffer-history-item buffer-item)))) | ||||
|     (guix-buffer-message %entries %buffer-type %entry-type %args))) | ||||
| 
 | ||||
| (defun guix-buffer-display-entries-current | ||||
|     (entries buffer-type entry-type args &optional history) | ||||
|   "Show ENTRIES in the current Guix buffer. | ||||
| See `guix-buffer-item' for the meaning of BUFFER-TYPE, ENTRY-TYPE | ||||
| and ARGS, and `guix-buffer-set' for the meaning of HISTORY." | ||||
|   (let ((item (guix-buffer-make-item entries buffer-type | ||||
|                                      entry-type args))) | ||||
|     (guix-buffer-set item history))) | ||||
| 
 | ||||
| (defun guix-buffer-get-display-entries-current | ||||
|     (buffer-type entry-type args &optional history) | ||||
|   "Search for entries and show them in the current Guix buffer. | ||||
| See `guix-buffer-display-entries-current' for details." | ||||
|   (guix-buffer-display-entries-current | ||||
|    (guix-buffer-get-entries buffer-type entry-type args) | ||||
|    buffer-type entry-type args history)) | ||||
| 
 | ||||
| (defun guix-buffer-display-entries | ||||
|     (entries buffer-type entry-type args &optional history) | ||||
|   "Show ENTRIES in a BUFFER-TYPE buffer. | ||||
| See `guix-buffer-display-entries-current' for details." | ||||
|   (let ((buffer (get-buffer-create | ||||
|                  (guix-buffer-name buffer-type entry-type args)))) | ||||
|     (with-current-buffer buffer | ||||
|       (guix-buffer-display-entries-current | ||||
|        entries buffer-type entry-type args history)) | ||||
|     (when entries | ||||
|       (guix-buffer-display buffer)))) | ||||
| 
 | ||||
| (defun guix-buffer-get-display-entries | ||||
|     (buffer-type entry-type args &optional history) | ||||
|   "Search for entries and show them in a BUFFER-TYPE buffer. | ||||
| See `guix-buffer-display-entries-current' for details." | ||||
|   (guix-buffer-display-entries | ||||
|    (guix-buffer-get-entries buffer-type entry-type args) | ||||
|    buffer-type entry-type args history)) | ||||
| 
 | ||||
| (defun guix-buffer-revert (_ignore-auto noconfirm) | ||||
|   "Update the data in the current Guix buffer. | ||||
| This function is suitable for `revert-buffer-function'. | ||||
| See `revert-buffer' for the meaning of NOCONFIRM." | ||||
|   (guix-buffer-with-current-item | ||||
|     (when (or noconfirm | ||||
|               (not (guix-buffer-revert-confirm? %buffer-type %entry-type)) | ||||
|               (y-or-n-p "Update the current buffer? ")) | ||||
|       (guix-buffer-get-display-entries-current | ||||
|        %buffer-type %entry-type %args 'replace)))) | ||||
| 
 | ||||
| (defvar guix-buffer-after-redisplay-hook nil | ||||
|   "Hook run by `guix-buffer-redisplay'. | ||||
| This hook is called before seting up a window position.") | ||||
| 
 | ||||
| (defun guix-buffer-redisplay () | ||||
|   "Redisplay the current Guix buffer. | ||||
| Restore the point and window positions after redisplaying. | ||||
| 
 | ||||
| This function does not update the buffer data, use | ||||
| '\\[revert-buffer]' if you want the full update." | ||||
|   (interactive) | ||||
|   (let* ((old-point (point)) | ||||
|          ;; For simplicity, ignore an unlikely case when multiple | ||||
|          ;; windows display the same buffer. | ||||
|          (window (car (get-buffer-window-list (current-buffer) nil t))) | ||||
|          (window-start (and window (window-start window)))) | ||||
|     (guix-buffer-set guix-buffer-item) | ||||
|     (goto-char old-point) | ||||
|     (run-hooks 'guix-buffer-after-redisplay-hook) | ||||
|     (when window | ||||
|       (set-window-point window (point)) | ||||
|       (set-window-start window window-start)))) | ||||
| 
 | ||||
| (defun guix-buffer-redisplay-goto-button () | ||||
|   "Redisplay the current buffer and go to the next button, if needed." | ||||
|   (let ((guix-buffer-after-redisplay-hook | ||||
|          (cons (lambda () | ||||
|                  (unless (button-at (point)) | ||||
|                    (forward-button 1))) | ||||
|                guix-buffer-after-redisplay-hook))) | ||||
|     (guix-buffer-redisplay))) | ||||
| 
 | ||||
|  | ||||
| ;;; Interface definers | ||||
| 
 | ||||
| (defmacro guix-define-groups (type &rest args) | ||||
|   "Define `guix-TYPE' and `guix-TYPE-faces' custom groups. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:parent-group' - name of a parent custom group. | ||||
| 
 | ||||
|   - `:parent-faces-group' - name of a parent custom faces group. | ||||
| 
 | ||||
|   - `:group-doc' - docstring of a `guix-TYPE' group. | ||||
| 
 | ||||
|   - `:faces-group-doc' - docstring of a `guix-TYPE-faces' group." | ||||
|   (declare (indent 1)) | ||||
|   (let* ((type-str           (symbol-name type)) | ||||
|          (prefix             (concat "guix-" type-str)) | ||||
|          (group              (intern prefix)) | ||||
|          (faces-group        (intern (concat prefix "-faces")))) | ||||
|     (guix-keyword-args-let args | ||||
|         ((parent-group       :parent-group 'guix) | ||||
|          (parent-faces-group :parent-faces-group 'guix-faces) | ||||
|          (group-doc          :group-doc | ||||
|                              (format "Settings for '%s' buffers." | ||||
|                                      type-str)) | ||||
|          (faces-group-doc    :faces-group-doc | ||||
|                              (format "Faces for '%s' buffers." | ||||
|                                      type-str))) | ||||
|       `(progn | ||||
|          (defgroup ,group nil | ||||
|            ,group-doc | ||||
|            :group ',parent-group) | ||||
| 
 | ||||
|          (defgroup ,faces-group nil | ||||
|            ,faces-group-doc | ||||
|            :group ',group | ||||
|            :group ',parent-faces-group))))) | ||||
| 
 | ||||
| (defmacro guix-define-entry-type (entry-type &rest args) | ||||
|   "Define general code for ENTRY-TYPE. | ||||
| See `guix-define-groups'." | ||||
|   (declare (indent 1)) | ||||
|   `(guix-define-groups ,entry-type | ||||
|      ,@args)) | ||||
| 
 | ||||
| (defmacro guix-define-buffer-type (buffer-type &rest args) | ||||
|   "Define general code for BUFFER-TYPE. | ||||
| See `guix-define-groups'." | ||||
|   (declare (indent 1)) | ||||
|   `(guix-define-groups ,buffer-type | ||||
|      ,@args)) | ||||
| 
 | ||||
| (defmacro guix-buffer-define-interface (buffer-type entry-type &rest args) | ||||
|   "Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| In the following description TYPE means ENTRY-TYPE-BUFFER-TYPE. | ||||
| 
 | ||||
| Required keywords: | ||||
| 
 | ||||
|   - `:buffer-name' - default value of the generated | ||||
|     `guix-TYPE-buffer-name' variable. | ||||
| 
 | ||||
|   - `:get-entries-function' - default value of the generated | ||||
|     `guix-TYPE-get-function' variable. | ||||
| 
 | ||||
|   - `:show-entries-function' - default value of the generated | ||||
|     `guix-TYPE-show-function' variable. | ||||
| 
 | ||||
|   Alternatively, if `:show-entries-function' is not specified, a | ||||
|   default `guix-TYPE-show-entries' will be generated, and the | ||||
|   following keyword should be specified instead: | ||||
| 
 | ||||
|   - `:insert-entries-function' - default value of the generated | ||||
|     `guix-TYPE-insert-function' variable. | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:message-function' - default value of the generated | ||||
|     `guix-TYPE-message-function' variable. | ||||
| 
 | ||||
|   - `:titles' - default value of the generated | ||||
|     `guix-TYPE-titles' variable. | ||||
| 
 | ||||
|   - `:history-size' - default value of the generated | ||||
|     `guix-TYPE-history-size' variable. | ||||
| 
 | ||||
|   - `:revert-confirm?' - default value of the generated | ||||
|     `guix-TYPE-revert-confirm' variable. | ||||
| 
 | ||||
|   - `:mode-name' - name (a string appeared in the mode-line) of | ||||
|      the generated `guix-TYPE-mode'. | ||||
| 
 | ||||
|   - `:mode-init-function' - default value of the generated | ||||
|     `guix-TYPE-mode-initialize-function' variable. | ||||
| 
 | ||||
|   - `:reduced?' - if non-nil, generate only group, faces group | ||||
|     and titles variable (if specified); all keywords become | ||||
|     optional." | ||||
|   (declare (indent 2)) | ||||
|   (let* ((entry-type-str     (symbol-name entry-type)) | ||||
|          (buffer-type-str    (symbol-name buffer-type)) | ||||
|          (prefix             (concat "guix-" entry-type-str "-" | ||||
|                                      buffer-type-str)) | ||||
|          (group              (intern prefix)) | ||||
|          (faces-group        (intern (concat prefix "-faces"))) | ||||
|          (get-entries-var    (intern (concat prefix "-get-function"))) | ||||
|          (show-entries-var   (intern (concat prefix "-show-function"))) | ||||
|          (show-entries-fun   (intern (concat prefix "-show-entries"))) | ||||
|          (message-var        (intern (concat prefix "-message-function"))) | ||||
|          (buffer-name-var    (intern (concat prefix "-buffer-name"))) | ||||
|          (titles-var         (intern (concat prefix "-titles"))) | ||||
|          (history-size-var   (intern (concat prefix "-history-size"))) | ||||
|          (revert-confirm-var (intern (concat prefix "-revert-confirm")))) | ||||
|     (guix-keyword-args-let args | ||||
|         ((get-entries-val    :get-entries-function) | ||||
|          (show-entries-val   :show-entries-function) | ||||
|          (insert-entries-val :insert-entries-function) | ||||
|          (mode-name          :mode-name (capitalize prefix)) | ||||
|          (mode-init-val      :mode-init-function) | ||||
|          (message-val        :message-function) | ||||
|          (buffer-name-val    :buffer-name) | ||||
|          (titles-val         :titles) | ||||
|          (history-size-val   :history-size 20) | ||||
|          (revert-confirm-val :revert-confirm? t) | ||||
|          (reduced?           :reduced?)) | ||||
|       `(progn | ||||
|          (defgroup ,group nil | ||||
|            ,(format "Displaying '%s' entries in '%s' buffer." | ||||
|                     entry-type-str buffer-type-str) | ||||
|            :group ',(intern (concat "guix-" entry-type-str)) | ||||
|            :group ',(intern (concat "guix-" buffer-type-str))) | ||||
| 
 | ||||
|          (defgroup ,faces-group nil | ||||
|            ,(format "Faces for displaying '%s' entries in '%s' buffer." | ||||
|                     entry-type-str buffer-type-str) | ||||
|            :group ',group | ||||
|            :group ',(intern (concat "guix-" entry-type-str "-faces")) | ||||
|            :group ',(intern (concat "guix-" buffer-type-str "-faces"))) | ||||
| 
 | ||||
|          (defcustom ,titles-var ,titles-val | ||||
|            ,(format "Alist of titles of '%s' parameters." | ||||
|                     entry-type-str) | ||||
|            :type '(alist :key-type symbol :value-type string) | ||||
|            :group ',group) | ||||
| 
 | ||||
|          ,(unless reduced? | ||||
|             `(progn | ||||
|                (defvar ,get-entries-var ,get-entries-val | ||||
|                  ,(format "\ | ||||
| Function used to receive '%s' entries for '%s' buffer." | ||||
|                           entry-type-str buffer-type-str)) | ||||
| 
 | ||||
|                (defvar ,show-entries-var | ||||
|                  ,(or show-entries-val `',show-entries-fun) | ||||
|                  ,(format "\ | ||||
| Function used to show '%s' entries in '%s' buffer." | ||||
|                           entry-type-str buffer-type-str)) | ||||
| 
 | ||||
|                (defvar ,message-var ,message-val | ||||
|                  ,(format "\ | ||||
| Function used to display a message after showing '%s' entries. | ||||
| If nil, do not display messages." | ||||
|                           entry-type-str)) | ||||
| 
 | ||||
|                (defcustom ,buffer-name-var ,buffer-name-val | ||||
|                  ,(format "\ | ||||
| Default name of '%s' buffer for displaying '%s' entries. | ||||
| May be a string or a function returning a string.  The function | ||||
| is called with the same arguments as `%S'." | ||||
|                           buffer-type-str entry-type-str get-entries-var) | ||||
|                  :type '(choice string function) | ||||
|                  :group ',group) | ||||
| 
 | ||||
|                (defcustom ,history-size-var ,history-size-val | ||||
|                  ,(format "\ | ||||
| Maximum number of items saved in history of `%S' buffer. | ||||
| If 0, the history is disabled." | ||||
|                           buffer-name-var) | ||||
|                  :type 'integer | ||||
|                  :group ',group) | ||||
| 
 | ||||
|                (defcustom ,revert-confirm-var ,revert-confirm-val | ||||
|                  ,(format "\ | ||||
| If non-nil, ask to confirm for reverting `%S' buffer." | ||||
|                           buffer-name-var) | ||||
|                  :type 'boolean | ||||
|                  :group ',group) | ||||
| 
 | ||||
|                (guix-alist-put! | ||||
|                 '((get-entries    . ,get-entries-var) | ||||
|                   (show-entries   . ,show-entries-var) | ||||
|                   (message        . ,message-var) | ||||
|                   (buffer-name    . ,buffer-name-var) | ||||
|                   (history-size   . ,history-size-var) | ||||
|                   (revert-confirm . ,revert-confirm-var)) | ||||
|                 'guix-buffer-data ',buffer-type ',entry-type) | ||||
| 
 | ||||
|                ,(unless show-entries-val | ||||
|                   `(defun ,show-entries-fun (entries) | ||||
|                      ,(format "\ | ||||
| Show '%s' ENTRIES in the current '%s' buffer." | ||||
|                               entry-type-str buffer-type-str) | ||||
|                      (guix-buffer-show-entries-default | ||||
|                       entries ',buffer-type ',entry-type))) | ||||
| 
 | ||||
|                ,(when (or insert-entries-val | ||||
|                           (null show-entries-val)) | ||||
|                   (let ((insert-entries-var | ||||
|                          (intern (concat prefix "-insert-function")))) | ||||
|                     `(progn | ||||
|                        (defvar ,insert-entries-var ,insert-entries-val | ||||
|                          ,(format "\ | ||||
| Function used to print '%s' entries in '%s' buffer." | ||||
|                                   entry-type-str buffer-type-str)) | ||||
| 
 | ||||
|                        (guix-alist-put! | ||||
|                         ',insert-entries-var 'guix-buffer-data | ||||
|                         ',buffer-type ',entry-type | ||||
|                         'insert-entries)))) | ||||
| 
 | ||||
|                ,(when (or mode-name | ||||
|                           mode-init-val | ||||
|                           (null show-entries-val)) | ||||
|                   (let* ((mode-str      (concat prefix "-mode")) | ||||
|                          (mode-map-str  (concat mode-str "-map")) | ||||
|                          (mode          (intern mode-str)) | ||||
|                          (parent-mode   (intern | ||||
|                                          (concat "guix-" buffer-type-str | ||||
|                                                  "-mode"))) | ||||
|                          (mode-var      (intern | ||||
|                                          (concat mode-str "-function"))) | ||||
|                          (mode-init-var (intern | ||||
|                                          (concat mode-str | ||||
|                                                  "-initialize-function")))) | ||||
|                     `(progn | ||||
|                        (defvar ,mode-var ',mode | ||||
|                          ,(format "\ | ||||
| Major mode for displaying '%s' entries in '%s' buffer." | ||||
|                                   entry-type-str buffer-type-str)) | ||||
| 
 | ||||
|                        (defvar ,mode-init-var ,mode-init-val | ||||
|                          ,(format "\ | ||||
| Function used to set up '%s' buffer for displaying '%s' entries." | ||||
|                                   buffer-type-str entry-type-str)) | ||||
| 
 | ||||
|                        (define-derived-mode ,mode ,parent-mode ,mode-name | ||||
|                          ,(format "\ | ||||
| Major mode for displaying '%s' entries in '%s' buffer. | ||||
| 
 | ||||
| \\{%s}" | ||||
|                                   entry-type-str buffer-type-str mode-map-str) | ||||
|                          (setq-local revert-buffer-function | ||||
|                                      'guix-buffer-revert) | ||||
|                          (setq-local guix-history-size | ||||
|                                      (guix-buffer-history-size | ||||
|                                       ',buffer-type ',entry-type)) | ||||
|                          (guix-buffer-mode-initialize | ||||
|                           ',buffer-type ',entry-type)) | ||||
| 
 | ||||
|                        (guix-alist-put! | ||||
|                         ',mode-var 'guix-buffer-data | ||||
|                         ',buffer-type ',entry-type 'mode) | ||||
|                        (guix-alist-put! | ||||
|                         ',mode-init-var 'guix-buffer-data | ||||
|                         ',buffer-type ',entry-type | ||||
|                         'mode-init)))))) | ||||
| 
 | ||||
|          (guix-alist-put! | ||||
|           ',titles-var 'guix-buffer-data | ||||
|           ',buffer-type ',entry-type 'titles))))) | ||||
| 
 | ||||
|  | ||||
| (defvar guix-buffer-font-lock-keywords | ||||
|   (eval-when-compile | ||||
|     `((,(rx "(" (group (or "guix-buffer-with-item" | ||||
|                            "guix-buffer-with-current-item" | ||||
|                            "guix-buffer-define-interface" | ||||
|                            "guix-define-groups" | ||||
|                            "guix-define-entry-type" | ||||
|                            "guix-define-buffer-type")) | ||||
|             symbol-end) | ||||
|        . 1)))) | ||||
| 
 | ||||
| (font-lock-add-keywords 'emacs-lisp-mode guix-buffer-font-lock-keywords) | ||||
| 
 | ||||
| (provide 'guix-buffer) | ||||
| 
 | ||||
| ;;; guix-buffer.el ends here | ||||
|  | @ -1,381 +0,0 @@ | |||
| ;;; 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: | ||||
| 
 | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (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-minor-mode-activate t | ||||
|   "If non-nil, then `guix-build-log-minor-mode' is automatically | ||||
| activated in `shell-mode' buffers." | ||||
|   :type 'boolean | ||||
|   :group 'guix-build-log) | ||||
| 
 | ||||
| (defcustom guix-build-log-mode-hook '() | ||||
|   "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-common-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (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) | ||||
|   "Parent keymap for 'build-log' buffers. | ||||
| For `guix-build-log-mode' this map is used as is. | ||||
| For `guix-build-log-minor-mode' this map is prefixed with 'C-c'.") | ||||
| 
 | ||||
| (defvar guix-build-log-mode-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (set-keymap-parent | ||||
|      map (make-composed-keymap (list guix-build-log-common-map) | ||||
|                                special-mode-map)) | ||||
|     (define-key map (kbd "c") 'compilation-shell-minor-mode) | ||||
|     (define-key map (kbd "v") 'view-mode) | ||||
|     map) | ||||
|   "Keymap for `guix-build-log-mode' buffers.") | ||||
| 
 | ||||
| (defvar guix-build-log-minor-mode-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (define-key map (kbd "C-c") guix-build-log-common-map) | ||||
|     map) | ||||
|   "Keymap for `guix-build-log-minor-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) | ||||
| 
 | ||||
| \\{guix-build-log-minor-mode-map}" | ||||
|   :init-value nil | ||||
|   :lighter " Guix-Build-Log" | ||||
|   :keymap guix-build-log-minor-mode-map | ||||
|   :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))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-build-log-minor-mode-activate-maybe () | ||||
|   "Activate `guix-build-log-minor-mode' depending on | ||||
| `guix-build-log-minor-mode-activate' variable." | ||||
|   (when guix-build-log-minor-mode-activate | ||||
|     (guix-build-log-minor-mode))) | ||||
| 
 | ||||
| (defun guix-build-log-find-file (file-or-url) | ||||
|   "Open FILE-OR-URL in `guix-build-log-mode'." | ||||
|   (guix-find-file-or-url file-or-url) | ||||
|   (guix-build-log-mode)) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (add-hook 'shell-mode-hook 'guix-build-log-minor-mode-activate-maybe) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (add-to-list 'auto-mode-alist | ||||
|              ;; Regexp for log files (usually placed in /var/log/guix/...) | ||||
|              (cons (rx "/guix/drvs/" (= 2 alnum) "/" (= 30 alnum) | ||||
|                        "-" (+ (any alnum "-+.")) ".drv" string-end) | ||||
|                    'guix-build-log-mode)) | ||||
| 
 | ||||
| (provide 'guix-build-log) | ||||
| 
 | ||||
| ;;; guix-build-log.el ends here | ||||
|  | @ -1,830 +0,0 @@ | |||
| ;;; guix-command.el --- Popup interface for guix commands  -*- lexical-binding: t -*- | ||||
| 
 | ||||
| ;; Copyright © 2015, 2016 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-build-log) | ||||
| (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 | ||||
|   '(("container"   :char ?C) | ||||
|     ("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) | ||||
|     ("--rounds"          :char ?R :fun read-number) | ||||
|     ("--with-input"      :char ?W))) | ||||
| 
 | ||||
| (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) | ||||
|     ("--file"        :fun guix-read-file-name) | ||||
|     ("--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 | ||||
|   '(("--ad-hoc" | ||||
|      :name "--ad-hoc " :fun guix-read-package-names-string | ||||
|      :switch? nil :option? t) | ||||
|     ("--expose" :char ?E) | ||||
|     ("--share" :char ?S) | ||||
|     ("--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) | ||||
|     ("--profile"        :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) | ||||
|     ("--type"       :fun guix-read-refresh-updater-names-string) | ||||
|     ("--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" "challenge" "edit" | ||||
|                   "graph" "lint" "refresh")) | ||||
|         (argument :doc "Packages" :fun 'guix-read-package-names-string)) | ||||
|        ((equal commands '("container" "exec")) | ||||
|         (argument :doc "PID Command [Args...]")) | ||||
|        ((string= command "download") | ||||
|         (argument :doc "URL")) | ||||
|        ((string= command "environment") | ||||
|         (argument :doc "Command [Args...]" :fun 'read-shell-command)) | ||||
|        ((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")))))) | ||||
| 
 | ||||
| (defvar guix-command-additional-arguments | ||||
|   `((("environment") | ||||
|      ,(guix-command-make-argument | ||||
|        :name "++packages " :char ?p :option? t | ||||
|        :doc "build inputs of the specified packages" | ||||
|        :fun 'guix-read-package-names-string))) | ||||
|   "Alist of guix commands and additional arguments for them. | ||||
| These are 'fake' arguments that are not presented in 'guix' shell | ||||
| commands.") | ||||
| 
 | ||||
| (defun guix-command-additional-arguments (&optional commands) | ||||
|   "Return additional arguments for COMMANDS." | ||||
|   (let ((rest-arg (guix-command-rest-argument commands))) | ||||
|     (append (guix-assoc-value guix-command-additional-arguments | ||||
|                               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)) | ||||
| 
 | ||||
|  | ||||
| ;;; Post processing popup arguments | ||||
| 
 | ||||
| (defvar guix-command-post-processors | ||||
|   '(("environment" | ||||
|      guix-command-post-process-environment-packages | ||||
|      guix-command-post-process-environment-ad-hoc | ||||
|      guix-command-post-process-rest-multiple-leave) | ||||
|     ("hash" | ||||
|      guix-command-post-process-rest-single) | ||||
|     ("package" | ||||
|      guix-command-post-process-package-args) | ||||
|     ("system" | ||||
|      guix-command-post-process-rest-single)) | ||||
|   "Alist of guix commands and functions for post-processing | ||||
| a list of arguments returned from popup interface. | ||||
| Each function is called on the returned arguments in turn.") | ||||
| 
 | ||||
| (defvar guix-command-rest-arg-regexp | ||||
|   (rx string-start "-- " (group (+ any))) | ||||
|   "Regexp to match a string with the 'rest' arguments.") | ||||
| 
 | ||||
| (defun guix-command-replace-args (args predicate modifier) | ||||
|   "Replace arguments matching PREDICATE from ARGS. | ||||
| Call MODIFIER on each argument matching PREDICATE and append the | ||||
| returned list of strings to the end of ARGS.  Remove the original | ||||
| arguments." | ||||
|   (let* ((rest nil) | ||||
|          (args (mapcar (lambda (arg) | ||||
|                          (if (funcall predicate arg) | ||||
|                              (progn | ||||
|                                (push (funcall modifier arg) rest) | ||||
|                                nil) | ||||
|                            arg)) | ||||
|                        args))) | ||||
|     (if rest | ||||
|         (apply #'append (delq nil args) rest) | ||||
|       args))) | ||||
| 
 | ||||
| (cl-defun guix-command-post-process-matching-args (args regexp | ||||
|                                                    &key group split?) | ||||
|   "Modify arguments from ARGS matching REGEXP by moving them to | ||||
| the end of ARGS list.  If SPLIT? is non-nil, split matching | ||||
| arguments into multiple subarguments." | ||||
|   (guix-command-replace-args | ||||
|    args | ||||
|    (lambda (arg) | ||||
|      (string-match regexp arg)) | ||||
|    (lambda (arg) | ||||
|      (let ((val (match-string (or group 0) arg)) | ||||
|            (fun (if split? #'split-string #'list))) | ||||
|        (funcall fun val))))) | ||||
| 
 | ||||
| (defun guix-command-post-process-rest-single (args) | ||||
|   "Modify ARGS by moving '-- ARG' argument to the end of ARGS list." | ||||
|   (guix-command-post-process-matching-args | ||||
|    args guix-command-rest-arg-regexp | ||||
|    :group 1)) | ||||
| 
 | ||||
| (defun guix-command-post-process-rest-multiple (args) | ||||
|   "Modify ARGS by splitting '-- ARG ...' into multiple subarguments | ||||
| and moving them to the end of ARGS list. | ||||
| Remove '-- ' string." | ||||
|   (guix-command-post-process-matching-args | ||||
|    args guix-command-rest-arg-regexp | ||||
|    :group 1 | ||||
|    :split? t)) | ||||
| 
 | ||||
| (defun guix-command-post-process-rest-multiple-leave (args) | ||||
|   "Modify ARGS by splitting '-- ARG ...' into multiple subarguments | ||||
| and moving them to the end of ARGS list. | ||||
| Leave '--' string as a separate argument." | ||||
|   (guix-command-post-process-matching-args | ||||
|    args guix-command-rest-arg-regexp | ||||
|    :split? t)) | ||||
| 
 | ||||
| (defun guix-command-post-process-package-args (args) | ||||
|   "Adjust popup ARGS for 'guix package' command." | ||||
|   (guix-command-post-process-matching-args | ||||
|    args (rx string-start (or "--install " "--remove ") (+ any)) | ||||
|    :split? t)) | ||||
| 
 | ||||
| (defun guix-command-post-process-environment-packages (args) | ||||
|   "Adjust popup ARGS for specified packages of 'guix environment' | ||||
| command." | ||||
|   (guix-command-post-process-matching-args | ||||
|    args (rx string-start "++packages " (group (+ any))) | ||||
|    :group 1 | ||||
|    :split? t)) | ||||
| 
 | ||||
| (defun guix-command-post-process-environment-ad-hoc (args) | ||||
|   "Adjust popup ARGS for '--ad-hoc' argument of 'guix environment' | ||||
| command." | ||||
|   (guix-command-post-process-matching-args | ||||
|    args (rx string-start "--ad-hoc " (+ any)) | ||||
|    :split? t)) | ||||
| 
 | ||||
| (defun guix-command-post-process-args (commands args) | ||||
|   "Adjust popup ARGS for guix COMMANDS." | ||||
|   (let* ((command (car commands)) | ||||
|          (processors | ||||
|           (append (guix-assoc-value guix-command-post-processors commands) | ||||
|                   (guix-assoc-value guix-command-post-processors command)))) | ||||
|     (guix-modify args | ||||
|                  (or processors | ||||
|                      (list #'guix-command-post-process-rest-multiple))))) | ||||
| 
 | ||||
|  | ||||
| ;;; '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" "shepherd-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" "shepherd-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 | ||||
|                  (cl-list* (car args) "--log-file" (cdr args)))) | ||||
|          (output (guix-command-output args)) | ||||
|          (files  (split-string output "\n" t))) | ||||
|     (dolist (file files) | ||||
|       (guix-build-log-find-file file)))) | ||||
| 
 | ||||
| (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 | ||||
|                  (cl-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 | ||||
|                            ',commands 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 | ||||
|  | @ -1,44 +0,0 @@ | |||
| ;;; guix-config.el --- Compile-time configuration of Guix. | ||||
| 
 | ||||
| ;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org> | ||||
| ;; Copyright © 2015, 2016 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-name "@PACKAGE_NAME@" | ||||
|   "Guix full name.") | ||||
| 
 | ||||
| (defconst guix-config-version "@PACKAGE_VERSION@" | ||||
|   "Guix version.") | ||||
| 
 | ||||
| (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 `nix/local.mk'. | ||||
|   (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 | ||||
|  | @ -1,382 +0,0 @@ | |||
| ;;; 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*" | ||||
|     "modify-services" | ||||
|     "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-imported-modules" | ||||
|     "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) | ||||
|   (modify-services 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-imported-modules 1) | ||||
|   (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))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (add-hook 'scheme-mode-hook 'guix-devel-activate-mode-maybe) | ||||
| 
 | ||||
|  | ||||
| (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 | ||||
|  | @ -1,59 +0,0 @@ | |||
| ;;; guix-entry.el --- 'Entry' type  -*- 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 an API for 'entry' type which is just an alist of | ||||
| ;; KEY/VALUE pairs (KEY should be a symbol) with the required 'id' KEY. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (defalias 'guix-entry-value #'guix-assq-value) | ||||
| 
 | ||||
| (defun guix-entry-id (entry) | ||||
|   "Return ENTRY ID." | ||||
|   (guix-entry-value entry 'id)) | ||||
| 
 | ||||
| (defun guix-entry-by-id (id entries) | ||||
|   "Return an entry from ENTRIES by its ID." | ||||
|   (cl-find-if (lambda (entry) | ||||
|                 (equal (guix-entry-id entry) id)) | ||||
|               entries)) | ||||
| 
 | ||||
| (defun guix-entries-by-ids (ids entries) | ||||
|   "Return entries with IDS (a list of identifiers) from ENTRIES." | ||||
|   (cl-remove-if-not (lambda (entry) | ||||
|                       (member (guix-entry-id entry) ids)) | ||||
|                     entries)) | ||||
| 
 | ||||
| (defun guix-replace-entry (id new-entry entries) | ||||
|   "Replace an entry with ID from ENTRIES by NEW-ENTRY. | ||||
| Return a list of entries with the replaced entry." | ||||
|   (cl-substitute-if new-entry | ||||
|                     (lambda (entry) | ||||
|                       (equal id (guix-entry-id entry))) | ||||
|                     entries | ||||
|                     :count 1)) | ||||
| 
 | ||||
| (provide 'guix-entry) | ||||
| 
 | ||||
| ;;; guix-entry.el ends here | ||||
|  | @ -1,88 +0,0 @@ | |||
| ;;; 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 'cl-lib) | ||||
| (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"))) | ||||
|   (cl-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 | ||||
|  | @ -1,126 +0,0 @@ | |||
| ;;; 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." | ||||
|   ;; The goal is to convert a string with scheme expression into elisp | ||||
|   ;; expression. | ||||
|   (let ((result (car (guix-geiser-eval str repl)))) | ||||
|     (cond | ||||
|      ((or (string= result "#f") | ||||
|           (string= result "#<unspecified>")) | ||||
|       nil) | ||||
|      ((string= result "#t") | ||||
|       t) | ||||
|      (t | ||||
|       (read (replace-regexp-in-string | ||||
|              "[ (]\\(#f\\)" "nil" | ||||
|              (replace-regexp-in-string | ||||
|               "[ (]\\(#t\\)" "t" | ||||
|               result | ||||
|               nil nil 1) | ||||
|              nil nil 1)))))) | ||||
| 
 | ||||
| (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 | ||||
|  | @ -1,98 +0,0 @@ | |||
| ;;; 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)." | ||||
|   (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 | ||||
|  | @ -1,108 +0,0 @@ | |||
| ;;; 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 | ||||
|  | @ -1,65 +0,0 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2014 Alex Kost <alezost@gmail.com> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
| ;;; GNU Guix is free software; you can redistribute it and/or modify it | ||||
| ;;; under the terms of the GNU General Public License as published by | ||||
| ;;; the Free Software Foundation; either version 3 of the License, or (at | ||||
| ;;; your option) any later version. | ||||
| ;;; | ||||
| ;;; GNU Guix is distributed in the hope that it will be useful, but | ||||
| ;;; WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| ;;; GNU General Public License for more details. | ||||
| ;;; | ||||
| ;;; You should have received a copy of the GNU General Public License | ||||
| ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| ;;; Commentary: | ||||
| 
 | ||||
| ;; This is an auxiliary file for the Emacs UI.  It is used to add Guix | ||||
| ;; directories to path variables and to load the main code. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (use-modules (ice-9 regex) | ||||
|              (srfi srfi-26)) | ||||
| 
 | ||||
| (define %guix-dir) | ||||
| 
 | ||||
| ;; The code is taken from ‘guix’ executable script | ||||
| (define (set-paths!) | ||||
|   (define-syntax-rule (push! elt v) (set! v (cons elt v))) | ||||
| 
 | ||||
|   (define config-lookup | ||||
|     (let ((config '(("prefix"         . "@prefix@") | ||||
|                     ("guilemoduledir" . "@guilemoduledir@"))) | ||||
|           (var-ref-regexp (make-regexp "\\$\\{([a-z]+)\\}"))) | ||||
|       (define (expand-var-ref match) | ||||
|         (lookup (match:substring match 1))) | ||||
|       (define (expand str) | ||||
|         (regexp-substitute/global #f var-ref-regexp str | ||||
|                                   'pre expand-var-ref 'post)) | ||||
|       (define (lookup name) | ||||
|         (expand (assoc-ref config name))) | ||||
|       lookup)) | ||||
| 
 | ||||
|   (let ((module-dir (config-lookup "guilemoduledir")) | ||||
|         (updates-dir (and=> (or (getenv "XDG_CONFIG_HOME") | ||||
|                                 (and=> (getenv "HOME") | ||||
|                                        (cut string-append <> "/.config"))) | ||||
|                             (cut string-append <> "/guix/latest")))) | ||||
|     (push! module-dir %load-path) | ||||
|     (push! module-dir %load-compiled-path) | ||||
|     (if (and updates-dir (file-exists? updates-dir)) | ||||
|         (begin | ||||
|           (set! %guix-dir updates-dir) | ||||
|           (push! updates-dir %load-path) | ||||
|           (push! updates-dir %load-compiled-path)) | ||||
|         (set! %guix-dir module-dir)))) | ||||
| 
 | ||||
| (set-paths!) | ||||
| 
 | ||||
| (load-from-path "guix-main") | ||||
| 
 | ||||
|  | @ -1,92 +0,0 @@ | |||
| ;;; guix-history.el --- History of buffer information | ||||
| 
 | ||||
| ;; Copyright © 2014 Alex Kost <alezost@gmail.com> | ||||
| 
 | ||||
| ;; This file is part of GNU Guix. | ||||
| 
 | ||||
| ;; GNU Guix is free software; you can redistribute it and/or modify | ||||
| ;; it under the terms of the GNU General Public License as published by | ||||
| ;; the Free Software Foundation, either version 3 of the License, or | ||||
| ;; (at your option) any later version. | ||||
| 
 | ||||
| ;; GNU Guix is distributed in the hope that it will be useful, | ||||
| ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| ;; GNU General Public License for more details. | ||||
| 
 | ||||
| ;; You should have received a copy of the GNU General Public License | ||||
| ;; along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| ;;; Commentary: | ||||
| 
 | ||||
| ;; This file provides support for history of buffers similar to the | ||||
| ;; history of a `help-mode' buffer. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-macs) | ||||
| 
 | ||||
| (defvar-local guix-history-stack-item nil | ||||
|   "Current item of the history. | ||||
| A list of the form (FUNCTION [ARGS ...]). | ||||
| The item is used by calling (apply FUNCTION ARGS).") | ||||
| (put 'guix-history-stack-item 'permanent-local t) | ||||
| 
 | ||||
| (defvar-local guix-history-back-stack nil | ||||
|   "Stack (list) of visited items. | ||||
| Each element of the list has a form of `guix-history-stack-item'.") | ||||
| (put 'guix-history-back-stack 'permanent-local t) | ||||
| 
 | ||||
| (defvar-local guix-history-forward-stack nil | ||||
|   "Stack (list) of items visited with `guix-history-back'. | ||||
| Each element of the list has a form of `guix-history-stack-item'.") | ||||
| (put 'guix-history-forward-stack 'permanent-local t) | ||||
| 
 | ||||
| (defvar guix-history-size 0 | ||||
|   "Maximum number of items saved in history. | ||||
| If 0, the history is disabled.") | ||||
| 
 | ||||
| (defun guix-history-add (item) | ||||
|   "Add ITEM to history." | ||||
|   (and guix-history-stack-item | ||||
|        (push guix-history-stack-item guix-history-back-stack)) | ||||
|   (setq guix-history-forward-stack nil | ||||
|         guix-history-stack-item item) | ||||
|   (when (>= (length guix-history-back-stack) | ||||
|             guix-history-size) | ||||
|     (setq guix-history-back-stack | ||||
|           (cl-loop for elt in guix-history-back-stack | ||||
|                    for i from 1 to guix-history-size | ||||
|                    collect elt)))) | ||||
| 
 | ||||
| (defun guix-history-replace (item) | ||||
|   "Replace current item in history with ITEM." | ||||
|   (setq guix-history-stack-item item)) | ||||
| 
 | ||||
| (defun guix-history-goto (item) | ||||
|   "Go to the ITEM of history. | ||||
| ITEM should have the form of `guix-history-stack-item'." | ||||
|   (or (listp item) | ||||
|       (error "Wrong value of history element")) | ||||
|   (setq guix-history-stack-item item) | ||||
|   (apply (car item) (cdr item))) | ||||
| 
 | ||||
| (defun guix-history-back () | ||||
|   "Go back to the previous element of history in the current buffer." | ||||
|   (interactive) | ||||
|   (or guix-history-back-stack | ||||
|       (user-error "No previous element in history")) | ||||
|   (push guix-history-stack-item guix-history-forward-stack) | ||||
|   (guix-history-goto (pop guix-history-back-stack))) | ||||
| 
 | ||||
| (defun guix-history-forward () | ||||
|   "Go forward to the next element of history in the current buffer." | ||||
|   (interactive) | ||||
|   (or guix-history-forward-stack | ||||
|       (user-error "No next element in history")) | ||||
|   (push guix-history-stack-item guix-history-back-stack) | ||||
|   (guix-history-goto (pop guix-history-forward-stack))) | ||||
| 
 | ||||
| (provide 'guix-history) | ||||
| 
 | ||||
| ;;; guix-history.el ends here | ||||
|  | @ -1,362 +0,0 @@ | |||
| ;;; guix-hydra-build.el --- Interface for Hydra builds  -*- 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 an interface for displaying Hydra builds in | ||||
| ;; 'list' and 'info' buffers. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-list) | ||||
| (require 'guix-info) | ||||
| (require 'guix-hydra) | ||||
| (require 'guix-build-log) | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (guix-hydra-define-entry-type hydra-build | ||||
|   :search-types '((latest . guix-hydra-build-latest-api-url) | ||||
|                   (queue  . guix-hydra-build-queue-api-url)) | ||||
|   :filters '(guix-hydra-build-filter-status) | ||||
|   :filter-names '((nixname . name) | ||||
|                   (buildstatus . build-status) | ||||
|                   (timestamp . time)) | ||||
|   :filter-boolean-params '(finished busy)) | ||||
| 
 | ||||
| (defun guix-hydra-build-get-display (search-type &rest args) | ||||
|   "Search for Hydra builds and show results." | ||||
|   (apply #'guix-list-get-display-entries | ||||
|          'hydra-build search-type args)) | ||||
| 
 | ||||
| (cl-defun guix-hydra-build-latest-prompt-args (&key project jobset | ||||
|                                                     job system) | ||||
|   "Prompt for and return a list of 'latest builds' arguments." | ||||
|   (let* ((number      (read-number "Number of latest builds: ")) | ||||
|          (project     (if current-prefix-arg | ||||
|                           (guix-hydra-read-project nil project) | ||||
|                         project)) | ||||
|          (jobset      (if current-prefix-arg | ||||
|                           (guix-hydra-read-jobset nil jobset) | ||||
|                         jobset)) | ||||
|          (job-or-name (if current-prefix-arg | ||||
|                           (guix-hydra-read-job nil job) | ||||
|                         job)) | ||||
|          (job         (and job-or-name | ||||
|                            (string-match-p guix-hydra-job-regexp | ||||
|                                            job-or-name) | ||||
|                            job-or-name)) | ||||
|          (system      (if (and (not job) | ||||
|                                (or current-prefix-arg | ||||
|                                    (and job-or-name (not system)))) | ||||
|                           (if job-or-name | ||||
|                               (guix-while-null | ||||
|                                 (guix-hydra-read-system | ||||
|                                  (concat job-or-name ".") system)) | ||||
|                             (guix-hydra-read-system nil system)) | ||||
|                         system)) | ||||
|          (job         (or job | ||||
|                           (and job-or-name | ||||
|                                (concat job-or-name "." system))))) | ||||
|     (list number | ||||
|           :project project | ||||
|           :jobset  jobset | ||||
|           :job     job | ||||
|           :system  system))) | ||||
| 
 | ||||
| (defun guix-hydra-build-view-log (id) | ||||
|   "View build log of a hydra build ID." | ||||
|   (guix-build-log-find-file (guix-hydra-build-log-url id))) | ||||
| 
 | ||||
|  | ||||
| ;;; Defining URLs | ||||
| 
 | ||||
| (defun guix-hydra-build-url (id) | ||||
|   "Return Hydra URL of a build ID." | ||||
|   (guix-hydra-url "build/" (number-to-string id))) | ||||
| 
 | ||||
| (defun guix-hydra-build-log-url (id) | ||||
|   "Return Hydra URL of the log file of a build ID." | ||||
|   (concat (guix-hydra-build-url id) "/log/raw")) | ||||
| 
 | ||||
| (cl-defun guix-hydra-build-latest-api-url | ||||
|     (number &key project jobset job system) | ||||
|   "Return Hydra API URL to receive latest NUMBER of builds." | ||||
|   (guix-hydra-api-url "latestbuilds" | ||||
|     `(("nr" . ,number) | ||||
|       ("project" . ,project) | ||||
|       ("jobset" . ,jobset) | ||||
|       ("job" . ,job) | ||||
|       ("system" . ,system)))) | ||||
| 
 | ||||
| (defun guix-hydra-build-queue-api-url (number) | ||||
|   "Return Hydra API URL to receive the NUMBER of queued builds." | ||||
|   (guix-hydra-api-url "queue" | ||||
|     `(("nr" . ,number)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Filters for processing raw entries | ||||
| 
 | ||||
| (defun guix-hydra-build-filter-status (entry) | ||||
|   "Add 'status' parameter to 'hydra-build' ENTRY." | ||||
|   (let ((status (if (guix-entry-value entry 'finished) | ||||
|                     (guix-hydra-build-status-number->name | ||||
|                      (guix-entry-value entry 'build-status)) | ||||
|                   (if (guix-entry-value entry 'busy) | ||||
|                       'running | ||||
|                     'scheduled)))) | ||||
|     (cons `(status . ,status) | ||||
|           entry))) | ||||
| 
 | ||||
|  | ||||
| ;;; Build status | ||||
| 
 | ||||
| (defface guix-hydra-build-status-running | ||||
|   '((t :inherit bold)) | ||||
|   "Face used if hydra build is not finished." | ||||
|   :group 'guix-hydra-build-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-status-scheduled | ||||
|   '((t)) | ||||
|   "Face used if hydra build is scheduled." | ||||
|   :group 'guix-hydra-build-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-status-succeeded | ||||
|   '((t :inherit success)) | ||||
|   "Face used if hydra build succeeded." | ||||
|   :group 'guix-hydra-build-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-status-cancelled | ||||
|   '((t :inherit warning)) | ||||
|   "Face used if hydra build was cancelled." | ||||
|   :group 'guix-hydra-build-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-status-failed | ||||
|   '((t :inherit error)) | ||||
|   "Face used if hydra build failed." | ||||
|   :group 'guix-hydra-build-faces) | ||||
| 
 | ||||
| (defvar guix-hydra-build-status-alist | ||||
|   '((0 . succeeded) | ||||
|     (1 . failed-build) | ||||
|     (2 . failed-dependency) | ||||
|     (3 . failed-other) | ||||
|     (4 . cancelled)) | ||||
|   "Alist of hydra build status numbers and status names. | ||||
| Status numbers are returned by Hydra API, names (symbols) are | ||||
| used internally by the elisp code of this package.") | ||||
| 
 | ||||
| (defun guix-hydra-build-status-number->name (number) | ||||
|   "Convert build status number to a name. | ||||
| See `guix-hydra-build-status-alist'." | ||||
|   (guix-assq-value guix-hydra-build-status-alist number)) | ||||
| 
 | ||||
| (defun guix-hydra-build-status-string (status) | ||||
|   "Return a human readable string for build STATUS." | ||||
|   (cl-case status | ||||
|     (scheduled | ||||
|      (guix-get-string "Scheduled" 'guix-hydra-build-status-scheduled)) | ||||
|     (running | ||||
|      (guix-get-string "Running" 'guix-hydra-build-status-running)) | ||||
|     (succeeded | ||||
|      (guix-get-string "Succeeded" 'guix-hydra-build-status-succeeded)) | ||||
|     (cancelled | ||||
|      (guix-get-string "Cancelled" 'guix-hydra-build-status-cancelled)) | ||||
|     (failed-build | ||||
|      (guix-hydra-build-status-fail-string)) | ||||
|     (failed-dependency | ||||
|      (guix-hydra-build-status-fail-string "dependency")) | ||||
|     (failed-other | ||||
|      (guix-hydra-build-status-fail-string "other")))) | ||||
| 
 | ||||
| (defun guix-hydra-build-status-fail-string (&optional reason) | ||||
|   "Return a string for a failed build." | ||||
|   (let ((base (guix-get-string "Failed" 'guix-hydra-build-status-failed))) | ||||
|     (if reason | ||||
|         (concat base " (" reason ")") | ||||
|       base))) | ||||
| 
 | ||||
| (defun guix-hydra-build-finished? (entry) | ||||
|   "Return non-nil, if hydra build was finished." | ||||
|   (guix-entry-value entry 'finished)) | ||||
| 
 | ||||
| (defun guix-hydra-build-running? (entry) | ||||
|   "Return non-nil, if hydra build is running." | ||||
|   (eq (guix-entry-value entry 'status) | ||||
|       'running)) | ||||
| 
 | ||||
| (defun guix-hydra-build-scheduled? (entry) | ||||
|   "Return non-nil, if hydra build is scheduled." | ||||
|   (eq (guix-entry-value entry 'status) | ||||
|       'scheduled)) | ||||
| 
 | ||||
| (defun guix-hydra-build-succeeded? (entry) | ||||
|   "Return non-nil, if hydra build succeeded." | ||||
|   (eq (guix-entry-value entry 'status) | ||||
|       'succeeded)) | ||||
| 
 | ||||
| (defun guix-hydra-build-cancelled? (entry) | ||||
|   "Return non-nil, if hydra build was cancelled." | ||||
|   (eq (guix-entry-value entry 'status) | ||||
|       'cancelled)) | ||||
| 
 | ||||
| (defun guix-hydra-build-failed? (entry) | ||||
|   "Return non-nil, if hydra build failed." | ||||
|   (memq (guix-entry-value entry 'status) | ||||
|         '(failed-build failed-dependency failed-other))) | ||||
| 
 | ||||
|  | ||||
| ;;; Hydra build 'info' | ||||
| 
 | ||||
| (guix-hydra-info-define-interface hydra-build | ||||
|   :mode-name "Hydra-Build-Info" | ||||
|   :buffer-name "*Guix Hydra Build Info*" | ||||
|   :format '((name ignore (simple guix-info-heading)) | ||||
|             ignore | ||||
|             guix-hydra-build-info-insert-url | ||||
|             (time     format (time)) | ||||
|             (status   format guix-hydra-build-info-insert-status) | ||||
|             (project  format (format guix-hydra-build-project)) | ||||
|             (jobset   format (format guix-hydra-build-jobset)) | ||||
|             (job      format (format guix-hydra-build-job)) | ||||
|             (system   format (format guix-hydra-build-system)) | ||||
|             (priority format (format)))) | ||||
| 
 | ||||
| (defface guix-hydra-build-info-project | ||||
|   '((t :inherit link)) | ||||
|   "Face for project names." | ||||
|   :group 'guix-hydra-build-info-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-info-jobset | ||||
|   '((t :inherit link)) | ||||
|   "Face for jobsets." | ||||
|   :group 'guix-hydra-build-info-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-info-job | ||||
|   '((t :inherit link)) | ||||
|   "Face for jobs." | ||||
|   :group 'guix-hydra-build-info-faces) | ||||
| 
 | ||||
| (defface guix-hydra-build-info-system | ||||
|   '((t :inherit link)) | ||||
|   "Face for system names." | ||||
|   :group 'guix-hydra-build-info-faces) | ||||
| 
 | ||||
| (defmacro guix-hydra-build-define-button (name) | ||||
|   "Define `guix-hydra-build-NAME' button." | ||||
|   (let* ((name-str    (symbol-name name)) | ||||
|          (button-name (intern (concat "guix-hydra-build-" name-str))) | ||||
|          (face-name   (intern (concat "guix-hydra-build-info-" name-str))) | ||||
|          (keyword     (intern (concat ":" name-str)))) | ||||
|     `(define-button-type ',button-name | ||||
|        :supertype 'guix | ||||
|        'face ',face-name | ||||
|        'help-echo ,(format "\ | ||||
| Show latest builds for this %s (with prefix, prompt for all parameters)" | ||||
|                            name-str) | ||||
|        'action (lambda (btn) | ||||
|                  (let ((args (guix-hydra-build-latest-prompt-args | ||||
|                               ,keyword (button-label btn)))) | ||||
|                    (apply #'guix-hydra-build-get-display | ||||
|                           'latest args)))))) | ||||
| 
 | ||||
| (guix-hydra-build-define-button project) | ||||
| (guix-hydra-build-define-button jobset) | ||||
| (guix-hydra-build-define-button job) | ||||
| (guix-hydra-build-define-button system) | ||||
| 
 | ||||
| (defun guix-hydra-build-info-insert-url (entry) | ||||
|   "Insert Hydra URL for the build ENTRY." | ||||
|   (guix-insert-button (guix-hydra-build-url (guix-entry-id entry)) | ||||
|                       'guix-url) | ||||
|   (when (guix-hydra-build-finished? entry) | ||||
|     (guix-info-insert-indent) | ||||
|     (guix-info-insert-action-button | ||||
|      "Build log" | ||||
|      (lambda (btn) | ||||
|        (guix-hydra-build-view-log (button-get btn 'id))) | ||||
|      "View build log" | ||||
|      'id (guix-entry-id entry)))) | ||||
| 
 | ||||
| (defun guix-hydra-build-info-insert-status (status &optional _) | ||||
|   "Insert a string with build STATUS." | ||||
|   (insert (guix-hydra-build-status-string status))) | ||||
| 
 | ||||
|  | ||||
| ;;; Hydra build 'list' | ||||
| 
 | ||||
| (guix-hydra-list-define-interface hydra-build | ||||
|   :mode-name "Hydra-Build-List" | ||||
|   :buffer-name "*Guix Hydra Build List*" | ||||
|   :format '((name nil 30 t) | ||||
|             (system nil 16 t) | ||||
|             (status guix-hydra-build-list-get-status 20 t) | ||||
|             (project nil 10 t) | ||||
|             (jobset nil 17 t) | ||||
|             (time guix-list-get-time 20 t))) | ||||
| 
 | ||||
| (let ((map guix-hydra-build-list-mode-map)) | ||||
|   (define-key map (kbd "B") 'guix-hydra-build-list-latest-builds) | ||||
|   (define-key map (kbd "L") 'guix-hydra-build-list-view-log)) | ||||
| 
 | ||||
| (defun guix-hydra-build-list-get-status (status &optional _) | ||||
|   "Return a string for build STATUS." | ||||
|   (guix-hydra-build-status-string status)) | ||||
| 
 | ||||
| (defun guix-hydra-build-list-latest-builds (number &rest args) | ||||
|   "Display latest NUMBER of Hydra builds of the current job. | ||||
| Interactively, prompt for NUMBER.  With prefix argument, prompt | ||||
| for all ARGS." | ||||
|   (interactive | ||||
|    (let ((entry (guix-list-current-entry))) | ||||
|      (guix-hydra-build-latest-prompt-args | ||||
|       :project (guix-entry-value entry 'project) | ||||
|       :jobset  (guix-entry-value entry 'name) | ||||
|       :job     (guix-entry-value entry 'job) | ||||
|       :system  (guix-entry-value entry 'system)))) | ||||
|   (apply #'guix-hydra-latest-builds number args)) | ||||
| 
 | ||||
| (defun guix-hydra-build-list-view-log () | ||||
|   "View build log of the current Hydra build." | ||||
|   (interactive) | ||||
|   (guix-hydra-build-view-log (guix-list-current-id))) | ||||
| 
 | ||||
|  | ||||
| ;;; Interactive commands | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-hydra-latest-builds (number &rest args) | ||||
|   "Display latest NUMBER of Hydra builds. | ||||
| ARGS are the same arguments as for `guix-hydra-build-latest-api-url'. | ||||
| Interactively, prompt for NUMBER.  With prefix argument, prompt | ||||
| for all ARGS." | ||||
|   (interactive (guix-hydra-build-latest-prompt-args)) | ||||
|   (apply #'guix-hydra-build-get-display | ||||
|          'latest number args)) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-hydra-queued-builds (number) | ||||
|   "Display the NUMBER of queued Hydra builds." | ||||
|   (interactive "NNumber of queued builds: ") | ||||
|   (guix-hydra-build-get-display 'queue number)) | ||||
| 
 | ||||
| (provide 'guix-hydra-build) | ||||
| 
 | ||||
| ;;; guix-hydra-build.el ends here | ||||
|  | @ -1,162 +0,0 @@ | |||
| ;;; guix-hydra-jobset.el --- Interface for Hydra jobsets  -*- 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 an interface for displaying Hydra jobsets in | ||||
| ;; 'list' and 'info' buffers. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-list) | ||||
| (require 'guix-info) | ||||
| (require 'guix-hydra) | ||||
| (require 'guix-hydra-build) | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (guix-hydra-define-entry-type hydra-jobset | ||||
|   :search-types '((project . guix-hydra-jobset-api-url)) | ||||
|   :filters '(guix-hydra-jobset-filter-id) | ||||
|   :filter-names '((nrscheduled . scheduled) | ||||
|                   (nrsucceeded . succeeded) | ||||
|                   (nrfailed . failed) | ||||
|                   (nrtotal . total))) | ||||
| 
 | ||||
| (defun guix-hydra-jobset-get-display (search-type &rest args) | ||||
|   "Search for Hydra builds and show results." | ||||
|   (apply #'guix-list-get-display-entries | ||||
|          'hydra-jobset search-type args)) | ||||
| 
 | ||||
|  | ||||
| ;;; Defining URLs | ||||
| 
 | ||||
| (defun guix-hydra-jobset-url (project jobset) | ||||
|   "Return Hydra URL of a PROJECT's JOBSET." | ||||
|   (guix-hydra-url "jobset/" project "/" jobset)) | ||||
| 
 | ||||
| (defun guix-hydra-jobset-api-url (project) | ||||
|   "Return Hydra API URL for jobsets by PROJECT." | ||||
|   (guix-hydra-api-url "jobsets" | ||||
|     `(("project" . ,project)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Filters for processing raw entries | ||||
| 
 | ||||
| (defun guix-hydra-jobset-filter-id (entry) | ||||
|   "Add 'ID' parameter to 'hydra-jobset' ENTRY." | ||||
|   (cons `(id . ,(guix-entry-value entry 'name)) | ||||
|         entry)) | ||||
| 
 | ||||
|  | ||||
| ;;; Hydra jobset 'info' | ||||
| 
 | ||||
| (guix-hydra-info-define-interface hydra-jobset | ||||
|   :mode-name "Hydra-Jobset-Info" | ||||
|   :buffer-name "*Guix Hydra Jobset Info*" | ||||
|   :format '((name ignore (simple guix-info-heading)) | ||||
|             ignore | ||||
|             guix-hydra-jobset-info-insert-url | ||||
|             (project   format guix-hydra-jobset-info-insert-project) | ||||
|             (scheduled format (format guix-hydra-jobset-info-scheduled)) | ||||
|             (succeeded format (format guix-hydra-jobset-info-succeeded)) | ||||
|             (failed    format (format guix-hydra-jobset-info-failed)) | ||||
|             (total     format (format guix-hydra-jobset-info-total)))) | ||||
| 
 | ||||
| (defface guix-hydra-jobset-info-scheduled | ||||
|   '((t)) | ||||
|   "Face used for the number of scheduled builds." | ||||
|   :group 'guix-hydra-jobset-info-faces) | ||||
| 
 | ||||
| (defface guix-hydra-jobset-info-succeeded | ||||
|   '((t :inherit guix-hydra-build-status-succeeded)) | ||||
|   "Face used for the number of succeeded builds." | ||||
|   :group 'guix-hydra-jobset-info-faces) | ||||
| 
 | ||||
| (defface guix-hydra-jobset-info-failed | ||||
|   '((t :inherit guix-hydra-build-status-failed)) | ||||
|   "Face used for the number of failed builds." | ||||
|   :group 'guix-hydra-jobset-info-faces) | ||||
| 
 | ||||
| (defface guix-hydra-jobset-info-total | ||||
|   '((t)) | ||||
|   "Face used for the total number of builds." | ||||
|   :group 'guix-hydra-jobset-info-faces) | ||||
| 
 | ||||
| (defun guix-hydra-jobset-info-insert-project (project entry) | ||||
|   "Insert PROJECT button for the jobset ENTRY." | ||||
|   (let ((jobset (guix-entry-value entry 'name))) | ||||
|     (guix-insert-button | ||||
|      project 'guix-hydra-build-project | ||||
|      'action (lambda (btn) | ||||
|                (let ((args (guix-hydra-build-latest-prompt-args | ||||
|                             :project (button-get btn 'project) | ||||
|                             :jobset  (button-get btn 'jobset)))) | ||||
|                  (apply #'guix-hydra-build-get-display | ||||
|                         'latest args))) | ||||
|      'project project | ||||
|      'jobset jobset))) | ||||
| 
 | ||||
| (defun guix-hydra-jobset-info-insert-url (entry) | ||||
|   "Insert Hydra URL for the jobset ENTRY." | ||||
|   (guix-insert-button (guix-hydra-jobset-url | ||||
|                        (guix-entry-value entry 'project) | ||||
|                        (guix-entry-value entry 'name)) | ||||
|                       'guix-url)) | ||||
| 
 | ||||
|  | ||||
| ;;; Hydra jobset 'list' | ||||
| 
 | ||||
| (guix-hydra-list-define-interface hydra-jobset | ||||
|   :mode-name "Hydra-Jobset-List" | ||||
|   :buffer-name "*Guix Hydra Jobset List*" | ||||
|   :format '((name nil 25 t) | ||||
|             (project nil 10 t) | ||||
|             (scheduled nil 12 t) | ||||
|             (succeeded nil 12 t) | ||||
|             (failed nil 9 t) | ||||
|             (total nil 10 t))) | ||||
| 
 | ||||
| (let ((map guix-hydra-jobset-list-mode-map)) | ||||
|   (define-key map (kbd "B") 'guix-hydra-jobset-list-latest-builds)) | ||||
| 
 | ||||
| (defun guix-hydra-jobset-list-latest-builds (number &rest args) | ||||
|   "Display latest NUMBER of Hydra builds of the current jobset. | ||||
| Interactively, prompt for NUMBER.  With prefix argument, prompt | ||||
| for all ARGS." | ||||
|   (interactive | ||||
|    (let ((entry (guix-list-current-entry))) | ||||
|      (guix-hydra-build-latest-prompt-args | ||||
|       :project (guix-entry-value entry 'project) | ||||
|       :jobset  (guix-entry-value entry 'name)))) | ||||
|   (apply #'guix-hydra-latest-builds number args)) | ||||
| 
 | ||||
|  | ||||
| ;;; Interactive commands | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-hydra-jobsets (project) | ||||
|   "Display jobsets of PROJECT." | ||||
|   (interactive (list (guix-hydra-read-project))) | ||||
|   (guix-hydra-jobset-get-display 'project project)) | ||||
| 
 | ||||
| (provide 'guix-hydra-jobset) | ||||
| 
 | ||||
| ;;; guix-hydra-jobset.el ends here | ||||
|  | @ -1,367 +0,0 @@ | |||
| ;;; guix-hydra.el --- Common code for interacting with Hydra  -*- 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 some general code for 'list'/'info' interfaces for | ||||
| ;; Hydra (Guix build farm). | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'json) | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-entry) | ||||
| (require 'guix-utils) | ||||
| (require 'guix-help-vars) | ||||
| 
 | ||||
| (guix-define-groups hydra) | ||||
| 
 | ||||
| (defvar guix-hydra-job-regexp | ||||
|   (concat ".*\\." (regexp-opt guix-help-system-types) "\\'") | ||||
|   "Regexp matching a full name of Hydra job (including system).") | ||||
| 
 | ||||
| (defun guix-hydra-job-name-specification (name version) | ||||
|   "Return Hydra's job name specification by NAME and VERSION." | ||||
|   (concat name "-" version)) | ||||
| 
 | ||||
| (defun guix-hydra-message (entries search-type &rest _) | ||||
|   "Display a message after showing Hydra ENTRIES." | ||||
|   ;; XXX Add more messages maybe. | ||||
|   (when (null entries) | ||||
|     (if (eq search-type 'fake) | ||||
|         (message "The update is impossible due to lack of Hydra API.") | ||||
|       (message "Hydra has returned no results.")))) | ||||
| 
 | ||||
| (defun guix-hydra-list-describe (ids) | ||||
|   "Describe 'hydra' entries with IDS (list of identifiers)." | ||||
|   (guix-buffer-display-entries | ||||
|    (guix-entries-by-ids ids (guix-buffer-current-entries)) | ||||
|    'info (guix-buffer-current-entry-type) | ||||
|    ;; Hydra does not provide an API to receive builds/jobsets by | ||||
|    ;; IDs/names, so we use a 'fake' search type. | ||||
|    '(fake) | ||||
|    'add)) | ||||
| 
 | ||||
|  | ||||
| ;;; Readers | ||||
| 
 | ||||
| (defvar guix-hydra-projects | ||||
|   '("gnu" "guix") | ||||
|   "List of available Hydra projects.") | ||||
| 
 | ||||
| (guix-define-readers | ||||
|  :completions-var guix-hydra-projects | ||||
|  :single-reader guix-hydra-read-project | ||||
|  :single-prompt "Project: ") | ||||
| 
 | ||||
| (guix-define-readers | ||||
|  :single-reader guix-hydra-read-jobset | ||||
|  :single-prompt "Jobset: ") | ||||
| 
 | ||||
| (guix-define-readers | ||||
|  :single-reader guix-hydra-read-job | ||||
|  :single-prompt "Job: ") | ||||
| 
 | ||||
| (guix-define-readers | ||||
|  :completions-var guix-help-system-types | ||||
|  :single-reader guix-hydra-read-system | ||||
|  :single-prompt "System: ") | ||||
| 
 | ||||
|  | ||||
| ;;; Defining URLs | ||||
| 
 | ||||
| (defvar guix-hydra-url "http://hydra.gnu.org" | ||||
|   "URL of the Hydra build farm.") | ||||
| 
 | ||||
| (defun guix-hydra-url (&rest url-parts) | ||||
|   "Return Hydra URL." | ||||
|   (apply #'concat guix-hydra-url "/" url-parts)) | ||||
| 
 | ||||
| (defun guix-hydra-api-url (type args) | ||||
|   "Return URL for receiving data using Hydra API. | ||||
| TYPE is the name of an allowed method. | ||||
| ARGS is alist of (KEY . VALUE) pairs. | ||||
| Skip ARG, if VALUE is nil or an empty string." | ||||
|   (declare (indent 1)) | ||||
|   (let* ((fields (mapcar | ||||
|                   (lambda (arg) | ||||
|                     (pcase arg | ||||
|                       (`(,key . ,value) | ||||
|                        (unless (or (null value) | ||||
|                                    (equal "" value)) | ||||
|                          (concat (guix-hexify key) "=" | ||||
|                                  (guix-hexify value)))) | ||||
|                       (_ (error "Wrong argument '%s'" arg)))) | ||||
|                   args)) | ||||
|          (fields (mapconcat #'identity (delq nil fields) "&"))) | ||||
|     (guix-hydra-url "api/" type "?" fields))) | ||||
| 
 | ||||
|  | ||||
| ;;; Receiving data from Hydra | ||||
| 
 | ||||
| (defun guix-hydra-receive-data (url) | ||||
|   "Return output received from URL and processed with `json-read'." | ||||
|   (with-temp-buffer | ||||
|     (url-insert-file-contents url) | ||||
|     (goto-char (point-min)) | ||||
|     (let ((json-key-type 'symbol) | ||||
|           (json-array-type 'list) | ||||
|           (json-object-type 'alist)) | ||||
|       (json-read)))) | ||||
| 
 | ||||
| (defun guix-hydra-get-entries (entry-type search-type &rest args) | ||||
|   "Receive ENTRY-TYPE entries from Hydra. | ||||
| SEARCH-TYPE is one of the types defined by `guix-hydra-define-interface'." | ||||
|   (unless (eq search-type 'fake) | ||||
|     (let* ((url         (apply #'guix-hydra-search-url | ||||
|                                entry-type search-type args)) | ||||
|            (raw-entries (guix-hydra-receive-data url)) | ||||
|            (entries     (guix-hydra-filter-entries | ||||
|                          raw-entries | ||||
|                          (guix-hydra-filters entry-type)))) | ||||
|       entries))) | ||||
| 
 | ||||
|  | ||||
| ;;; Filters for processing raw entries | ||||
| 
 | ||||
| (defun guix-hydra-filter-entries (entries filters) | ||||
|   "Filter ENTRIES using FILTERS. | ||||
| Call `guix-modify' on each entry from ENTRIES." | ||||
|   (mapcar (lambda (entry) | ||||
|             (guix-modify entry filters)) | ||||
|           entries)) | ||||
| 
 | ||||
| (defun guix-hydra-filter-names (entry name-alist) | ||||
|   "Replace names of ENTRY parameters using NAME-ALIST. | ||||
| Each element of NAME-ALIST is (OLD-NAME . NEW-NAME) pair." | ||||
|   (mapcar (lambda (param) | ||||
|             (pcase param | ||||
|               (`(,name . ,val) | ||||
|                (let ((new-name (guix-assq-value name-alist name))) | ||||
|                  (if new-name | ||||
|                      (cons new-name val) | ||||
|                    param))))) | ||||
|           entry)) | ||||
| 
 | ||||
| (defun guix-hydra-filter-boolean (entry params) | ||||
|   "Convert number PARAMS (0/1) of ENTRY to boolean values (nil/t)." | ||||
|   (mapcar (lambda (param) | ||||
|             (pcase param | ||||
|               (`(,name . ,val) | ||||
|                (if (memq name params) | ||||
|                    (cons name (guix-number->bool val)) | ||||
|                  param)))) | ||||
|           entry)) | ||||
| 
 | ||||
|  | ||||
| ;;; Wrappers for defined variables | ||||
| 
 | ||||
| (defvar guix-hydra-entry-type-data nil | ||||
|   "Alist with hydra entry type data. | ||||
| This alist is filled by `guix-hydra-define-entry-type' macro.") | ||||
| 
 | ||||
| (defun guix-hydra-entry-type-value (entry-type symbol) | ||||
|   "Return SYMBOL's value for ENTRY-TYPE from `guix-hydra'." | ||||
|   (symbol-value (guix-assq-value guix-hydra-entry-type-data | ||||
|                                  entry-type symbol))) | ||||
| 
 | ||||
| (defun guix-hydra-search-url (entry-type search-type &rest args) | ||||
|   "Return URL to receive ENTRY-TYPE entries from Hydra." | ||||
|   (apply (guix-assq-value (guix-hydra-entry-type-value | ||||
|                            entry-type 'search-types) | ||||
|                           search-type) | ||||
|          args)) | ||||
| 
 | ||||
| (defun guix-hydra-filters (entry-type) | ||||
|   "Return a list of filters for ENTRY-TYPE." | ||||
|   (guix-hydra-entry-type-value entry-type 'filters)) | ||||
| 
 | ||||
|  | ||||
| ;;; Interface definers | ||||
| 
 | ||||
| (defmacro guix-hydra-define-entry-type (entry-type &rest args) | ||||
|   "Define general code for ENTRY-TYPE. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| Required keywords: | ||||
| 
 | ||||
|   - `:search-types' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-search-types' variable. | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:filters' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-filters' variable. | ||||
| 
 | ||||
|   - `:filter-names' - if specified, a generated | ||||
|     `guix-ENTRY-TYPE-filter-names' function for filtering these | ||||
|     names will be added to `guix-ENTRY-TYPE-filters' variable. | ||||
| 
 | ||||
|   - `:filter-boolean-params' - if specified, a generated | ||||
|     `guix-ENTRY-TYPE-filter-boolean' function for filtering these | ||||
|     names will be added to `guix-ENTRY-TYPE-filters' variable. | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-define-entry-type' macro." | ||||
|   (declare (indent 1)) | ||||
|   (let* ((entry-type-str     (symbol-name entry-type)) | ||||
|          (prefix             (concat "guix-" entry-type-str)) | ||||
|          (search-types-var   (intern (concat prefix "-search-types"))) | ||||
|          (filters-var        (intern (concat prefix "-filters"))) | ||||
|          (get-fun            (intern (concat prefix "-get-entries")))) | ||||
|     (guix-keyword-args-let args | ||||
|         ((search-types-val   :search-types) | ||||
|          (filters-val        :filters) | ||||
|          (filter-names-val   :filter-names) | ||||
|          (filter-bool-val    :filter-boolean-params)) | ||||
|       `(progn | ||||
|          (defvar ,search-types-var ,search-types-val | ||||
|            ,(format "\ | ||||
| Alist of search types and according URL functions. | ||||
| Functions are used to define URL to receive '%s' entries." | ||||
|                     entry-type-str)) | ||||
| 
 | ||||
|          (defvar ,filters-var ,filters-val | ||||
|            ,(format "\ | ||||
| List of filters for '%s' parameters. | ||||
| Each filter is a function that should take an entry as a single | ||||
| argument, and should also return an entry." | ||||
|                     entry-type-str)) | ||||
| 
 | ||||
|          ,(when filter-bool-val | ||||
|             (let ((filter-bool-var (intern (concat prefix | ||||
|                                                    "-filter-boolean-params"))) | ||||
|                   (filter-bool-fun (intern (concat prefix | ||||
|                                                    "-filter-boolean")))) | ||||
|               `(progn | ||||
|                  (defvar ,filter-bool-var ,filter-bool-val | ||||
|                    ,(format "\ | ||||
| List of '%s' parameters that should be transformed to boolean values." | ||||
|                             entry-type-str)) | ||||
| 
 | ||||
|                  (defun ,filter-bool-fun (entry) | ||||
|                    ,(format "\ | ||||
| Run `guix-hydra-filter-boolean' with `%S' variable." | ||||
|                             filter-bool-var) | ||||
|                    (guix-hydra-filter-boolean entry ,filter-bool-var)) | ||||
| 
 | ||||
|                  (setq ,filters-var | ||||
|                        (cons ',filter-bool-fun ,filters-var))))) | ||||
| 
 | ||||
|          ;; Do not move this clause up!: name filtering should be | ||||
|          ;; performed before any other filtering, so this filter should | ||||
|          ;; be consed after the boolean filter. | ||||
|          ,(when filter-names-val | ||||
|             (let* ((filter-names-var (intern (concat prefix | ||||
|                                                      "-filter-names"))) | ||||
|                    (filter-names-fun filter-names-var)) | ||||
|               `(progn | ||||
|                  (defvar ,filter-names-var ,filter-names-val | ||||
|                    ,(format "\ | ||||
| Alist of '%s' parameter names returned by Hydra API and names | ||||
| used internally by the elisp code of this package." | ||||
|                             entry-type-str)) | ||||
| 
 | ||||
|                  (defun ,filter-names-fun (entry) | ||||
|                    ,(format "\ | ||||
| Run `guix-hydra-filter-names' with `%S' variable." | ||||
|                             filter-names-var) | ||||
|                    (guix-hydra-filter-names entry ,filter-names-var)) | ||||
| 
 | ||||
|                  (setq ,filters-var | ||||
|                        (cons ',filter-names-fun ,filters-var))))) | ||||
| 
 | ||||
|          (defun ,get-fun (search-type &rest args) | ||||
|            ,(format "\ | ||||
| Receive '%s' entries. | ||||
| See `guix-hydra-get-entries' for details." | ||||
|                     entry-type-str) | ||||
|            (apply #'guix-hydra-get-entries | ||||
|                   ',entry-type search-type args)) | ||||
| 
 | ||||
|          (guix-alist-put! | ||||
|           '((search-types . ,search-types-var) | ||||
|             (filters      . ,filters-var)) | ||||
|           'guix-hydra-entry-type-data ',entry-type) | ||||
| 
 | ||||
|          (guix-define-entry-type ,entry-type | ||||
|            :parent-group guix-hydra | ||||
|            :parent-faces-group guix-hydra-faces | ||||
|            ,@%foreign-args))))) | ||||
| 
 | ||||
| (defmacro guix-hydra-define-interface (buffer-type entry-type &rest args) | ||||
|   "Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries. | ||||
| 
 | ||||
| This macro should be called after calling | ||||
| `guix-hydra-define-entry-type' with the same ENTRY-TYPE. | ||||
| 
 | ||||
| ARGS are passed to `guix-BUFFER-TYPE-define-interface' macro." | ||||
|   (declare (indent 2)) | ||||
|   (let* ((entry-type-str  (symbol-name entry-type)) | ||||
|          (buffer-type-str (symbol-name buffer-type)) | ||||
|          (get-fun         (intern (concat "guix-" entry-type-str | ||||
|                                           "-get-entries"))) | ||||
|          (definer         (intern (concat "guix-" buffer-type-str | ||||
|                                           "-define-interface")))) | ||||
|     `(,definer ,entry-type | ||||
|        :get-entries-function ',get-fun | ||||
|        :message-function 'guix-hydra-message | ||||
|        ,@args))) | ||||
| 
 | ||||
| (defmacro guix-hydra-info-define-interface (entry-type &rest args) | ||||
|   "Define 'info' interface for displaying ENTRY-TYPE entries. | ||||
| See `guix-hydra-define-interface'." | ||||
|   (declare (indent 1)) | ||||
|   `(guix-hydra-define-interface info ,entry-type | ||||
|      ,@args)) | ||||
| 
 | ||||
| (defmacro guix-hydra-list-define-interface (entry-type &rest args) | ||||
|   "Define 'list' interface for displaying ENTRY-TYPE entries. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:describe-function' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-list-describe-function' variable (if not | ||||
|     specified, use `guix-hydra-list-describe'). | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-hydra-define-interface' macro." | ||||
|   (declare (indent 1)) | ||||
|   (guix-keyword-args-let args | ||||
|       ((describe-val :describe-function)) | ||||
|     `(guix-hydra-define-interface list ,entry-type | ||||
|        :describe-function ,(or describe-val ''guix-hydra-list-describe) | ||||
|        ,@args))) | ||||
| 
 | ||||
|  | ||||
| (defvar guix-hydra-font-lock-keywords | ||||
|   (eval-when-compile | ||||
|     `((,(rx "(" (group (or "guix-hydra-define-entry-type" | ||||
|                            "guix-hydra-define-interface" | ||||
|                            "guix-hydra-info-define-interface" | ||||
|                            "guix-hydra-list-define-interface")) | ||||
|             symbol-end) | ||||
|        . 1)))) | ||||
| 
 | ||||
| (font-lock-add-keywords 'emacs-lisp-mode guix-hydra-font-lock-keywords) | ||||
| 
 | ||||
| (provide 'guix-hydra) | ||||
| 
 | ||||
| ;;; guix-hydra.el ends here | ||||
|  | @ -1,482 +0,0 @@ | |||
| ;;; guix-info.el --- 'Info' buffer interface for displaying data  -*- 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 'info' (help-like) buffer interface for displaying | ||||
| ;; an arbitrary data. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-entry) | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (guix-define-buffer-type info) | ||||
| 
 | ||||
| (defface guix-info-heading | ||||
|   '((((type tty pc) (class color)) :weight bold) | ||||
|     (t :height 1.6 :weight bold :inherit variable-pitch)) | ||||
|   "Face for headings." | ||||
|   :group 'guix-info-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-name | ||||
|   '((t :inherit link)) | ||||
|   "Face used for file names." | ||||
|   :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-values nil | ||||
|   "If non-nil, do not display parameters with nil values." | ||||
|   :type 'boolean | ||||
|   :group 'guix-info) | ||||
| 
 | ||||
| (defcustom guix-info-fill t | ||||
|   "If non-nil, fill string parameters to fit the window. | ||||
| If nil, insert text parameters (like synopsis or description) in | ||||
| a raw form." | ||||
|   :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-format'.") | ||||
| 
 | ||||
| (defvar guix-info-multiline-prefix | ||||
|   (make-string (length (format guix-info-param-title-format " ")) | ||||
|                ?\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-value-format'.") | ||||
| 
 | ||||
| (defvar guix-info-indent 2 | ||||
|   "Number of spaces used to indent various parts of inserted text.") | ||||
| 
 | ||||
| (defvar guix-info-delimiter "\n\f\n" | ||||
|   "String used to separate entries.") | ||||
| 
 | ||||
|  | ||||
| ;;; Wrappers for 'info' variables | ||||
| 
 | ||||
| (defvar guix-info-data nil | ||||
|   "Alist with 'info' data. | ||||
| This alist is filled by `guix-info-define-interface' macro.") | ||||
| 
 | ||||
| (defun guix-info-value (entry-type symbol) | ||||
|   "Return SYMBOL's value for ENTRY-TYPE from `guix-info-data'." | ||||
|   (symbol-value (guix-assq-value guix-info-data entry-type symbol))) | ||||
| 
 | ||||
| (defun guix-info-param-title (entry-type param) | ||||
|   "Return a title of an ENTRY-TYPE parameter PARAM." | ||||
|   (guix-buffer-param-title 'info entry-type param)) | ||||
| 
 | ||||
| (defun guix-info-format (entry-type) | ||||
|   "Return 'info' format for ENTRY-TYPE." | ||||
|   (guix-info-value entry-type 'format)) | ||||
| 
 | ||||
| (defun guix-info-displayed-params (entry-type) | ||||
|   "Return a list of ENTRY-TYPE parameters that should be displayed." | ||||
|   (delq nil | ||||
|         (mapcar (lambda (spec) | ||||
|                   (pcase spec | ||||
|                     (`(,param . ,_) param))) | ||||
|                 (guix-info-format entry-type)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Inserting entries | ||||
| 
 | ||||
| (defvar guix-info-title-aliases | ||||
|   '((format . guix-info-insert-title-format) | ||||
|     (simple . guix-info-insert-title-simple)) | ||||
|   "Alist of aliases and functions to insert titles.") | ||||
| 
 | ||||
| (defvar guix-info-value-aliases | ||||
|   '((format . guix-info-insert-value-format) | ||||
|     (indent . guix-info-insert-value-indent) | ||||
|     (simple . guix-info-insert-value-simple) | ||||
|     (time   . guix-info-insert-time)) | ||||
|   "Alist of aliases and functions to insert values.") | ||||
| 
 | ||||
| (defun guix-info-title-function (fun-or-alias) | ||||
|   "Convert FUN-OR-ALIAS into a function to insert a title." | ||||
|   (or (guix-assq-value guix-info-title-aliases fun-or-alias) | ||||
|       fun-or-alias)) | ||||
| 
 | ||||
| (defun guix-info-value-function (fun-or-alias) | ||||
|   "Convert FUN-OR-ALIAS into a function to insert a value." | ||||
|   (or (guix-assq-value guix-info-value-aliases fun-or-alias) | ||||
|       fun-or-alias)) | ||||
| 
 | ||||
| (defun guix-info-title-method->function (method) | ||||
|   "Convert title METHOD into a function to insert a title." | ||||
|   (pcase method | ||||
|     ((pred null) #'ignore) | ||||
|     ((pred symbolp) (guix-info-title-function method)) | ||||
|     (`(,fun-or-alias . ,rest-args) | ||||
|      (lambda (title) | ||||
|        (apply (guix-info-title-function fun-or-alias) | ||||
|               title rest-args))) | ||||
|     (_ (error "Unknown title method '%S'" method)))) | ||||
| 
 | ||||
| (defun guix-info-value-method->function (method) | ||||
|   "Convert value METHOD into a function to insert a value." | ||||
|   (pcase method | ||||
|     ((pred null) #'ignore) | ||||
|     ((pred functionp) method) | ||||
|     (`(,fun-or-alias . ,rest-args) | ||||
|      (lambda (value _) | ||||
|        (apply (guix-info-value-function fun-or-alias) | ||||
|               value rest-args))) | ||||
|     (_ (error "Unknown value method '%S'" method)))) | ||||
| 
 | ||||
| (defun guix-info-fill-column () | ||||
|   "Return fill column for the current window." | ||||
|   (min (window-width) fill-column)) | ||||
| 
 | ||||
| (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 ENTRY-TYPE ENTRIES in the current info buffer." | ||||
|   (guix-mapinsert (lambda (entry) | ||||
|                     (guix-info-insert-entry entry entry-type)) | ||||
|                   entries | ||||
|                   guix-info-delimiter)) | ||||
| 
 | ||||
| (defun guix-info-insert-entry (entry entry-type &optional indent-level) | ||||
|   "Insert ENTRY of ENTRY-TYPE into the current info buffer. | ||||
| If INDENT-LEVEL is non-nil, indent displayed data by this number | ||||
| of `guix-info-indent' spaces." | ||||
|   (guix-with-indent (* (or indent-level 0) | ||||
|                        guix-info-indent) | ||||
|     (dolist (spec (guix-info-format entry-type)) | ||||
|       (guix-info-insert-entry-unit spec entry entry-type)))) | ||||
| 
 | ||||
| (defun guix-info-insert-entry-unit (format-spec 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." | ||||
|   (pcase format-spec | ||||
|     ((pred functionp) | ||||
|      (funcall format-spec entry) | ||||
|      (insert "\n")) | ||||
|     (`(,param ,title-method ,value-method) | ||||
|      (let ((value (guix-entry-value entry param))) | ||||
|        (unless (and guix-info-ignore-empty-values (null value)) | ||||
|          (let ((title        (guix-info-param-title entry-type param)) | ||||
|                (insert-title (guix-info-title-method->function title-method)) | ||||
|                (insert-value (guix-info-value-method->function value-method))) | ||||
|            (funcall insert-title title) | ||||
|            (funcall insert-value value entry) | ||||
|            (insert "\n"))))) | ||||
|     (_ (error "Unknown format specification '%S'" format-spec)))) | ||||
| 
 | ||||
| (defun guix-info-insert-title-simple (title &optional face) | ||||
|   "Insert \"TITLE: \" string at point. | ||||
| If FACE is nil, use `guix-info-param-title'." | ||||
|   (guix-format-insert title | ||||
|                       (or face 'guix-info-param-title) | ||||
|                       "%s: ")) | ||||
| 
 | ||||
| (defun guix-info-insert-title-format (title &optional face) | ||||
|   "Insert TITLE using `guix-info-param-title-format' at point. | ||||
| If FACE is nil, use `guix-info-param-title'." | ||||
|   (guix-format-insert title | ||||
|                       (or face 'guix-info-param-title) | ||||
|                       guix-info-param-title-format)) | ||||
| 
 | ||||
| (defun guix-info-insert-value-simple (value &optional button-or-face indent) | ||||
|   "Format and insert parameter VALUE at point. | ||||
| 
 | ||||
| VALUE may be split into several short lines to fit the current | ||||
| window, depending on `guix-info-fill', and each line is indented | ||||
| with INDENT number of spaces. | ||||
| 
 | ||||
| If BUTTON-OR-FACE is a button type symbol, transform VALUE into | ||||
| this (these) button(s) and insert each one on a new line.  If it | ||||
| is a face symbol, propertize inserted line(s) with this face." | ||||
|   (or indent (setq indent 0)) | ||||
|   (guix-with-indent indent | ||||
|     (let* ((button?  (guix-button-type? button-or-face)) | ||||
|            (face     (unless button? button-or-face)) | ||||
|            (fill-col (unless (or button? | ||||
|                                  (and (stringp value) | ||||
|                                       (not guix-info-fill))) | ||||
|                        (- (guix-info-fill-column) indent))) | ||||
|            (value    (if (and value button?) | ||||
|                          (guix-buttonize value button-or-face "\n") | ||||
|                        value))) | ||||
|       (guix-split-insert value face fill-col "\n")))) | ||||
| 
 | ||||
| (defun guix-info-insert-value-indent (value &optional button-or-face) | ||||
|   "Format and insert parameter VALUE at point. | ||||
| 
 | ||||
| This function is intended to be called after inserting a title | ||||
| with `guix-info-insert-title-simple'. | ||||
| 
 | ||||
| VALUE may be split into several short lines to fit the current | ||||
| window, depending on `guix-info-fill', and each line is indented | ||||
| with `guix-info-indent'. | ||||
| 
 | ||||
| For the meaning of BUTTON-OR-FACE, see `guix-info-insert-value-simple'." | ||||
|   (when value (insert "\n")) | ||||
|   (guix-info-insert-value-simple value button-or-face guix-info-indent)) | ||||
| 
 | ||||
| (defun guix-info-insert-value-format (value &optional button-or-face | ||||
|                                             &rest button-properties) | ||||
|   "Format and insert parameter VALUE at point. | ||||
| 
 | ||||
| This function is intended to be called after inserting a title | ||||
| with `guix-info-insert-title-format'. | ||||
| 
 | ||||
| VALUE may be split into several short lines to fit the current | ||||
| window, depending on `guix-info-fill' and | ||||
| `guix-info-multiline-prefix'.  If VALUE is a list, its elements | ||||
| will be separated with `guix-list-separator'. | ||||
| 
 | ||||
| If BUTTON-OR-FACE is a button type symbol, transform VALUE into | ||||
| this (these) button(s).  If it is a face symbol, propertize | ||||
| inserted line(s) with this face. | ||||
| 
 | ||||
| BUTTON-PROPERTIES are passed to `guix-buttonize' (only if | ||||
| BUTTON-OR-FACE is a button type)." | ||||
|   (let* ((button?  (guix-button-type? button-or-face)) | ||||
|          (face     (unless button? button-or-face)) | ||||
|          (fill-col (when (or button? | ||||
|                              guix-info-fill | ||||
|                              (not (stringp value))) | ||||
|                      (- (guix-info-fill-column) | ||||
|                         (length guix-info-multiline-prefix)))) | ||||
|          (value    (if (and value button?) | ||||
|                        (apply #'guix-buttonize | ||||
|                               value button-or-face guix-list-separator | ||||
|                               button-properties) | ||||
|                      value))) | ||||
|     (guix-split-insert value face fill-col | ||||
|                        (concat "\n" guix-info-multiline-prefix)))) | ||||
| 
 | ||||
| (defun guix-info-insert-time (seconds &optional face) | ||||
|   "Insert formatted time string using SECONDS at point." | ||||
|   (guix-format-insert (guix-get-time-string seconds) | ||||
|                       (or face '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-name | ||||
|   '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)))) | ||||
| 
 | ||||
| (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 | ||||
|       (guix-copy-as-kill (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)) | ||||
| 
 | ||||
|  | ||||
| ;;; Major mode and interface definer | ||||
| 
 | ||||
| (defvar guix-info-mode-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (set-keymap-parent | ||||
|      map (make-composed-keymap (list guix-buffer-map button-buffer-map) | ||||
|                                special-mode-map)) | ||||
|     map) | ||||
|   "Keymap for `guix-info-mode' buffers.") | ||||
| 
 | ||||
| (define-derived-mode guix-info-mode special-mode "Guix-Info" | ||||
|   "Parent mode for displaying data in 'info' form." | ||||
|   (setq-local revert-buffer-function 'guix-buffer-revert)) | ||||
| 
 | ||||
| (defun guix-info-mode-initialize () | ||||
|   "Set up the current 'info' buffer." | ||||
|   ;; Without this, syntactic fontification is performed, and it may | ||||
|   ;; break our highlighting.  For example, description of "emacs-typo" | ||||
|   ;; package contains a single " (double-quote) character, so the | ||||
|   ;; default syntactic fontification highlights the rest text after it | ||||
|   ;; as a string.  See (info "(elisp) Font Lock Basics") for details. | ||||
|   (setq font-lock-defaults '(nil t))) | ||||
| 
 | ||||
| (defmacro guix-info-define-interface (entry-type &rest args) | ||||
|   "Define 'info' interface for displaying ENTRY-TYPE entries. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| Required keywords: | ||||
| 
 | ||||
|   - `:format' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-info-format' variable. | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-buffer-define-interface' macro." | ||||
|   (declare (indent 1)) | ||||
|   (let* ((entry-type-str     (symbol-name entry-type)) | ||||
|          (prefix             (concat "guix-" entry-type-str "-info")) | ||||
|          (group              (intern prefix)) | ||||
|          (format-var         (intern (concat prefix "-format")))) | ||||
|     (guix-keyword-args-let args | ||||
|         ((show-entries-val   :show-entries-function) | ||||
|          (format-val         :format)) | ||||
|       `(progn | ||||
|          (defcustom ,format-var ,format-val | ||||
|            ,(format "\ | ||||
| List of methods for inserting '%s' entry. | ||||
| Each METHOD should be either a function or should have the | ||||
| following form: | ||||
| 
 | ||||
|   (PARAM INSERT-TITLE INSERT-VALUE) | ||||
| 
 | ||||
| If METHOD is a function, it is called with an entry as argument. | ||||
| 
 | ||||
| PARAM is a name of '%s' entry parameter. | ||||
| 
 | ||||
| INSERT-TITLE may be either a symbol or a list.  If it is a | ||||
| symbol, it should be a function or an alias from | ||||
| `guix-info-title-aliases', in which case it is called with title | ||||
| as argument.  If it is a list, it should have a | ||||
| form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is | ||||
| called with title and ARGS as arguments. | ||||
| 
 | ||||
| INSERT-VALUE may be either a symbol or a list.  If it is a | ||||
| symbol, it should be a function or an alias from | ||||
| `guix-info-value-aliases', in which case it is called with value | ||||
| and entry as arguments.  If it is a list, it should have a | ||||
| form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is | ||||
| called with value and ARGS as arguments. | ||||
| 
 | ||||
| Parameters are inserted in the same order as defined by this list. | ||||
| After calling each METHOD, a new line is inserted." | ||||
|                     entry-type-str entry-type-str) | ||||
|            :type 'sexp | ||||
|            :group ',group) | ||||
| 
 | ||||
|          (guix-alist-put! | ||||
|           '((format . ,format-var)) | ||||
|           'guix-info-data ',entry-type) | ||||
| 
 | ||||
|          ,(if show-entries-val | ||||
|               `(guix-buffer-define-interface info ,entry-type | ||||
|                  :show-entries-function ,show-entries-val | ||||
|                  ,@%foreign-args) | ||||
| 
 | ||||
|             (let ((insert-fun (intern (concat prefix "-insert-entries")))) | ||||
|               `(progn | ||||
|                  (defun ,insert-fun (entries) | ||||
|                    ,(format "\ | ||||
| Print '%s' ENTRIES in the current 'info' buffer." | ||||
|                             entry-type-str) | ||||
|                    (guix-info-insert-entries entries ',entry-type)) | ||||
| 
 | ||||
|                  (guix-buffer-define-interface info ,entry-type | ||||
|                    :insert-entries-function ',insert-fun | ||||
|                    :mode-init-function 'guix-info-mode-initialize | ||||
|                    ,@%foreign-args)))))))) | ||||
| 
 | ||||
|  | ||||
| (defvar guix-info-font-lock-keywords | ||||
|   (eval-when-compile | ||||
|     `((,(rx "(" (group "guix-info-define-interface") | ||||
|             symbol-end) | ||||
|        . 1)))) | ||||
| 
 | ||||
| (font-lock-add-keywords 'emacs-lisp-mode guix-info-font-lock-keywords) | ||||
| 
 | ||||
| (provide 'guix-info) | ||||
| 
 | ||||
| ;;; guix-info.el ends here | ||||
|  | @ -1,3 +0,0 @@ | |||
| (require 'guix-autoloads) | ||||
| (message "(require 'guix-init) is obsolete, use (require 'guix-autoloads) instead.") | ||||
| (provide 'guix-init) | ||||
|  | @ -1,65 +0,0 @@ | |||
| ;;; guix-license.el --- Licenses | ||||
| 
 | ||||
| ;; Copyright © 2016 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 to work with licenses of Guix packages. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'guix-read) | ||||
| (require 'guix-backend) | ||||
| (require 'guix-guile) | ||||
| 
 | ||||
| (defun guix-license-file (&optional directory) | ||||
|   "Return name of the file with license definitions. | ||||
| DIRECTORY is a directory with Guix source (`guix-directory' by default)." | ||||
|   (expand-file-name "guix/licenses.scm" | ||||
|                     (or directory guix-directory))) | ||||
| 
 | ||||
| (defun guix-lookup-license-url (license) | ||||
|   "Return URL of a LICENSE." | ||||
|   (or (guix-eval-read (guix-make-guile-expression | ||||
|                        'lookup-license-uri license)) | ||||
|       (error "Hm, I don't know URL of '%s' license" license))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-find-license-definition (license &optional directory) | ||||
|   "Open licenses file from DIRECTORY and move to the LICENSE definition. | ||||
| See `guix-license-file' for the meaning of DIRECTORY. | ||||
| Interactively, with prefix argument, prompt for DIRECTORY." | ||||
|   (interactive | ||||
|    (list (guix-read-license-name) | ||||
|          (guix-read-directory))) | ||||
|   (find-file (guix-license-file directory)) | ||||
|   (goto-char (point-min)) | ||||
|   (when (re-search-forward (concat "\"" (regexp-quote license) "\"") | ||||
|                            nil t) | ||||
|     (beginning-of-defun) | ||||
|     (recenter 1))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-browse-license-url (license) | ||||
|   "Browse URL of a LICENSE." | ||||
|   (interactive (list (guix-read-license-name))) | ||||
|   (browse-url (guix-lookup-license-url license))) | ||||
| 
 | ||||
| (provide 'guix-license) | ||||
| 
 | ||||
| ;;; guix-license.el ends here | ||||
|  | @ -1,585 +0,0 @@ | |||
| ;;; guix-list.el --- 'List' buffer interface for displaying data  -*- 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 'list' buffer interface for displaying an arbitrary | ||||
| ;; data. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'tabulated-list) | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-info) | ||||
| (require 'guix-entry) | ||||
| (require 'guix-utils) | ||||
| 
 | ||||
| (guix-define-buffer-type list) | ||||
| 
 | ||||
| (defface guix-list-file-name | ||||
|   '((t :inherit guix-info-file-name)) | ||||
|   "Face used for file names." | ||||
|   :group 'guix-list-faces) | ||||
| 
 | ||||
| (defface guix-list-url | ||||
|   '((t :inherit guix-info-url)) | ||||
|   "Face used for URLs." | ||||
|   :group 'guix-list-faces) | ||||
| 
 | ||||
| (defface guix-list-time | ||||
|   '((t :inherit guix-info-time)) | ||||
|   "Face used for time stamps." | ||||
|   :group 'guix-list-faces) | ||||
| 
 | ||||
| (defun guix-list-describe (&optional mark-names) | ||||
|   "Describe entries marked with a general mark. | ||||
| 'Describe' means display entries in 'info' buffer. | ||||
| If no entries are marked, describe the current entry. | ||||
| With prefix argument, describe entries marked with any mark." | ||||
|   (interactive (list (unless current-prefix-arg '(general)))) | ||||
|   (let* ((ids        (or (apply #'guix-list-get-marked-id-list mark-names) | ||||
|                          (list (guix-list-current-id)))) | ||||
|          (count      (length ids)) | ||||
|          (entry-type (guix-buffer-current-entry-type))) | ||||
|     (when (or (<= count (guix-list-describe-warning-count entry-type)) | ||||
|               (y-or-n-p (format "Do you really want to describe %d entries? " | ||||
|                                 count))) | ||||
|       (guix-list-describe-entries entry-type ids)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Wrappers for 'list' variables | ||||
| 
 | ||||
| (defvar guix-list-data nil | ||||
|   "Alist with 'list' data. | ||||
| This alist is filled by `guix-list-define-interface' macro.") | ||||
| 
 | ||||
| (defun guix-list-value (entry-type symbol) | ||||
|   "Return SYMBOL's value for ENTRY-TYPE from `guix-list-data'." | ||||
|   (symbol-value (guix-assq-value guix-list-data entry-type symbol))) | ||||
| 
 | ||||
| (defun guix-list-param-title (entry-type param) | ||||
|   "Return column title of an ENTRY-TYPE parameter PARAM." | ||||
|   (guix-buffer-param-title 'list entry-type param)) | ||||
| 
 | ||||
| (defun guix-list-format (entry-type) | ||||
|   "Return column format for ENTRY-TYPE." | ||||
|   (guix-list-value entry-type 'format)) | ||||
| 
 | ||||
| (defun guix-list-displayed-params (entry-type) | ||||
|   "Return a list of ENTRY-TYPE parameters that should be displayed." | ||||
|   (mapcar #'car (guix-list-format entry-type))) | ||||
| 
 | ||||
| (defun guix-list-sort-key (entry-type) | ||||
|   "Return sort key for ENTRY-TYPE." | ||||
|   (guix-list-value entry-type 'sort-key)) | ||||
| 
 | ||||
| (defun guix-list-additional-marks (entry-type) | ||||
|   "Return alist of additional marks for ENTRY-TYPE." | ||||
|   (guix-list-value entry-type 'marks)) | ||||
| 
 | ||||
| (defun guix-list-single-entry? (entry-type) | ||||
|   "Return non-nil, if a single entry of ENTRY-TYPE should be listed." | ||||
|   (guix-list-value entry-type 'list-single)) | ||||
| 
 | ||||
| (defun guix-list-describe-warning-count (entry-type) | ||||
|   "Return the maximum number of ENTRY-TYPE entries to describe." | ||||
|   (guix-list-value entry-type 'describe-count)) | ||||
| 
 | ||||
| (defun guix-list-describe-entries (entry-type ids) | ||||
|   "Describe ENTRY-TYPE entries with IDS in 'info' buffer" | ||||
|   (funcall (guix-list-value entry-type 'describe) | ||||
|            ids)) | ||||
| 
 | ||||
|  | ||||
| ;;; Tabulated list internals | ||||
| 
 | ||||
| (defun guix-list-sort-numerically (column a b) | ||||
|   "Compare COLUMN of tabulated entries A and B numerically. | ||||
| This function is used for sort predicates 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)))) | ||||
| 
 | ||||
| (defmacro guix-list-define-numerical-sorter (column) | ||||
|   "Define numerical sort predicate for COLUMN. | ||||
| See `guix-list-sort-numerically' for details." | ||||
|   (let ((name (intern (format "guix-list-sort-numerically-%d" column))) | ||||
|         (doc  (format "\ | ||||
| Predicate to sort tabulated list by column %d numerically. | ||||
| See `guix-list-sort-numerically' for details." | ||||
|                       column))) | ||||
|     `(defun ,name (a b) | ||||
|        ,doc | ||||
|        (guix-list-sort-numerically ,column a b)))) | ||||
| 
 | ||||
| (defmacro guix-list-define-numerical-sorters (n) | ||||
|   "Define numerical sort predicates for columns from 0 to N. | ||||
| See `guix-list-define-numerical-sorter' for details." | ||||
|   `(progn | ||||
|      ,@(mapcar (lambda (i) | ||||
|                  `(guix-list-define-numerical-sorter ,i)) | ||||
|                (number-sequence 0 n)))) | ||||
| 
 | ||||
| (guix-list-define-numerical-sorters 9) | ||||
| 
 | ||||
| (defun guix-list-tabulated-sort-key (entry-type) | ||||
|   "Return ENTRY-TYPE sort key for `tabulated-list-sort-key'." | ||||
|   (let ((sort-key (guix-list-sort-key entry-type))) | ||||
|     (and sort-key | ||||
|          (cons (guix-list-param-title entry-type (car sort-key)) | ||||
|                (cdr sort-key))))) | ||||
| 
 | ||||
| (defun guix-list-tabulated-vector (entry-type fun) | ||||
|   "Call FUN on each column specification for ENTRY-TYPE. | ||||
| 
 | ||||
| FUN is applied to column specification as arguments (see | ||||
| `guix-list-format'). | ||||
| 
 | ||||
| Return a vector made of values of FUN calls." | ||||
|   (apply #'vector | ||||
|          (mapcar (lambda (col-spec) | ||||
|                    (apply fun col-spec)) | ||||
|                  (guix-list-format entry-type)))) | ||||
| 
 | ||||
| (defun guix-list-tabulated-format (entry-type) | ||||
|   "Return ENTRY-TYPE list specification for `tabulated-list-format'." | ||||
|   (guix-list-tabulated-vector | ||||
|    entry-type | ||||
|    (lambda (param _ &rest rest-spec) | ||||
|      (cons (guix-list-param-title entry-type param) | ||||
|            rest-spec)))) | ||||
| 
 | ||||
| (defun guix-list-tabulated-entries (entries entry-type) | ||||
|   "Return a list of ENTRY-TYPE values for `tabulated-list-entries'." | ||||
|   (mapcar (lambda (entry) | ||||
|             (list (guix-entry-id entry) | ||||
|                   (guix-list-tabulated-entry entry entry-type))) | ||||
|           entries)) | ||||
| 
 | ||||
| (defun guix-list-tabulated-entry (entry entry-type) | ||||
|   "Return array of values for `tabulated-list-entries'. | ||||
| Parameters are taken from ENTRY-TYPE ENTRY." | ||||
|   (guix-list-tabulated-vector | ||||
|    entry-type | ||||
|    (lambda (param fun &rest _) | ||||
|      (let ((val (guix-entry-value entry param))) | ||||
|        (if fun | ||||
|            (funcall fun val entry) | ||||
|          (guix-get-string val)))))) | ||||
| 
 | ||||
|  | ||||
| ;;; Displaying entries | ||||
| 
 | ||||
| (defun guix-list-get-display-entries (entry-type &rest args) | ||||
|   "Search for entries and show them in a 'list' buffer preferably." | ||||
|   (let ((entries (guix-buffer-get-entries 'list entry-type args))) | ||||
|     (if (or (null entries)      ; = 0 | ||||
|             (cdr entries)       ; > 1 | ||||
|             (guix-list-single-entry? entry-type) | ||||
|             (null (guix-buffer-value 'info entry-type 'show-entries))) | ||||
|         (guix-buffer-display-entries entries 'list entry-type args 'add) | ||||
|       (if (equal (guix-buffer-value 'info entry-type 'get-entries) | ||||
|                  (guix-buffer-value 'list entry-type 'get-entries)) | ||||
|           (guix-buffer-display-entries entries 'info entry-type args 'add) | ||||
|         (guix-buffer-get-display-entries 'info entry-type args 'add))))) | ||||
| 
 | ||||
| (defun guix-list-insert-entries (entries entry-type) | ||||
|   "Print ENTRY-TYPE ENTRIES in the current buffer." | ||||
|   (setq tabulated-list-entries | ||||
|         (guix-list-tabulated-entries entries entry-type)) | ||||
|   (tabulated-list-print)) | ||||
| 
 | ||||
| (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-string (guix-get-time-string seconds) | ||||
|                    'guix-list-time)) | ||||
| 
 | ||||
| (defun guix-list-get-file-name (file-name &optional _) | ||||
|   "Return FILE-NAME button specification for `tabulated-list-entries'." | ||||
|   (list file-name | ||||
|         'face 'guix-list-file-name | ||||
|         'action (lambda (btn) (find-file (button-label btn))) | ||||
|         'follow-link t | ||||
|         'help-echo "Find file")) | ||||
| 
 | ||||
| (defun guix-list-get-url (url &optional _) | ||||
|   "Return URL button specification for `tabulated-list-entries'." | ||||
|   (list url | ||||
|         'face 'guix-list-url | ||||
|         'action (lambda (btn) (browse-url (button-label btn))) | ||||
|         'follow-link t | ||||
|         'help-echo "Browse URL")) | ||||
| 
 | ||||
|  | ||||
| ;;; 'List' lines | ||||
| 
 | ||||
| (defun guix-list-current-id () | ||||
|   "Return ID of the entry at point." | ||||
|   (or (tabulated-list-get-id) | ||||
|       (user-error "No entry here"))) | ||||
| 
 | ||||
| (defun guix-list-current-entry () | ||||
|   "Return entry at point." | ||||
|   (guix-entry-by-id (guix-list-current-id) | ||||
|                     (guix-buffer-current-entries))) | ||||
| 
 | ||||
| (defun guix-list-for-each-line (fun &rest args) | ||||
|   "Call FUN with ARGS for each entry line." | ||||
|   (or (derived-mode-p 'guix-list-mode) | ||||
|       (error "The current buffer is not in Guix List mode")) | ||||
|   (save-excursion | ||||
|     (goto-char (point-min)) | ||||
|     (while (not (eobp)) | ||||
|       (apply fun args) | ||||
|       (forward-line)))) | ||||
| 
 | ||||
| (defun guix-list-fold-lines (fun init) | ||||
|   "Fold over entry lines in the current list buffer. | ||||
| Call FUN with RESULT as argument for each line, using INIT as | ||||
| the initial value of RESULT.  Return the final result." | ||||
|   (let ((res init)) | ||||
|     (guix-list-for-each-line | ||||
|      (lambda () (setq res (funcall fun res)))) | ||||
|     res)) | ||||
| 
 | ||||
|  | ||||
| ;;; Marking and sorting | ||||
| 
 | ||||
| (defvar-local guix-list-marked nil | ||||
|   "List of the marked entries. | ||||
| Each element of the list has a form: | ||||
| 
 | ||||
|   (ID MARK-NAME . ARGS) | ||||
| 
 | ||||
| ID is an entry ID. | ||||
| MARK-NAME is a symbol from `guix-list-marks'. | ||||
| ARGS is a list of additional values.") | ||||
| 
 | ||||
| (defvar-local guix-list-marks nil | ||||
|   "Alist of available mark names and mark characters.") | ||||
| 
 | ||||
| (defvar guix-list-default-marks | ||||
|   '((empty   . ?\s) | ||||
|     (general . ?*)) | ||||
|   "Alist of default mark names and mark characters.") | ||||
| 
 | ||||
| (defun guix-list-marks (entry-type) | ||||
|   "Return alist of available marks for ENTRY-TYPE." | ||||
|   (append guix-list-default-marks | ||||
|           (guix-list-additional-marks entry-type))) | ||||
| 
 | ||||
| (defun guix-list-get-mark (name) | ||||
|   "Return mark character by its NAME." | ||||
|   (or (guix-assq-value guix-list-marks name) | ||||
|       (error "Mark '%S' not found" name))) | ||||
| 
 | ||||
| (defun 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-marks' except the `empty' one." | ||||
|   (or mark-names | ||||
|       (setq mark-names | ||||
|             (delq 'empty | ||||
|                   (mapcar #'car guix-list-marks)))) | ||||
|   (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-marks'. | ||||
| 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-marks'. | ||||
| 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-marked'." | ||||
|   (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)) | ||||
| 
 | ||||
|  | ||||
| ;;; Major mode and interface definer | ||||
| 
 | ||||
| (defvar guix-list-mode-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (set-keymap-parent | ||||
|      map (make-composed-keymap guix-buffer-map | ||||
|                                tabulated-list-mode-map)) | ||||
|     (define-key map (kbd "RET") 'guix-list-describe) | ||||
|     (define-key map (kbd "i")   '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) | ||||
|   "Keymap for `guix-list-mode' buffers.") | ||||
| 
 | ||||
| (define-derived-mode guix-list-mode tabulated-list-mode "Guix-List" | ||||
|   "Parent mode for displaying data in 'list' form.") | ||||
| 
 | ||||
| (defun guix-list-mode-initialize (entry-type) | ||||
|   "Set up the current 'list' buffer for displaying ENTRY-TYPE entries." | ||||
|   (setq tabulated-list-padding  2 | ||||
|         tabulated-list-format   (guix-list-tabulated-format entry-type) | ||||
|         tabulated-list-sort-key (guix-list-tabulated-sort-key entry-type)) | ||||
|   (setq-local guix-list-marks   (guix-list-marks entry-type)) | ||||
|   (tabulated-list-init-header)) | ||||
| 
 | ||||
| (defmacro guix-list-define-interface (entry-type &rest args) | ||||
|   "Define 'list' interface for displaying ENTRY-TYPE entries. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| Required keywords: | ||||
| 
 | ||||
|   - `:format' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-list-format' variable. | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:sort-key' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-list-sort-key' variable. | ||||
| 
 | ||||
|   - `:describe-function' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-describe-function' variable. | ||||
| 
 | ||||
|   - `:list-single?' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-list-single' variable. | ||||
| 
 | ||||
|   - `:marks' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-list-marks' variable. | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-buffer-define-interface' macro." | ||||
|   (declare (indent 1)) | ||||
|   (let* ((entry-type-str     (symbol-name entry-type)) | ||||
|          (prefix             (concat "guix-" entry-type-str "-list")) | ||||
|          (group              (intern prefix)) | ||||
|          (describe-var       (intern (concat prefix "-describe-function"))) | ||||
|          (describe-count-var (intern (concat prefix | ||||
|                                              "-describe-warning-count"))) | ||||
|          (format-var         (intern (concat prefix "-format"))) | ||||
|          (sort-key-var       (intern (concat prefix "-sort-key"))) | ||||
|          (list-single-var    (intern (concat prefix "-single"))) | ||||
|          (marks-var          (intern (concat prefix "-marks")))) | ||||
|     (guix-keyword-args-let args | ||||
|         ((show-entries-val   :show-entries-function) | ||||
|          (describe-val       :describe-function) | ||||
|          (describe-count-val :describe-count 10) | ||||
|          (format-val         :format) | ||||
|          (sort-key-val       :sort-key) | ||||
|          (list-single-val    :list-single?) | ||||
|          (marks-val          :marks)) | ||||
|       `(progn | ||||
|          (defcustom ,format-var ,format-val | ||||
|            ,(format "\ | ||||
| List of format values of the displayed columns. | ||||
| Each element of the list has a form: | ||||
| 
 | ||||
|   (PARAM VALUE-FUN WIDTH SORT . PROPS) | ||||
| 
 | ||||
| PARAM is a name of '%s' entry parameter. | ||||
| 
 | ||||
| VALUE-FUN may be either nil or 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 one is an | ||||
| entry (alist of parameter names and values). | ||||
| 
 | ||||
| For the meaning of WIDTH, SORT and PROPS, see | ||||
| `tabulated-list-format'." | ||||
|                     entry-type-str) | ||||
|            :type 'sexp | ||||
|            :group ',group) | ||||
| 
 | ||||
|          (defcustom ,sort-key-var ,sort-key-val | ||||
|            ,(format "\ | ||||
| Default sort key for 'list' buffer with '%s' entries. | ||||
| Should be nil (no sort) or have a form: | ||||
| 
 | ||||
|   (PARAM . FLIP) | ||||
| 
 | ||||
| PARAM is the name of '%s' entry parameter.  For the meaning of | ||||
| FLIP, see `tabulated-list-sort-key'." | ||||
|                     entry-type-str entry-type-str) | ||||
|            :type '(choice (const :tag "No sort" nil) | ||||
|                           (cons symbol boolean)) | ||||
|            :group ',group) | ||||
| 
 | ||||
|          (defvar ,marks-var ,marks-val | ||||
|            ,(format "\ | ||||
| Alist of additional marks for 'list' buffer with '%s' entries. | ||||
| Marks from this list are used along with `guix-list-default-marks'." | ||||
|                     entry-type-str)) | ||||
| 
 | ||||
|          (defcustom ,list-single-var ,list-single-val | ||||
|            ,(format "\ | ||||
| If non-nil, list '%s' entry even if it is the only matching result. | ||||
| If nil, show a single '%s' entry in the 'info' buffer." | ||||
|                     entry-type-str entry-type-str) | ||||
|            :type 'boolean | ||||
|            :group ',group) | ||||
| 
 | ||||
|          (defcustom ,describe-count-var ,describe-count-val | ||||
|            ,(format "\ | ||||
| The maximum number of '%s' entries to describe without a warning. | ||||
| If a user wants to describe more than this number of marked | ||||
| entries, he will be prompted for confirmation. | ||||
| See also `guix-list-describe'." | ||||
|                     entry-type-str) | ||||
|            :type 'integer | ||||
|            :group ',group) | ||||
| 
 | ||||
|          (defvar ,describe-var ,describe-val | ||||
|            ,(format "Function used to describe '%s' entries." | ||||
|                     entry-type-str)) | ||||
| 
 | ||||
|          (guix-alist-put! | ||||
|           '((describe       . ,describe-var) | ||||
|             (describe-count . ,describe-count-var) | ||||
|             (format         . ,format-var) | ||||
|             (sort-key       . ,sort-key-var) | ||||
|             (list-single    . ,list-single-var) | ||||
|             (marks          . ,marks-var)) | ||||
|           'guix-list-data ',entry-type) | ||||
| 
 | ||||
|          ,(if show-entries-val | ||||
|               `(guix-buffer-define-interface list ,entry-type | ||||
|                  :show-entries-function ,show-entries-val | ||||
|                  ,@%foreign-args) | ||||
| 
 | ||||
|             (let ((insert-fun    (intern (concat prefix "-insert-entries"))) | ||||
|                   (mode-init-fun (intern (concat prefix "-mode-initialize")))) | ||||
|               `(progn | ||||
|                  (defun ,insert-fun (entries) | ||||
|                    ,(format "\ | ||||
| Print '%s' ENTRIES in the current 'list' buffer." | ||||
|                             entry-type-str) | ||||
|                    (guix-list-insert-entries entries ',entry-type)) | ||||
| 
 | ||||
|                  (defun ,mode-init-fun () | ||||
|                    ,(format "\ | ||||
| Set up the current 'list' buffer for displaying '%s' entries." | ||||
|                             entry-type-str) | ||||
|                    (guix-list-mode-initialize ',entry-type)) | ||||
| 
 | ||||
|                  (guix-buffer-define-interface list ,entry-type | ||||
|                    :insert-entries-function ',insert-fun | ||||
|                    :mode-init-function ',mode-init-fun | ||||
|                    ,@%foreign-args)))))))) | ||||
| 
 | ||||
|  | ||||
| (defvar guix-list-font-lock-keywords | ||||
|   (eval-when-compile | ||||
|     `((,(rx "(" (group "guix-list-define-interface") | ||||
|             symbol-end) | ||||
|        . 1)))) | ||||
| 
 | ||||
| (font-lock-add-keywords 'emacs-lisp-mode guix-list-font-lock-keywords) | ||||
| 
 | ||||
| (provide 'guix-list) | ||||
| 
 | ||||
| ;;; guix-list.el ends here | ||||
|  | @ -1,79 +0,0 @@ | |||
| ;;; guix-location.el --- Package locations | ||||
| 
 | ||||
| ;; Copyright © 2016 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 Location as published by | ||||
| ;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details. | ||||
| 
 | ||||
| ;; You should have received a copy of the GNU General Public Location | ||||
| ;; along with this program.  If not, see <http://www.gnu.org/locations/>. | ||||
| 
 | ||||
| ;;; Commentary: | ||||
| 
 | ||||
| ;; This file provides the code to work with locations of Guix packages. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-backend) | ||||
| (require 'guix-read) | ||||
| (require 'guix-guile) | ||||
| 
 | ||||
| (defun guix-package-location (id-or-name) | ||||
|   "Return location of a package with ID-OR-NAME. | ||||
| For the meaning of location, see `guix-find-location'." | ||||
|   (guix-eval-read (guix-make-guile-expression | ||||
|                    'package-location-string id-or-name))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-find-location (location &optional directory) | ||||
|   "Go to LOCATION of a package. | ||||
| LOCATION is a string of the form: | ||||
| 
 | ||||
|   \"FILE:LINE:COLUMN\" | ||||
| 
 | ||||
| If FILE is relative, it is considered to be relative to | ||||
| DIRECTORY (`guix-directory' by default). | ||||
| 
 | ||||
| Interactively, prompt for LOCATION.  With prefix argument, prompt | ||||
| for DIRECTORY as well." | ||||
|   (interactive | ||||
|    (list (guix-read-package-location) | ||||
|          (guix-read-directory))) | ||||
|   (cl-multiple-value-bind (file line column) | ||||
|       (split-string location ":") | ||||
|     (find-file (expand-file-name file (or directory guix-directory))) | ||||
|     (when (and line column) | ||||
|       (let ((line   (string-to-number line)) | ||||
|             (column (string-to-number column))) | ||||
|         (goto-char (point-min)) | ||||
|         (forward-line (- line 1)) | ||||
|         (move-to-column column) | ||||
|         (recenter 1))))) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-edit (id-or-name &optional directory) | ||||
|   "Edit (go to location of) package with ID-OR-NAME. | ||||
| See `guix-find-location' for the meaning of package location and | ||||
| DIRECTORY. | ||||
| Interactively, with prefix argument, prompt for DIRECTORY." | ||||
|   (interactive | ||||
|    (list (guix-read-package-name) | ||||
|          (guix-read-directory))) | ||||
|   (let ((loc (guix-package-location id-or-name))) | ||||
|     (if loc | ||||
|         (guix-find-location loc directory) | ||||
|       (message "Couldn't find package location.")))) | ||||
| 
 | ||||
| (provide 'guix-location) | ||||
| 
 | ||||
| ;;; guix-location.el ends here | ||||
							
								
								
									
										1163
									
								
								emacs/guix-main.scm
									
										
									
									
									
								
							
							
						
						
									
										1163
									
								
								emacs/guix-main.scm
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,247 +0,0 @@ | |||
| ;;; 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 | ||||
|       ,(lambda (_ entries ids) | ||||
|          (guix-message-packages-by-id entries 'package ids))) | ||||
|      (name | ||||
|       ,(lambda (_ entries names) | ||||
|          (guix-message-packages-by-name entries 'package names))) | ||||
|      (license | ||||
|       ,(lambda (_ entries licenses) | ||||
|          (apply #'guix-message-packages-by-license | ||||
|                 entries 'package licenses))) | ||||
|      (location | ||||
|       ,(lambda (_ entries locations) | ||||
|          (apply #'guix-message-packages-by-location | ||||
|                 entries 'package locations))) | ||||
|      (from-file | ||||
|       (0 "No package in file '%s'." val) | ||||
|       (1 "Package from file '%s'." val)) | ||||
|      (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))) | ||||
| 
 | ||||
|     (output | ||||
|      (id | ||||
|       ,(lambda (_ entries ids) | ||||
|          (guix-message-packages-by-id entries 'output ids))) | ||||
|      (name | ||||
|       ,(lambda (_ entries names) | ||||
|          (guix-message-packages-by-name entries 'output names))) | ||||
|      (license | ||||
|       ,(lambda (_ entries licenses) | ||||
|          (apply #'guix-message-packages-by-license | ||||
|                 entries 'output licenses))) | ||||
|      (location | ||||
|       ,(lambda (_ entries locations) | ||||
|          (apply #'guix-message-packages-by-location | ||||
|                 entries 'output locations))) | ||||
|      (from-file | ||||
|       (0 "No package in file '%s'." val) | ||||
|       (1 "Package from file '%s'." val) | ||||
|       (many "Package outputs from file '%s'." val)) | ||||
|      (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)) | ||||
|      (profile-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-id (entries entry-type ids) | ||||
|   "Display a message for packages or outputs searched by IDS." | ||||
|   (let* ((count (length entries)) | ||||
|          (str-beg (guix-message-string-entries count entry-type)) | ||||
|          (str-end (if (> count 1) | ||||
|                       (concat "with the following IDs: " | ||||
|                               (mapconcat #'guix-get-string ids ", ")) | ||||
|                     (concat "with ID " (guix-get-string (car ids)))))) | ||||
|     (if (zerop count) | ||||
|         (message "%s %s. | ||||
| Most likely, Guix REPL was restarted, so IDs are not actual | ||||
| anymore, because they live only during the REPL process. | ||||
| Try \"M-x guix-search-by-name\"." | ||||
|                  str-beg str-end) | ||||
|       (message "%s %s." str-beg str-end)))) | ||||
| 
 | ||||
| (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-packages-by-license (entries entry-type license) | ||||
|   "Display a message for packages or outputs searched by LICENSE." | ||||
|   (let* ((count (length entries)) | ||||
|          (str-beg (guix-message-string-entries count entry-type)) | ||||
|          (str-end (format "with license '%s'" license))) | ||||
|     (message "%s %s." str-beg str-end))) | ||||
| 
 | ||||
| (defun guix-message-packages-by-location (entries entry-type location) | ||||
|   "Display a message for packages or outputs searched by LOCATION." | ||||
|   (let* ((count   (length entries)) | ||||
|          (str-beg (guix-message-string-entries count entry-type)) | ||||
|          (str-end (format "placed in '%s'" location))) | ||||
|     (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 (_ entries profiles) | ||||
|   "Display a message for outputs searched by PROFILES difference." | ||||
|   (let* ((count (length entries)) | ||||
|          (str-beg (guix-message-string-entries count 'output)) | ||||
|          (profile1 (car  profiles)) | ||||
|          (profile2 (cadr profiles))) | ||||
|     (cl-multiple-value-bind (new old str-action) | ||||
|         (if (string-lessp profile2 profile1) | ||||
|             (list profile1 profile2 "added to") | ||||
|           (list profile2 profile1 "removed from")) | ||||
|       (message "%s %s profile '%s' comparing with profile '%s'." | ||||
|                str-beg str-action new old)))) | ||||
| 
 | ||||
| (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 | ||||
|                                      (if (eq entry-type 'system-generation) | ||||
|                                          'generation | ||||
|                                        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 | ||||
|  | @ -1,370 +0,0 @@ | |||
| ;;; 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")) | ||||
| 
 | ||||
| (guix-memoized-defun guix-pcomplete-refresh-updaters () | ||||
|   "Return a list of all available refresh updater types." | ||||
|   (guix-pcomplete-run-guix-and-search | ||||
|    guix-help-parse-list-regexp | ||||
|    guix-help-parse-regexp-group | ||||
|    "refresh" "--list-updaters")) | ||||
| 
 | ||||
|  | ||||
| ;;; 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" "challenge" "edit" "environment" | ||||
|               "graph" "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))) | ||||
|        ((or (option? "-f" "--install-from-file") | ||||
|             (option? "-m" "--manifest")) | ||||
|         (complete* (pcomplete-entries))))) | ||||
| 
 | ||||
|      ((and (command? "archive" "build" "size") | ||||
|            (option? "-s" "--system")) | ||||
|       (complete* guix-help-system-types)) | ||||
| 
 | ||||
|      ((and (command? "build") | ||||
|            (or (option? "-f" "--file") | ||||
|                (option? "-r" "--root") | ||||
|                (string= "--with-source" option))) | ||||
|       (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))) | ||||
| 
 | ||||
|      ((command? "refresh") | ||||
|       (cond | ||||
|        ((option? "-s" "--select") | ||||
|         (complete* guix-help-refresh-subsets)) | ||||
|        ((option? "-t" "--type") | ||||
|         (guix-pcomplete-complete-comma-args | ||||
|          (guix-pcomplete-refresh-updaters))))) | ||||
| 
 | ||||
|      ((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 | ||||
|  | @ -1,48 +0,0 @@ | |||
| ;;; 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 | ||||
|  | @ -1,210 +0,0 @@ | |||
| ;;; 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 | ||||
|  | @ -1,77 +0,0 @@ | |||
| ;;; guix-profiles.el --- Guix profiles | ||||
| 
 | ||||
| ;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com> | ||||
| ;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.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/>. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'guix-config) | ||||
| 
 | ||||
| (defvar guix-user-profile | ||||
|   (expand-file-name "~/.guix-profile") | ||||
|   "User profile.") | ||||
| 
 | ||||
| (defvar guix-system-profile | ||||
|   (concat guix-config-state-directory "/profiles/system") | ||||
|   "System 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.") | ||||
| 
 | ||||
| (defvar guix-system-profile-regexp | ||||
|   (concat "\\`" (regexp-quote guix-system-profile)) | ||||
|   "Regexp matching system profiles.") | ||||
| 
 | ||||
| (defun guix-system-profile? (profile) | ||||
|   "Return non-nil, if PROFILE is a system one." | ||||
|   (string-match-p guix-system-profile-regexp 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 | ||||
|  | @ -1,147 +0,0 @@ | |||
| ;;; guix-read.el --- Minibuffer readers | ||||
| 
 | ||||
| ;; Copyright © 2015, 2016 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-backend) | ||||
| (require 'guix-guile) | ||||
| 
 | ||||
|  | ||||
| ;;; Receivable lists of packages, lint checkers, etc. | ||||
| 
 | ||||
| (guix-memoized-defun guix-graph-type-names () | ||||
|   "Return a list of names of available graph node types." | ||||
|   (guix-eval-read (guix-make-guile-expression 'graph-type-names))) | ||||
| 
 | ||||
| (guix-memoized-defun guix-refresh-updater-names () | ||||
|   "Return a list of names of available refresh updater types." | ||||
|   (guix-eval-read (guix-make-guile-expression 'refresh-updater-names))) | ||||
| 
 | ||||
| (guix-memoized-defun guix-lint-checker-names () | ||||
|   "Return a list of names of available lint checkers." | ||||
|   (guix-eval-read (guix-make-guile-expression 'lint-checker-names))) | ||||
| 
 | ||||
| (guix-memoized-defun guix-package-names () | ||||
|   "Return a list of names of available packages." | ||||
|   (sort | ||||
|    ;; Work around <https://github.com/jaor/geiser/issues/64>: | ||||
|    ;; list of strings is parsed much slower than list of lists, | ||||
|    ;; so we use 'package-names-lists' instead of 'package-names'. | ||||
| 
 | ||||
|    ;; (guix-eval-read (guix-make-guile-expression 'package-names)) | ||||
| 
 | ||||
|    (mapcar #'car | ||||
|            (guix-eval-read (guix-make-guile-expression | ||||
|                             'package-names-lists))) | ||||
|    #'string<)) | ||||
| 
 | ||||
| (guix-memoized-defun guix-license-names () | ||||
|   "Return a list of names of available licenses." | ||||
|   (guix-eval-read (guix-make-guile-expression 'license-names))) | ||||
| 
 | ||||
| (guix-memoized-defun guix-package-locations () | ||||
|   "Return a list of available package locations." | ||||
|   (sort (guix-eval-read (guix-make-guile-expression | ||||
|                          'package-location-files)) | ||||
|         #'string<)) | ||||
| 
 | ||||
|  | ||||
| ;;; Readers | ||||
| 
 | ||||
| (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-getter guix-refresh-updater-names | ||||
|  :multiple-reader guix-read-refresh-updater-names | ||||
|  :multiple-prompt "Refresh updater,s: " | ||||
|  :multiple-separator ",") | ||||
| 
 | ||||
| (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 " ") | ||||
| 
 | ||||
| (guix-define-readers | ||||
|  :completions-getter guix-license-names | ||||
|  :single-reader guix-read-license-name | ||||
|  :single-prompt "License: ") | ||||
| 
 | ||||
| (guix-define-readers | ||||
|  :completions-getter guix-package-locations | ||||
|  :single-reader guix-read-package-location | ||||
|  :single-prompt "Location: ") | ||||
| 
 | ||||
| (provide 'guix-read) | ||||
| 
 | ||||
| ;;; guix-read.el ends here | ||||
|  | @ -1,456 +0,0 @@ | |||
| ;;; guix-ui-generation.el --- Interface for displaying generations  -*- lexical-binding: t -*- | ||||
| 
 | ||||
| ;; Copyright © 2014, 2015, 2016 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 an interface for displaying profile generations in | ||||
| ;; 'list' and 'info' buffers, and commands for working with them. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-list) | ||||
| (require 'guix-info) | ||||
| (require 'guix-ui) | ||||
| (require 'guix-ui-package) | ||||
| (require 'guix-base) | ||||
| (require 'guix-backend) | ||||
| (require 'guix-guile) | ||||
| (require 'guix-entry) | ||||
| (require 'guix-utils) | ||||
| (require 'guix-profiles) | ||||
| 
 | ||||
| (guix-ui-define-entry-type generation) | ||||
| 
 | ||||
| (defun guix-generation-get-display (profile search-type &rest search-values) | ||||
|   "Search for generations and show results. | ||||
| 
 | ||||
| If PROFILE is nil, use `guix-current-profile'. | ||||
| 
 | ||||
| See `guix-ui-get-entries' for the meaning of SEARCH-TYPE and | ||||
| SEARCH-VALUES." | ||||
|   (apply #'guix-list-get-display-entries | ||||
|          'generation | ||||
|          (or profile guix-current-profile) | ||||
|          search-type search-values)) | ||||
| 
 | ||||
| (defun guix-delete-generations (profile generations | ||||
|                                 &optional operation-buffer) | ||||
|   "Delete GENERATIONS from PROFILE. | ||||
| Each element from GENERATIONS is a generation number." | ||||
|   (when (or (not guix-operation-confirm) | ||||
|             (y-or-n-p | ||||
|              (let ((count (length generations))) | ||||
|                (if (> count 1) | ||||
|                    (format "Delete %d generations from profile '%s'? " | ||||
|                            count profile) | ||||
|                  (format "Delete generation %d from profile '%s'? " | ||||
|                          (car generations) profile))))) | ||||
|     (guix-eval-in-repl | ||||
|      (guix-make-guile-expression | ||||
|       'delete-generations* profile generations) | ||||
|      operation-buffer))) | ||||
| 
 | ||||
| (defun guix-switch-to-generation (profile generation | ||||
|                                   &optional operation-buffer) | ||||
|   "Switch PROFILE to GENERATION." | ||||
|   (when (or (not guix-operation-confirm) | ||||
|             (y-or-n-p (format "Switch profile '%s' to generation %d? " | ||||
|                               profile generation))) | ||||
|     (guix-eval-in-repl | ||||
|      (guix-make-guile-expression | ||||
|       'switch-to-generation* profile generation) | ||||
|      operation-buffer))) | ||||
| 
 | ||||
| (defun guix-system-generation? () | ||||
|   "Return non-nil, if current generation is a system one." | ||||
|   (eq (guix-buffer-current-entry-type) | ||||
|       'system-generation)) | ||||
| 
 | ||||
| (defun guix-generation-current-packages-profile (&optional generation) | ||||
|   "Return a directory where packages are installed for the | ||||
| current profile's GENERATION." | ||||
|   (guix-packages-profile (guix-ui-current-profile) | ||||
|                          generation | ||||
|                          (guix-system-generation?))) | ||||
| 
 | ||||
|  | ||||
| ;;; Generation 'info' | ||||
| 
 | ||||
| (guix-ui-info-define-interface generation | ||||
|   :buffer-name "*Guix Generation Info*" | ||||
|   :format '((number format guix-generation-info-insert-number) | ||||
|             (prev-number format (format)) | ||||
|             (current format guix-generation-info-insert-current) | ||||
|             (path simple (indent guix-file)) | ||||
|             (time format (time))) | ||||
|   :titles '((path . "File name") | ||||
|             (prev-number . "Previous number"))) | ||||
| 
 | ||||
| (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) | ||||
| 
 | ||||
| (defun guix-generation-info-insert-number (number &optional _) | ||||
|   "Insert generation NUMBER and action buttons." | ||||
|   (guix-info-insert-value-format number 'guix-generation-info-number) | ||||
|   (guix-info-insert-indent) | ||||
|   (guix-info-insert-action-button | ||||
|    "Packages" | ||||
|    (lambda (btn) | ||||
|      (guix-buffer-get-display-entries | ||||
|       'list guix-package-list-type | ||||
|       (list (guix-generation-current-packages-profile | ||||
|              (button-get btn 'number)) | ||||
|             'installed) | ||||
|       'add)) | ||||
|    "Show installed packages for this generation" | ||||
|    'number number) | ||||
|   (guix-info-insert-indent) | ||||
|   (guix-info-insert-action-button | ||||
|    "Delete" | ||||
|    (lambda (btn) | ||||
|      (guix-delete-generations (guix-ui-current-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-value-format "Yes" 'guix-generation-info-current) | ||||
|     (guix-info-insert-value-format "No" 'guix-generation-info-not-current) | ||||
|     (guix-info-insert-indent) | ||||
|     (guix-info-insert-action-button | ||||
|      "Switch" | ||||
|      (lambda (btn) | ||||
|        (guix-switch-to-generation (guix-ui-current-profile) | ||||
|                                   (button-get btn 'number) | ||||
|                                   (current-buffer))) | ||||
|      "Switch to this generation (make it the current one)" | ||||
|      'number (guix-entry-value entry 'number)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Generation 'list' | ||||
| 
 | ||||
| (guix-ui-list-define-interface generation | ||||
|   :buffer-name "*Guix Generation List*" | ||||
|   :format '((number nil 5 guix-list-sort-numerically-0 :right-align t) | ||||
|             (current guix-generation-list-get-current 10 t) | ||||
|             (time guix-list-get-time 20 t) | ||||
|             (path guix-list-get-file-name 30 t)) | ||||
|   :titles '((number . "N.")) | ||||
|   :sort-key '(number . 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 "s")   'guix-generation-list-switch) | ||||
|   (define-key map (kbd "c")   '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-entry-value entry 'current)) | ||||
|          (number  (guix-entry-value entry 'number))) | ||||
|     (if current | ||||
|         (user-error "This generation is already the current one") | ||||
|       (guix-switch-to-generation (guix-ui-current-profile) | ||||
|                                  number (current-buffer))))) | ||||
| 
 | ||||
| (defun guix-generation-list-show-packages () | ||||
|   "List installed packages for the generation at point." | ||||
|   (interactive) | ||||
|   (guix-package-get-display | ||||
|    (guix-generation-current-packages-profile (guix-list-current-id)) | ||||
|    'installed)) | ||||
| 
 | ||||
| (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-profiles-to-compare () | ||||
|   "Return a sorted list of 2 marked generation profiles for comparing." | ||||
|   (mapcar #'guix-generation-current-packages-profile | ||||
|           (guix-generation-list-generations-to-compare))) | ||||
| 
 | ||||
| (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) | ||||
|   (guix-buffer-get-display-entries | ||||
|    'list 'output | ||||
|    (cl-list* (guix-ui-current-profile) | ||||
|              'profile-diff | ||||
|              (reverse (guix-generation-list-profiles-to-compare))) | ||||
|    'add)) | ||||
| 
 | ||||
| (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) | ||||
|   (guix-buffer-get-display-entries | ||||
|    'list 'output | ||||
|    (cl-list* (guix-ui-current-profile) | ||||
|              'profile-diff | ||||
|              (guix-generation-list-profiles-to-compare)) | ||||
|    'add)) | ||||
| 
 | ||||
| (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-ui-current-profile) | ||||
|                              marked (current-buffer)))) | ||||
| 
 | ||||
|  | ||||
| ;;; Inserting packages to compare generations | ||||
| 
 | ||||
| (defcustom guix-generation-packages-buffer-name-function | ||||
|   #'guix-generation-packages-buffer-name-default | ||||
|   "Function used to define name of a buffer with generation packages. | ||||
| This function is called with 2 arguments: PROFILE (string) and | ||||
| GENERATION (number)." | ||||
|   :type '(choice (function-item guix-generation-packages-buffer-name-default) | ||||
|                  (function-item guix-generation-packages-buffer-name-long) | ||||
|                  (function :tag "Other function")) | ||||
|   :group 'guix-generation) | ||||
| 
 | ||||
| (defcustom guix-generation-packages-update-buffer t | ||||
|   "If non-nil, always update list of packages during comparing generations. | ||||
| If nil, generation packages are received only once.  So when you | ||||
| compare generation 1 and generation 2, the packages for both | ||||
| generations will be received.  Then if you compare generation 1 | ||||
| and generation 3, only the packages for generation 3 will be | ||||
| received.  Thus if you use comparing of different generations a | ||||
| lot, you may set this variable to nil to improve the | ||||
| performance." | ||||
|   :type 'boolean | ||||
|   :group 'guix-generation) | ||||
| 
 | ||||
| (defvar guix-generation-output-name-width 30 | ||||
|   "Width of an output name \"column\". | ||||
| This variable is used in auxiliary buffers for comparing generations.") | ||||
| 
 | ||||
| (defun guix-generation-packages (profile) | ||||
|   "Return a list of sorted packages installed in PROFILE. | ||||
| Each element of the list is a list of the package specification | ||||
| and its store path." | ||||
|   (let ((names+paths (guix-eval-read | ||||
|                       (guix-make-guile-expression | ||||
|                        'profile->specifications+paths profile)))) | ||||
|     (sort names+paths | ||||
|           (lambda (a b) | ||||
|             (string< (car a) (car b)))))) | ||||
| 
 | ||||
| (defun guix-generation-packages-buffer-name-default (profile generation) | ||||
|   "Return name of a buffer for displaying GENERATION's package outputs. | ||||
| Use base name of PROFILE file name." | ||||
|   (let ((profile-name (file-name-base (directory-file-name profile)))) | ||||
|     (format "*Guix %s: generation %s*" | ||||
|             profile-name generation))) | ||||
| 
 | ||||
| (defun guix-generation-packages-buffer-name-long (profile generation) | ||||
|   "Return name of a buffer for displaying GENERATION's package outputs. | ||||
| Use the full PROFILE file name." | ||||
|   (format "*Guix generation %s (%s)*" | ||||
|           generation profile)) | ||||
| 
 | ||||
| (defun guix-generation-packages-buffer-name (profile generation) | ||||
|   "Return name of a buffer for displaying GENERATION's package outputs." | ||||
|   (funcall guix-generation-packages-buffer-name-function | ||||
|            profile generation)) | ||||
| 
 | ||||
| (defun guix-generation-insert-package (name path) | ||||
|   "Insert package output NAME and store PATH at point." | ||||
|   (insert name) | ||||
|   (indent-to guix-generation-output-name-width 2) | ||||
|   (insert path "\n")) | ||||
| 
 | ||||
| (defun guix-generation-insert-packages (buffer profile) | ||||
|   "Insert package outputs installed in PROFILE in BUFFER." | ||||
|   (with-current-buffer buffer | ||||
|     (setq buffer-read-only nil | ||||
|           indent-tabs-mode nil) | ||||
|     (erase-buffer) | ||||
|     (mapc (lambda (name+path) | ||||
|             (guix-generation-insert-package | ||||
|              (car name+path) (cadr name+path))) | ||||
|           (guix-generation-packages profile)))) | ||||
| 
 | ||||
| (defun guix-generation-packages-buffer (profile generation &optional system?) | ||||
|   "Return buffer with package outputs installed in PROFILE's GENERATION. | ||||
| Create the buffer if needed." | ||||
|   (let ((buf-name (guix-generation-packages-buffer-name | ||||
|                    profile generation))) | ||||
|     (or (and (null guix-generation-packages-update-buffer) | ||||
|              (get-buffer buf-name)) | ||||
|         (let ((buf (get-buffer-create buf-name))) | ||||
|           (guix-generation-insert-packages | ||||
|            buf | ||||
|            (guix-packages-profile profile generation system?)) | ||||
|           buf)))) | ||||
| 
 | ||||
| (defun guix-profile-generation-manifest-file (generation) | ||||
|   "Return the file name of a GENERATION's manifest. | ||||
| GENERATION is a generation number of the current profile." | ||||
|   (guix-manifest-file (guix-ui-current-profile) | ||||
|                       generation | ||||
|                       (guix-system-generation?))) | ||||
| 
 | ||||
| (defun guix-profile-generation-packages-buffer (generation) | ||||
|   "Insert GENERATION's package outputs in a buffer and return it. | ||||
| GENERATION is a generation number of the current profile." | ||||
|   (guix-generation-packages-buffer (guix-ui-current-profile) | ||||
|                                    generation | ||||
|                                    (guix-system-generation?))) | ||||
| 
 | ||||
|  | ||||
| ;;; Interactive commands | ||||
| 
 | ||||
| ;;;###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 (guix-ui-read-profile))) | ||||
|   (guix-generation-get-display 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: ") | ||||
|          (guix-ui-read-profile))) | ||||
|   (guix-generation-get-display 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): ") | ||||
|          (guix-ui-read-profile))) | ||||
|   (guix-generation-get-display profile 'time | ||||
|                                (float-time from) | ||||
|                                (float-time to))) | ||||
| 
 | ||||
| (provide 'guix-ui-generation) | ||||
| 
 | ||||
| ;;; guix-ui-generation.el ends here | ||||
|  | @ -1,150 +0,0 @@ | |||
| ;;; guix-ui-license.el --- Interface for displaying licenses | ||||
| 
 | ||||
| ;; Copyright © 2016 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 'list'/'info' interface for displaying licenses of | ||||
| ;; Guix packages. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-list) | ||||
| (require 'guix-info) | ||||
| (require 'guix-backend) | ||||
| (require 'guix-guile) | ||||
| (require 'guix-license) | ||||
| 
 | ||||
| (guix-define-entry-type license) | ||||
| 
 | ||||
| (defun guix-license-get-entries (search-type &rest args) | ||||
|   "Receive 'license' entries. | ||||
| SEARCH-TYPE may be one of the following symbols: `all', `id', `name'." | ||||
|   (guix-eval-read | ||||
|    (apply #'guix-make-guile-expression | ||||
|           'license-entries search-type args))) | ||||
| 
 | ||||
| (defun guix-license-get-display (search-type &rest args) | ||||
|   "Search for licenses and show results." | ||||
|   (apply #'guix-list-get-display-entries | ||||
|          'license search-type args)) | ||||
| 
 | ||||
| (defun guix-license-message (entries search-type &rest args) | ||||
|   "Display a message after showing license ENTRIES." | ||||
|   ;; Some objects in (guix licenses) module are procedures (e.g., | ||||
|   ;; 'non-copyleft' or 'x11-style').  Such licenses cannot be "described". | ||||
|   (when (null entries) | ||||
|     (if (cdr args) | ||||
|         (message "Unknown licenses.") | ||||
|       (message "Unknown license.")))) | ||||
| 
 | ||||
|  | ||||
| ;;; License 'info' | ||||
| 
 | ||||
| (guix-info-define-interface license | ||||
|   :buffer-name "*Guix License Info*" | ||||
|   :get-entries-function 'guix-license-get-entries | ||||
|   :message-function 'guix-license-message | ||||
|   :format '((name ignore (simple guix-info-heading)) | ||||
|             ignore | ||||
|             guix-license-insert-packages-button | ||||
|             (url ignore (simple guix-url)) | ||||
|             guix-license-insert-comment | ||||
|             ignore | ||||
|             guix-license-insert-file) | ||||
|   :titles '((url . "URL"))) | ||||
| 
 | ||||
| (declare-function guix-packages-by-license "guix-ui-package") | ||||
| 
 | ||||
| (defun guix-license-insert-packages-button (entry) | ||||
|   "Insert button to display packages by license ENTRY." | ||||
|   (let ((license (guix-entry-value entry 'name))) | ||||
|     (guix-info-insert-action-button | ||||
|      "Packages" | ||||
|      (lambda (btn) | ||||
|        (guix-packages-by-license (button-get btn 'license))) | ||||
|      (format "Display packages with license '%s'" license) | ||||
|      'license license))) | ||||
| 
 | ||||
| (defun guix-license-insert-comment (entry) | ||||
|   "Insert 'comment' of a license ENTRY." | ||||
|   (let ((comment (guix-entry-value entry 'comment))) | ||||
|     (if (and comment | ||||
|              (string-match-p "^http" comment)) | ||||
|         (guix-info-insert-value-simple comment 'guix-url) | ||||
|       (guix-info-insert-title-simple | ||||
|        (guix-info-param-title 'license 'comment)) | ||||
|       (guix-info-insert-value-indent comment)))) | ||||
| 
 | ||||
| (defun guix-license-insert-file (entry) | ||||
|   "Insert button to open license definition." | ||||
|   (let ((license (guix-entry-value entry 'name))) | ||||
|     (guix-insert-button | ||||
|      (guix-license-file) 'guix-file | ||||
|      'help-echo (format "Open definition of license '%s'" license) | ||||
|      'action (lambda (btn) | ||||
|                (guix-find-license-definition (button-get btn 'license))) | ||||
|      'license license))) | ||||
| 
 | ||||
|  | ||||
| ;;; License 'list' | ||||
| 
 | ||||
| (guix-list-define-interface license | ||||
|   :buffer-name "*Guix Licenses*" | ||||
|   :get-entries-function 'guix-license-get-entries | ||||
|   :describe-function 'guix-license-list-describe | ||||
|   :message-function 'guix-license-message | ||||
|   :format '((name nil 40 t) | ||||
|             (url guix-list-get-url 50 t)) | ||||
|   :titles '((name . "License")) | ||||
|   :sort-key '(name)) | ||||
| 
 | ||||
| (let ((map guix-license-list-mode-map)) | ||||
|   (define-key map (kbd "e")   'guix-license-list-edit) | ||||
|   (define-key map (kbd "RET") 'guix-license-list-show-packages)) | ||||
| 
 | ||||
| (defun guix-license-list-describe (ids) | ||||
|   "Describe licenses with IDS (list of identifiers)." | ||||
|   (guix-buffer-display-entries | ||||
|    (guix-entries-by-ids ids (guix-buffer-current-entries)) | ||||
|    'info 'license (cl-list* 'id ids) 'add)) | ||||
| 
 | ||||
| (defun guix-license-list-show-packages () | ||||
|   "Display packages with the license at point." | ||||
|   (interactive) | ||||
|   (guix-packages-by-license (guix-list-current-id))) | ||||
| 
 | ||||
| (defun guix-license-list-edit (&optional directory) | ||||
|   "Go to the location of the current license definition. | ||||
| See `guix-license-file' for the meaning of DIRECTORY." | ||||
|   (interactive (list (guix-read-directory))) | ||||
|   (guix-find-license-definition (guix-list-current-id) directory)) | ||||
| 
 | ||||
|  | ||||
| ;;; Interactive commands | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-licenses () | ||||
|   "Display licenses of the Guix packages." | ||||
|   (interactive) | ||||
|   (guix-license-get-display 'all)) | ||||
| 
 | ||||
| (provide 'guix-ui-license) | ||||
| 
 | ||||
| ;;; guix-ui-license.el ends here | ||||
|  | @ -1,83 +0,0 @@ | |||
| ;;; guix-ui-location.el --- Interface for displaying package locations | ||||
| 
 | ||||
| ;; Copyright © 2016 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 Location as published by | ||||
| ;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details. | ||||
| 
 | ||||
| ;; You should have received a copy of the GNU General Public Location | ||||
| ;; along with this program.  If not, see <http://www.gnu.org/locations/>. | ||||
| 
 | ||||
| ;;; Commentary: | ||||
| 
 | ||||
| ;; This file provides a 'list' interface for displaying locations of Guix | ||||
| ;; packages. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-list) | ||||
| (require 'guix-location) | ||||
| (require 'guix-backend) | ||||
| 
 | ||||
| (guix-define-entry-type location) | ||||
| 
 | ||||
| (defun guix-location-get-entries () | ||||
|   "Receive 'package location' entries." | ||||
|   (guix-eval-read "(package-location-entries)")) | ||||
| 
 | ||||
|  | ||||
| ;;; Location 'list' | ||||
| 
 | ||||
| (guix-list-define-interface location | ||||
|   :buffer-name "*Guix Package Locations*" | ||||
|   :get-entries-function 'guix-location-get-entries | ||||
|   :format '((location guix-location-list-file-name-specification 50 t) | ||||
|             (number-of-packages nil 10 guix-list-sort-numerically-1 | ||||
|                                 :right-align t)) | ||||
|   :sort-key '(location)) | ||||
| 
 | ||||
| (let ((map guix-location-list-mode-map)) | ||||
|   (define-key map (kbd "RET") 'guix-location-list-show-packages) | ||||
|   ;; "Location Info" buffer is not defined (it would be useless), so | ||||
|   ;; unbind "i" key (by default, it is used to display Info buffer). | ||||
|   (define-key map (kbd "i") nil)) | ||||
| 
 | ||||
| (defun guix-location-list-file-name-specification (location &optional _) | ||||
|   "Return LOCATION button specification for `tabulated-list-entries'." | ||||
|   (list location | ||||
|         'face 'guix-list-file-name | ||||
|         'action (lambda (btn) | ||||
|                   (guix-find-location (button-get btn 'location))) | ||||
|         'follow-link t | ||||
|         'help-echo (concat "Find location: " location) | ||||
|         'location location)) | ||||
| 
 | ||||
| (declare-function guix-packages-by-location "guix-ui-package") | ||||
| 
 | ||||
| (defun guix-location-list-show-packages () | ||||
|   "Display packages placed in the location at point." | ||||
|   (interactive) | ||||
|   (guix-packages-by-location (guix-list-current-id))) | ||||
| 
 | ||||
|  | ||||
| ;;; Interactive commands | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-locations () | ||||
|   "Display locations of the Guix packages." | ||||
|   (interactive) | ||||
|   (guix-list-get-display-entries 'location)) | ||||
| 
 | ||||
| (provide 'guix-ui-location) | ||||
| 
 | ||||
| ;;; guix-ui-location.el ends here | ||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,105 +0,0 @@ | |||
| ;;; guix-ui-system-generation.el --- Interface for displaying system generations  -*- lexical-binding: t -*- | ||||
| 
 | ||||
| ;; Copyright © 2016 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 an interface for displaying system generations | ||||
| ;; in 'list' and 'info' buffers, and commands for working with them. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-list) | ||||
| (require 'guix-ui) | ||||
| (require 'guix-ui-generation) | ||||
| (require 'guix-profiles) | ||||
| 
 | ||||
| (guix-ui-define-entry-type system-generation) | ||||
| 
 | ||||
| (defun guix-system-generation-get-display (search-type &rest search-values) | ||||
|   "Search for system generations and show results. | ||||
| See `guix-ui-get-entries' for the meaning of SEARCH-TYPE and | ||||
| SEARCH-VALUES." | ||||
|   (apply #'guix-list-get-display-entries | ||||
|          'system-generation | ||||
|          guix-system-profile | ||||
|          search-type search-values)) | ||||
| 
 | ||||
|  | ||||
| ;;; System generation 'info' | ||||
| 
 | ||||
| (guix-ui-info-define-interface system-generation | ||||
|   :buffer-name "*Guix Generation Info*" | ||||
|   :format '((number format guix-generation-info-insert-number) | ||||
|             (label format (format)) | ||||
|             (prev-number format (format)) | ||||
|             (current format guix-generation-info-insert-current) | ||||
|             (path format (format guix-file)) | ||||
|             (time format (time)) | ||||
|             (root-device format (format)) | ||||
|             (kernel format (format guix-file))) | ||||
|   :titles guix-generation-info-titles) | ||||
| 
 | ||||
|  | ||||
| ;;; System generation 'list' | ||||
| 
 | ||||
| ;; FIXME It is better to make `guix-generation-list-shared-map' with | ||||
| ;; common keys for both usual and system generations. | ||||
| (defvar guix-system-generation-list-mode-map | ||||
|   (copy-keymap guix-generation-list-mode-map) | ||||
|   "Keymap for `guix-system-generation-list-mode' buffers.") | ||||
| 
 | ||||
| (guix-ui-list-define-interface system-generation | ||||
|   :buffer-name "*Guix Generation List*" | ||||
|   :format '((number nil 5 guix-list-sort-numerically-0 :right-align t) | ||||
|             (current guix-generation-list-get-current 10 t) | ||||
|             (label nil 40 t) | ||||
|             (time guix-list-get-time 20 t) | ||||
|             (path guix-list-get-file-name 30 t)) | ||||
|   :titles guix-generation-list-titles | ||||
|   :sort-key '(number . t) | ||||
|   :marks '((delete . ?D))) | ||||
| 
 | ||||
|  | ||||
| ;;; Interactive commands | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-system-generations () | ||||
|   "Display information about system generations." | ||||
|   (interactive) | ||||
|   (guix-system-generation-get-display 'all)) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-last-system-generations (number) | ||||
|   "Display information about last NUMBER of system generations." | ||||
|   (interactive "nThe number of last generations: ") | ||||
|   (guix-system-generation-get-display 'last number)) | ||||
| 
 | ||||
| ;;;###autoload | ||||
| (defun guix-system-generations-by-time (from to) | ||||
|   "Display information about system generations created between FROM and TO." | ||||
|   (interactive | ||||
|    (list (guix-read-date "Find generations (from): ") | ||||
|          (guix-read-date "Find generations (to): "))) | ||||
|   (guix-system-generation-get-display | ||||
|    'time (float-time from) (float-time to))) | ||||
| 
 | ||||
| (provide 'guix-ui-system-generation) | ||||
| 
 | ||||
| ;;; guix-ui-system-generation.el ends here | ||||
							
								
								
									
										323
									
								
								emacs/guix-ui.el
									
										
									
									
									
								
							
							
						
						
									
										323
									
								
								emacs/guix-ui.el
									
										
									
									
									
								
							|  | @ -1,323 +0,0 @@ | |||
| ;;; guix-ui.el --- Common code for Guix package management interface  -*- lexical-binding: t -*- | ||||
| 
 | ||||
| ;; Copyright © 2014, 2015, 2016 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 some general code for 'list'/'info' interfaces for | ||||
| ;; packages and generations. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'cl-lib) | ||||
| (require 'guix-backend) | ||||
| (require 'guix-buffer) | ||||
| (require 'guix-guile) | ||||
| (require 'guix-utils) | ||||
| (require 'guix-messages) | ||||
| (require 'guix-profiles) | ||||
| 
 | ||||
| (guix-define-groups ui | ||||
|   :group-doc "\ | ||||
| Settings for 'ui' (Guix package management) buffers. | ||||
| This group includes settings for displaying packages, outputs and | ||||
| generations in 'list' and 'info' buffers.") | ||||
| 
 | ||||
| (defvar guix-ui-map | ||||
|   (let ((map (make-sparse-keymap))) | ||||
|     (define-key map (kbd "M") 'guix-apply-manifest) | ||||
|     (define-key map (kbd "C-c C-z") 'guix-switch-to-repl) | ||||
|     map) | ||||
|   "Parent keymap for Guix package/generation buffers.") | ||||
| 
 | ||||
| (guix-buffer-define-current-args-accessors | ||||
|  "guix-ui-current" "profile" "search-type" "search-values") | ||||
| 
 | ||||
| (defun guix-ui-read-profile () | ||||
|   "Return `guix-current-profile' or prompt for it. | ||||
| This function is intended for using in `interactive' forms." | ||||
|   (if current-prefix-arg | ||||
|       (guix-profile-prompt) | ||||
|     guix-current-profile)) | ||||
| 
 | ||||
| (defun guix-ui-get-entries (profile entry-type search-type search-values | ||||
|                                     &optional params) | ||||
|   "Receive ENTRY-TYPE entries for PROFILE. | ||||
| Call an appropriate scheme procedure and return a list of entries. | ||||
| 
 | ||||
| ENTRY-TYPE should be one of the following symbols: `package', | ||||
| `output' or `generation'. | ||||
| 
 | ||||
| SEARCH-TYPE may be one of the following symbols: | ||||
| 
 | ||||
| - If ENTRY-TYPE is `package' or `output': `id', `name', `regexp', | ||||
|   `all-available', `newest-available', `installed', `obsolete', | ||||
|   `generation'. | ||||
| 
 | ||||
| - If ENTRY-TYPE is `generation': `id', `last', `all', `time'. | ||||
| 
 | ||||
| PARAMS is a list of parameters for receiving.  If nil, get data | ||||
| with all available parameters." | ||||
|   (guix-eval-read | ||||
|    (guix-make-guile-expression | ||||
|     'entries | ||||
|     profile params entry-type search-type search-values))) | ||||
| 
 | ||||
| (defun guix-ui-list-describe (ids) | ||||
|   "Describe 'ui' entries with IDS (list of identifiers)." | ||||
|   (guix-buffer-get-display-entries | ||||
|    'info (guix-buffer-current-entry-type) | ||||
|    (cl-list* (guix-ui-current-profile) 'id ids) | ||||
|    'add)) | ||||
| 
 | ||||
|  | ||||
| ;;; Buffers and auto updating | ||||
| 
 | ||||
| (defcustom guix-ui-update-after-operation 'current | ||||
|   "Define what kind of data to update after executing an operation. | ||||
| 
 | ||||
| After successful executing an operation in the Guix REPL (for | ||||
| example after installing a package), the data in Guix buffers | ||||
| will or will not be automatically updated depending on a value of | ||||
| this variable. | ||||
| 
 | ||||
| If nil, update nothing (do not revert any buffer). | ||||
| If `current', update the buffer from which an operation was performed. | ||||
| If `all', update all Guix buffers (not recommended)." | ||||
|   :type '(choice (const :tag "Do nothing" nil) | ||||
|                  (const :tag "Update operation buffer" current) | ||||
|                  (const :tag "Update all Guix buffers" all)) | ||||
|   :group 'guix-ui) | ||||
| 
 | ||||
| (defcustom guix-ui-buffer-name-function | ||||
|   #'guix-ui-buffer-name-full | ||||
|   "Function used to define a name of a Guix buffer. | ||||
| The function is called with 2 arguments: BASE-NAME and PROFILE." | ||||
|   :type '(choice (function-item guix-ui-buffer-name-full) | ||||
|                  (function-item guix-ui-buffer-name-short) | ||||
|                  (function-item guix-ui-buffer-name-simple) | ||||
|                  (function :tag "Other function")) | ||||
|   :group 'guix-ui) | ||||
| 
 | ||||
| (defun guix-ui-buffer-name-simple (base-name &rest _) | ||||
|   "Return BASE-NAME." | ||||
|   base-name) | ||||
| 
 | ||||
| (defun guix-ui-buffer-name-short (base-name profile) | ||||
|   "Return buffer name by appending BASE-NAME and PROFILE's base file name." | ||||
|   (guix-compose-buffer-name base-name | ||||
|                             (file-name-base (directory-file-name profile)))) | ||||
| 
 | ||||
| (defun guix-ui-buffer-name-full (base-name profile) | ||||
|   "Return buffer name by appending BASE-NAME and PROFILE's full name." | ||||
|   (guix-compose-buffer-name base-name profile)) | ||||
| 
 | ||||
| (defun guix-ui-buffer-name (base-name profile) | ||||
|   "Return Guix buffer name based on BASE-NAME and profile. | ||||
| See `guix-ui-buffer-name-function' for details." | ||||
|   (funcall guix-ui-buffer-name-function | ||||
|            base-name profile)) | ||||
| 
 | ||||
| (defun guix-ui-buffer? (&optional buffer modes) | ||||
|   "Return non-nil if BUFFER mode is derived from any of the MODES. | ||||
| If BUFFER is nil, check current buffer. | ||||
| If MODES is nil, use `guix-list-mode' and `guix-info-mode'." | ||||
|   (with-current-buffer (or buffer (current-buffer)) | ||||
|     (apply #'derived-mode-p | ||||
|            (or modes '(guix-list-mode guix-info-mode))))) | ||||
| 
 | ||||
| (defun guix-ui-buffers (&optional modes) | ||||
|   "Return a list of all buffers with major modes derived from MODES. | ||||
| If MODES is nil, return list of all Guix 'list' and 'info' buffers." | ||||
|   (cl-remove-if-not (lambda (buf) | ||||
|                       (guix-ui-buffer? buf modes)) | ||||
|                     (buffer-list))) | ||||
| 
 | ||||
| (defun guix-ui-update-buffer (buffer) | ||||
|   "Update data in a 'list' or 'info' BUFFER." | ||||
|   (with-current-buffer buffer | ||||
|     (guix-buffer-revert nil t))) | ||||
| 
 | ||||
| (defun guix-ui-update-buffers-after-operation () | ||||
|   "Update buffers after Guix operation if needed. | ||||
| See `guix-ui-update-after-operation' for details." | ||||
|   (let ((to-update | ||||
|          (and guix-operation-buffer | ||||
|               (cl-case guix-ui-update-after-operation | ||||
|                 (current (and (buffer-live-p guix-operation-buffer) | ||||
|                               (guix-ui-buffer? guix-operation-buffer) | ||||
|                               (list guix-operation-buffer))) | ||||
|                 (all     (guix-ui-buffers)))))) | ||||
|     (setq guix-operation-buffer nil) | ||||
|     (mapc #'guix-ui-update-buffer to-update))) | ||||
| 
 | ||||
| (add-hook 'guix-after-repl-operation-hook | ||||
|           'guix-ui-update-buffers-after-operation) | ||||
| 
 | ||||
|  | ||||
| ;;; Interface definers | ||||
| 
 | ||||
| (defmacro guix-ui-define-entry-type (entry-type &rest args) | ||||
|   "Define general code for ENTRY-TYPE. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-define-entry-type' macro." | ||||
|   (declare (indent 1)) | ||||
|   `(guix-define-entry-type ,entry-type | ||||
|      :parent-group guix-ui | ||||
|      :parent-faces-group guix-ui-faces | ||||
|      ,@args)) | ||||
| 
 | ||||
| (defmacro guix-ui-define-interface (buffer-type entry-type &rest args) | ||||
|   "Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| In the following description TYPE means ENTRY-TYPE-BUFFER-TYPE. | ||||
| 
 | ||||
| Required keywords: | ||||
| 
 | ||||
|   - `:buffer-name' - base part of a buffer name.  It is used in a | ||||
|     generated `guix-TYPE-buffer-name' function; see | ||||
|     `guix-ui-buffer-name' for details. | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:required' - default value of the generated | ||||
|     `guix-TYPE-required-params' variable. | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-BUFFER-TYPE-define-interface' macro. | ||||
| 
 | ||||
| Along with the mentioned definitions, this macro also defines: | ||||
| 
 | ||||
|   - `guix-TYPE-mode-map' - keymap based on `guix-ui-map' and | ||||
|     `guix-BUFFER-TYPE-mode-map'. | ||||
| 
 | ||||
|   - `guix-TYPE-get-entries' - a wrapper around `guix-ui-get-entries'. | ||||
| 
 | ||||
|   - `guix-TYPE-message' - a wrapper around `guix-result-message'." | ||||
|   (declare (indent 2)) | ||||
|   (let* ((entry-type-str  (symbol-name entry-type)) | ||||
|          (buffer-type-str (symbol-name buffer-type)) | ||||
|          (prefix          (concat "guix-" entry-type-str "-" | ||||
|                                   buffer-type-str)) | ||||
|          (mode-str        (concat prefix "-mode")) | ||||
|          (mode-map        (intern (concat mode-str "-map"))) | ||||
|          (parent-map      (intern (format "guix-%s-mode-map" | ||||
|                                           buffer-type-str))) | ||||
|          (required-var    (intern (concat prefix "-required-params"))) | ||||
|          (buffer-name-fun (intern (concat prefix "-buffer-name"))) | ||||
|          (get-fun         (intern (concat prefix "-get-entries"))) | ||||
|          (message-fun     (intern (concat prefix "-message"))) | ||||
|          (displayed-fun   (intern (format "guix-%s-displayed-params" | ||||
|                                           buffer-type-str))) | ||||
|          (definer         (intern (format "guix-%s-define-interface" | ||||
|                                           buffer-type-str)))) | ||||
|     (guix-keyword-args-let args | ||||
|         ((buffer-name-val :buffer-name) | ||||
|          (required-val    :required ''(id))) | ||||
|       `(progn | ||||
|          (defvar ,mode-map | ||||
|            (let ((map (make-sparse-keymap))) | ||||
|              (set-keymap-parent | ||||
|               map (make-composed-keymap ,parent-map guix-ui-map)) | ||||
|              map) | ||||
|            ,(format "Keymap for `%s' buffers." mode-str)) | ||||
| 
 | ||||
|          (defvar ,required-var ,required-val | ||||
|            ,(format "\ | ||||
| List of the required '%s' parameters. | ||||
| These parameters are received by `%S' | ||||
| along with the displayed parameters. | ||||
| 
 | ||||
| Do not remove `id' from this list as it is required for | ||||
| identifying an entry." | ||||
|                     entry-type-str get-fun)) | ||||
| 
 | ||||
|          (defun ,buffer-name-fun (profile &rest _) | ||||
|            ,(format "\ | ||||
| Return a name of '%s' buffer for displaying '%s' entries. | ||||
| See `guix-ui-buffer-name' for details." | ||||
|                     buffer-type-str entry-type-str) | ||||
|            (guix-ui-buffer-name ,buffer-name-val profile)) | ||||
| 
 | ||||
|          (defun ,get-fun (profile search-type &rest search-values) | ||||
|            ,(format "\ | ||||
| Receive '%s' entries for displaying them in '%s' buffer. | ||||
| See `guix-ui-get-entries' for details." | ||||
|                     entry-type-str buffer-type-str) | ||||
|            (guix-ui-get-entries | ||||
|             profile ',entry-type search-type search-values | ||||
|             (cl-union ,required-var | ||||
|                       (,displayed-fun ',entry-type)))) | ||||
| 
 | ||||
|          (defun ,message-fun (entries profile search-type | ||||
|                                       &rest search-values) | ||||
|            ,(format "\ | ||||
| Display a message after showing '%s' entries." | ||||
|                     entry-type-str) | ||||
|            (guix-result-message | ||||
|             profile entries ',entry-type search-type search-values)) | ||||
| 
 | ||||
|          (,definer ,entry-type | ||||
|            :get-entries-function ',get-fun | ||||
|            :message-function ',message-fun | ||||
|            :buffer-name ',buffer-name-fun | ||||
|            ,@%foreign-args))))) | ||||
| 
 | ||||
| (defmacro guix-ui-info-define-interface (entry-type &rest args) | ||||
|   "Define 'info' interface for displaying ENTRY-TYPE entries. | ||||
| See `guix-ui-define-interface'." | ||||
|   (declare (indent 1)) | ||||
|   `(guix-ui-define-interface info ,entry-type | ||||
|      ,@args)) | ||||
| 
 | ||||
| (defmacro guix-ui-list-define-interface (entry-type &rest args) | ||||
|   "Define 'list' interface for displaying ENTRY-TYPE entries. | ||||
| Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ... | ||||
| 
 | ||||
| Optional keywords: | ||||
| 
 | ||||
|   - `:describe-function' - default value of the generated | ||||
|     `guix-ENTRY-TYPE-list-describe-function' variable (if not | ||||
|     specified, use `guix-ui-list-describe'). | ||||
| 
 | ||||
| The rest keyword arguments are passed to | ||||
| `guix-ui-define-interface' macro." | ||||
|   (declare (indent 1)) | ||||
|   (guix-keyword-args-let args | ||||
|       ((describe-val :describe-function)) | ||||
|     `(guix-ui-define-interface list ,entry-type | ||||
|        :describe-function ,(or describe-val ''guix-ui-list-describe) | ||||
|        ,@args))) | ||||
| 
 | ||||
|  | ||||
| (defvar guix-ui-font-lock-keywords | ||||
|   (eval-when-compile | ||||
|     `((,(rx "(" (group (or "guix-ui-define-entry-type" | ||||
|                            "guix-ui-define-interface" | ||||
|                            "guix-ui-info-define-interface" | ||||
|                            "guix-ui-list-define-interface")) | ||||
|             symbol-end) | ||||
|        . 1)))) | ||||
| 
 | ||||
| (font-lock-add-keywords 'emacs-lisp-mode guix-ui-font-lock-keywords) | ||||
| 
 | ||||
| (provide 'guix-ui) | ||||
| 
 | ||||
| ;;; guix-ui.el ends here | ||||
|  | @ -1,609 +0,0 @@ | |||
| ;;; guix-utils.el --- General utility functions  -*- lexical-binding: t -*- | ||||
| 
 | ||||
| ;; Copyright © 2014, 2015, 2016 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)) | ||||
| 
 | ||||
| (defmacro guix-with-indent (indent &rest body) | ||||
|   "Evaluate BODY and indent inserted text by INDENT number of spaces." | ||||
|   (declare (indent 1) (debug t)) | ||||
|   (let ((region-beg-var (make-symbol "region-beg")) | ||||
|         (indent-var     (make-symbol "indent"))) | ||||
|     `(let ((,region-beg-var (point)) | ||||
|            (,indent-var     ,indent)) | ||||
|        ,@body | ||||
|        (unless (zerop ,indent-var) | ||||
|          (indent-rigidly ,region-beg-var (point) ,indent-var))))) | ||||
| 
 | ||||
| (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)))) | ||||
| 
 | ||||
| (cl-defun guix-mapinsert (function sequence separator &key indent column) | ||||
|   "Like `mapconcat' but for inserting text. | ||||
| Apply FUNCTION to each element of SEQUENCE, and insert SEPARATOR | ||||
| at point between each FUNCTION call. | ||||
| 
 | ||||
| If INDENT is non-nil, it should be a number of spaces used to | ||||
| indent each line of the inserted text. | ||||
| 
 | ||||
| If COLUMN is non-nil, it should be a column number which | ||||
| shouldn't be exceeded by the inserted text." | ||||
|   (pcase sequence | ||||
|     (`(,first . ,rest) | ||||
|      (let* ((indent (or indent 0)) | ||||
|             (max-column (and column (- column indent)))) | ||||
|        (guix-with-indent indent | ||||
|          (funcall function first) | ||||
|          (dolist (element rest) | ||||
|            (let ((before-sep-pos (and column (point)))) | ||||
|              (insert separator) | ||||
|              (let ((after-sep-pos (and column (point)))) | ||||
|                (funcall function element) | ||||
|                (when (and column | ||||
|                           (> (current-column) max-column)) | ||||
|                  (save-excursion | ||||
|                    (delete-region before-sep-pos after-sep-pos) | ||||
|                    (goto-char before-sep-pos) | ||||
|                    (insert "\n"))))))))))) | ||||
| 
 | ||||
| (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-buttonize (value button-type separator &rest properties) | ||||
|   "Make BUTTON-TYPE button(s) from VALUE. | ||||
| Return a string with button(s). | ||||
| 
 | ||||
| VALUE should be a string or a list of strings.  If it is a list | ||||
| of strings, buttons are separated with SEPARATOR string. | ||||
| 
 | ||||
| PROPERTIES are passed to `guix-insert-button'." | ||||
|   (with-temp-buffer | ||||
|     (let ((labels (if (listp value) value (list value)))) | ||||
|       (guix-mapinsert (lambda (label) | ||||
|                         (apply #'guix-insert-button | ||||
|                                label button-type properties)) | ||||
|                       labels | ||||
|                       separator)) | ||||
|     (buffer-substring (point-min) (point-max)))) | ||||
| 
 | ||||
| (defun guix-button-type? (symbol) | ||||
|   "Return non-nil, if SYMBOL is a button type." | ||||
|   (and symbol | ||||
|        (get symbol 'button-category-symbol))) | ||||
| 
 | ||||
| (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, fill STR to this column." | ||||
|   (let ((str (if col | ||||
|                  (guix-get-filled-string str col) | ||||
|                str))) | ||||
|     (split-string str "\n *" t))) | ||||
| 
 | ||||
| (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-hexify (value) | ||||
|   "Convert VALUE to string and hexify it." | ||||
|   (url-hexify-string (guix-get-string value))) | ||||
| 
 | ||||
| (defun guix-number->bool (number) | ||||
|   "Convert NUMBER to boolean value. | ||||
| Return nil, if NUMBER is 0; return t otherwise." | ||||
|   (not (zerop number))) | ||||
| 
 | ||||
| (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-symbol-title (symbol) | ||||
|   "Return SYMBOL's name, a string. | ||||
| This is like `symbol-name', but fancier." | ||||
|   (if (eq symbol 'id) | ||||
|       "ID" | ||||
|     (let ((str (replace-regexp-in-string "-" " " (symbol-name symbol)))) | ||||
|       (concat (capitalize (substring str 0 1)) | ||||
|               (substring str 1))))) | ||||
| 
 | ||||
| (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-compose-buffer-name (base-name postfix) | ||||
|   "Return buffer name by appending BASE-NAME and POSTFIX. | ||||
| 
 | ||||
| In a simple case the result is: | ||||
| 
 | ||||
|   BASE-NAME: POSTFIX | ||||
| 
 | ||||
| If BASE-NAME is wrapped by '*', then the result is: | ||||
| 
 | ||||
|   *BASE-NAME: POSTFIX*" | ||||
|   (let ((re (rx string-start | ||||
|                 (group (? "*")) | ||||
|                 (group (*? any)) | ||||
|                 (group (? "*")) | ||||
|                 string-end))) | ||||
|     (or (string-match re base-name) | ||||
|         (error "Unexpected error in defining buffer name")) | ||||
|     (let ((first*    (match-string 1 base-name)) | ||||
|           (name-body (match-string 2 base-name)) | ||||
|           (last*     (match-string 3 base-name))) | ||||
|       ;; Handle the case when buffer name is wrapped by '*'. | ||||
|       (if (and (string= "*" first*) | ||||
|                (string= "*" last*)) | ||||
|           (concat "*" name-body ": " postfix "*") | ||||
|         (concat base-name ": " postfix))))) | ||||
| 
 | ||||
| (defun guix-completing-read (prompt table &optional predicate | ||||
|                              require-match initial-input | ||||
|                              hist def inherit-input-method) | ||||
|   "Same as `completing-read' but return nil instead of an empty string." | ||||
|   (let ((res (completing-read prompt table predicate | ||||
|                               require-match initial-input | ||||
|                               hist def inherit-input-method))) | ||||
|     (unless (string= "" res) res))) | ||||
| 
 | ||||
| (defun guix-completing-read-multiple (prompt table &optional predicate | ||||
|                                       require-match initial-input | ||||
|                                       hist def inherit-input-method) | ||||
|   "Same as `completing-read-multiple' but remove duplicates in result." | ||||
|   (cl-remove-duplicates | ||||
|    (completing-read-multiple prompt table predicate | ||||
|                              require-match initial-input | ||||
|                              hist def inherit-input-method) | ||||
|    :test #'string=)) | ||||
| 
 | ||||
| (declare-function org-read-date "org" t) | ||||
| 
 | ||||
| (defun guix-read-date (prompt) | ||||
|   "Prompt for a date or time using `org-read-date'. | ||||
| Return time value." | ||||
|   (require 'org) | ||||
|   (org-read-date nil t nil prompt)) | ||||
| 
 | ||||
| (defun guix-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))) | ||||
| 
 | ||||
| (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))) | ||||
| 
 | ||||
| (defmacro guix-while-null (&rest body) | ||||
|   "Evaluate BODY until its result becomes non-nil." | ||||
|   (declare (indent 0) (debug t)) | ||||
|   (let ((result-var (make-symbol "result"))) | ||||
|     `(let (,result-var) | ||||
|        (while (null ,result-var) | ||||
|          (setq ,result-var ,@body)) | ||||
|        ,result-var))) | ||||
| 
 | ||||
| (defun guix-modify (object modifiers) | ||||
|   "Apply MODIFIERS to OBJECT. | ||||
| OBJECT is passed as an argument to the first function from | ||||
| MODIFIERS list, the returned result is passed to the second | ||||
| function from the list and so on.  Return result of the last | ||||
| modifier call." | ||||
|   (if (null modifiers) | ||||
|       object | ||||
|     (guix-modify (funcall (car modifiers) object) | ||||
|                  (cdr modifiers)))) | ||||
| 
 | ||||
| (defmacro guix-keyword-args-let (args varlist &rest body) | ||||
|   "Parse ARGS, bind variables from VARLIST and eval BODY. | ||||
| 
 | ||||
| Find keyword values in ARGS, bind them to variables according to | ||||
| VARLIST, then evaluate BODY. | ||||
| 
 | ||||
| ARGS is a keyword/value property list. | ||||
| 
 | ||||
| Each element of VARLIST has a form: | ||||
| 
 | ||||
|   (SYMBOL KEYWORD [DEFAULT-VALUE]) | ||||
| 
 | ||||
| SYMBOL is a varible name.  KEYWORD is a symbol that will be | ||||
| searched in ARGS for an according value.  If the value of KEYWORD | ||||
| does not exist, bind SYMBOL to DEFAULT-VALUE or nil. | ||||
| 
 | ||||
| The rest arguments (that present in ARGS but not in VARLIST) will | ||||
| be bound to `%foreign-args' variable. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
|   (guix-keyword-args-let '(:two 8 :great ! :guix is) | ||||
|       ((one :one 1) | ||||
|        (two :two 2) | ||||
|        (foo :smth)) | ||||
|     (list one two foo %foreign-args)) | ||||
| 
 | ||||
|   => (1 8 nil (:guix is :great !))" | ||||
|   (declare (indent 2)) | ||||
|   (let ((args-var (make-symbol "args"))) | ||||
|     `(let (,@(mapcar (lambda (spec) | ||||
|                        (pcase-let ((`(,name ,_ ,val) spec)) | ||||
|                          (list name val))) | ||||
|                      varlist) | ||||
|            (,args-var ,args) | ||||
|            %foreign-args) | ||||
|        (while ,args-var | ||||
|          (pcase ,args-var | ||||
|            (`(,key ,val . ,rest-args) | ||||
|             (cl-case key | ||||
|               ,@(mapcar (lambda (spec) | ||||
|                           (pcase-let ((`(,name ,key ,_) spec)) | ||||
|                             `(,key (setq ,name val)))) | ||||
|                         varlist) | ||||
|               (t (setq %foreign-args | ||||
|                        (cl-list* key val %foreign-args)))) | ||||
|             (setq ,args-var rest-args)))) | ||||
|        ,@body))) | ||||
| 
 | ||||
|  | ||||
| ;;; Alist procedures | ||||
| 
 | ||||
| (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) | ||||
| 
 | ||||
| (defun guix-alist-put (value alist &rest keys) | ||||
|   "Put (add or replace if exists) VALUE to ALIST using KEYS. | ||||
| Return the new alist. | ||||
| 
 | ||||
| ALIST is alist of alists of alists ... which can be consecutively | ||||
| accessed with KEYS. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
|   (guix-alist-put | ||||
|    'foo | ||||
|    '((one (a . 1) (b . 2)) | ||||
|      (two (m . 7) (n . 8))) | ||||
|    'one 'b) | ||||
| 
 | ||||
|   => ((one (a . 1) (b . foo)) | ||||
|       (two (m . 7) (n . 8)))" | ||||
|   (or keys (error "Keys should be specified")) | ||||
|   (guix-alist-put-1 value alist keys)) | ||||
| 
 | ||||
| (defun guix-alist-put-1 (value alist keys) | ||||
|   "Subroutine of `guix-alist-put'." | ||||
|   (cond | ||||
|    ((null keys) | ||||
|     value) | ||||
|    ((null alist) | ||||
|     (list (cons (car keys) | ||||
|                 (guix-alist-put-1 value nil (cdr keys))))) | ||||
|    ((eq (car keys) (caar alist)) | ||||
|     (cons (cons (car keys) | ||||
|                 (guix-alist-put-1 value (cdar alist) (cdr keys))) | ||||
|           (cdr alist))) | ||||
|    (t | ||||
|     (cons (car alist) | ||||
|           (guix-alist-put-1 value (cdr alist) keys))))) | ||||
| 
 | ||||
| (defun guix-alist-put! (value variable &rest keys) | ||||
|   "Modify alist VARIABLE (symbol) by putting VALUE using KEYS. | ||||
| See `guix-alist-put' for details." | ||||
|   (set variable | ||||
|        (apply #'guix-alist-put value (symbol-value variable) keys))) | ||||
| 
 | ||||
|  | ||||
| ;;; 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)) | ||||
| 
 | ||||
|  | ||||
| ;;; Completing readers definers | ||||
| 
 | ||||
| (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." | ||||
|   (guix-keyword-args-let args | ||||
|       ((completions-var    :completions-var) | ||||
|        (completions-getter :completions-getter) | ||||
|        (single-reader      :single-reader) | ||||
|        (single-prompt      :single-prompt) | ||||
|        (multiple-reader    :multiple-reader) | ||||
|        (multiple-prompt    :multiple-prompt) | ||||
|        (multiple-separator :multiple-separator)) | ||||
|     (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 guix-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)))))))) | ||||
| 
 | ||||
|  | ||||
| ;;; 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-utils-font-lock-keywords | ||||
|   (eval-when-compile | ||||
|     `((,(rx "(" (group (or "guix-define-reader" | ||||
|                            "guix-define-readers" | ||||
|                            "guix-keyword-args-let" | ||||
|                            "guix-while-null" | ||||
|                            "guix-while-search" | ||||
|                            "guix-with-indent")) | ||||
|             symbol-end) | ||||
|        . 1) | ||||
|       (,(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-utils-font-lock-keywords) | ||||
| 
 | ||||
| (provide 'guix-utils) | ||||
| 
 | ||||
| ;;; guix-utils.el ends here | ||||
|  | @ -1,77 +0,0 @@ | |||
| # GNU Guix --- Functional package management for GNU
 | ||||
| # Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 | ||||
| # Copyright © 2016 Mathieu Lirzin <mthl@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/>.
 | ||||
| 
 | ||||
| AUTOLOADS = %D%/guix-autoloads.el | ||||
| 
 | ||||
| ELFILES =					\
 | ||||
|   %D%/guix-about.el				\
 | ||||
|   %D%/guix-backend.el				\
 | ||||
|   %D%/guix-base.el				\
 | ||||
|   %D%/guix-build-log.el				\
 | ||||
|   %D%/guix-buffer.el				\
 | ||||
|   %D%/guix-command.el				\
 | ||||
|   %D%/guix-devel.el				\
 | ||||
|   %D%/guix-emacs.el				\
 | ||||
|   %D%/guix-entry.el				\
 | ||||
|   %D%/guix-external.el				\
 | ||||
|   %D%/guix-geiser.el				\
 | ||||
|   %D%/guix-guile.el				\
 | ||||
|   %D%/guix-help-vars.el				\
 | ||||
|   %D%/guix-history.el				\
 | ||||
|   %D%/guix-hydra.el				\
 | ||||
|   %D%/guix-hydra-build.el			\
 | ||||
|   %D%/guix-hydra-jobset.el			\
 | ||||
|   %D%/guix-info.el				\
 | ||||
|   %D%/guix-init.el				\
 | ||||
|   %D%/guix-license.el				\
 | ||||
|   %D%/guix-list.el				\
 | ||||
|   %D%/guix-location.el				\
 | ||||
|   %D%/guix-messages.el				\
 | ||||
|   %D%/guix-pcomplete.el				\
 | ||||
|   %D%/guix-popup.el				\
 | ||||
|   %D%/guix-prettify.el				\
 | ||||
|   %D%/guix-profiles.el				\
 | ||||
|   %D%/guix-read.el				\
 | ||||
|   %D%/guix-ui.el				\
 | ||||
|   %D%/guix-ui-license.el			\
 | ||||
|   %D%/guix-ui-location.el			\
 | ||||
|   %D%/guix-ui-package.el			\
 | ||||
|   %D%/guix-ui-generation.el			\
 | ||||
|   %D%/guix-ui-system-generation.el		\
 | ||||
|   %D%/guix-utils.el | ||||
| 
 | ||||
| if HAVE_EMACS | ||||
| 
 | ||||
| dist_lisp_DATA = $(ELFILES) | ||||
| 
 | ||||
| nodist_lisp_DATA = 		\
 | ||||
|   %D%/guix-config.el		\
 | ||||
|   $(AUTOLOADS) | ||||
| 
 | ||||
| $(AUTOLOADS): $(ELFILES) | ||||
| 	$(AM_V_EMACS)$(EMACS) --batch --eval				\
 | ||||
| 	  "(let ((backup-inhibited t)					\
 | ||||
| 	         (generated-autoload-file				\
 | ||||
| 	          (expand-file-name \"$(AUTOLOADS)\" \"$(builddir)\")))	\
 | ||||
| 	     (update-directory-autoloads				\
 | ||||
| 	      (expand-file-name \"emacs\" \"$(srcdir)\")))"
 | ||||
| 
 | ||||
| CLEANFILES += $(AUTOLOADS) | ||||
| 
 | ||||
| endif HAVE_EMACS | ||||
							
								
								
									
										57
									
								
								etc/git/pre-push
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								etc/git/pre-push
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| # This hook script prevents the user from pushing to Savannah if any of the new | ||||
| # commits' OpenPGP signatures cannot be verified. | ||||
| 
 | ||||
| # Called by "git push" after it has checked the remote status, but before | ||||
| # anything has been pushed.  If this script exits with a non-zero status nothing | ||||
| # will be pushed. | ||||
| # | ||||
| # This hook is called with the following parameters: | ||||
| # | ||||
| # $1 -- Name of the remote to which the push is being done | ||||
| # $2 -- URL to which the push is being done | ||||
| # | ||||
| # If pushing without using a named remote those arguments will be equal. | ||||
| # | ||||
| # Information about the commits which are being pushed is supplied as lines to | ||||
| # the standard input in the form: | ||||
| # | ||||
| #   <local ref> <local sha1> <remote ref> <remote sha1> | ||||
| 
 | ||||
| z40=0000000000000000000000000000000000000000 | ||||
| 
 | ||||
| # Only use the hook when pushing to Savannah. | ||||
| case "$2" in | ||||
| *git.sv.gnu.org*) | ||||
| 	break | ||||
| 	;; | ||||
| *) | ||||
| 	exit 0 | ||||
| 	;; | ||||
| esac | ||||
| 
 | ||||
| while read local_ref local_sha remote_ref remote_sha | ||||
| do | ||||
| 	if [ "$local_sha" = $z40 ] | ||||
| 	then | ||||
| 		# Handle delete | ||||
| 		: | ||||
| 	else | ||||
| 		if [ "$remote_sha" = $z40 ] | ||||
| 		then | ||||
| 			# New branch, examine all commits | ||||
| 			range="$local_sha" | ||||
| 		else | ||||
| 			# Update to existing branch, examine new commits | ||||
| 			range="$remote_sha..$local_sha" | ||||
| 		fi | ||||
| 
 | ||||
| 		# Verify the signatures of all commits being pushed. | ||||
| 		git verify-commit $(git rev-list $range) >/dev/null 2>&1 | ||||
| 
 | ||||
| 		exit $? | ||||
| 	fi | ||||
| done | ||||
| 
 | ||||
| exit 0 | ||||
							
								
								
									
										53
									
								
								etc/indent-package.el.in
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								etc/indent-package.el.in
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,53 @@ | |||
| #!@EMACS@ --script | ||||
| ;;; indent-package.el --- Run Emacs to indent a package definition. | ||||
| 
 | ||||
| ;; Copyright © 2017 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 scripts indents the given package definition in the specified file | ||||
| ;; using Emacs. | ||||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| ;; Load Scheme indentation rules from the current directory. | ||||
| (with-temp-buffer | ||||
|   (scheme-mode) | ||||
|   (let ((default-directory (file-name-as-directory ".")) | ||||
|         (enable-local-variables :all)) | ||||
|     (hack-dir-local-variables) | ||||
|     (hack-local-variables-apply))) | ||||
| 
 | ||||
| (pcase command-line-args-left | ||||
|   (`(,file-name ,package-name) | ||||
|    (find-file file-name) | ||||
|    (goto-char (point-min)) | ||||
|    (if (re-search-forward (concat "^(define\\(-public\\) +" | ||||
|                                   package-name) | ||||
|                           nil t) | ||||
|        (let ((indent-tabs-mode nil)) | ||||
|          (beginning-of-defun) | ||||
|          (indent-sexp) | ||||
|          (save-buffer) | ||||
|          (message "Done!")) | ||||
|      (error "Package '%s' not found in '%s'" | ||||
|             package-name file-name))) | ||||
|   (x | ||||
|    (error "Usage: indent-package.el FILE PACKAGE"))) | ||||
| 
 | ||||
| ;;; indent-package.el ends here | ||||
|  | @ -1,5 +1,6 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2016, 2017 David Craven <david@craven.ch> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -71,67 +72,114 @@ | |||
|   "Bind-mount SOURCE at TARGET." | ||||
|   (mount source target "" MS_BIND)) | ||||
| 
 | ||||
| (define (read-superblock device offset size magic?) | ||||
|   "Read a superblock of SIZE from OFFSET and DEVICE.  Return the raw | ||||
| superblock on success, and #f if no valid superblock was found.  MAGIC? | ||||
| takes a bytevector and returns #t when it's a valid superblock." | ||||
|   (call-with-input-file device | ||||
|     (lambda (port) | ||||
|       (seek port offset SEEK_SET) | ||||
| 
 | ||||
|       (let ((block (make-bytevector size))) | ||||
|         (match (get-bytevector-n! port block 0 (bytevector-length block)) | ||||
|           ((? eof-object?) | ||||
|            #f) | ||||
|           ((? number? len) | ||||
|            (and (= len (bytevector-length block)) | ||||
|                 (and (magic? block) | ||||
|                      block)))))))) | ||||
| 
 | ||||
| (define (sub-bytevector bv start size) | ||||
|   "Return a copy of the SIZE bytes of BV starting from offset START." | ||||
|   (let ((result (make-bytevector size))) | ||||
|     (bytevector-copy! bv start result 0 size) | ||||
|     result)) | ||||
| 
 | ||||
| (define (null-terminated-latin1->string bv) | ||||
|   "Return the volume name of SBLOCK as a string of at most 256 characters, or | ||||
| #f if SBLOCK has no volume name." | ||||
|     ;; This is a Latin-1, nul-terminated string. | ||||
|     (let ((bytes (take-while (negate zero?) (bytevector->u8-list bv)))) | ||||
|       (if (null? bytes) | ||||
|           #f | ||||
|           (list->string (map integer->char bytes))))) | ||||
| 
 | ||||
|  | ||||
| ;;; | ||||
| ;;; Ext2 file systems. | ||||
| ;;; | ||||
| 
 | ||||
| ;; <http://www.nongnu.org/ext2-doc/ext2.html#DEF-SUPERBLOCK>. | ||||
| ;; TODO: Use "packed structs" from Guile-OpenGL or similar. | ||||
| 
 | ||||
| (define-syntax %ext2-endianness | ||||
|   ;; Endianness of ext2 file systems. | ||||
|   (identifier-syntax (endianness little))) | ||||
| 
 | ||||
| ;; Offset in bytes of interesting parts of an ext2 superblock.  See | ||||
| ;; <http://www.nongnu.org/ext2-doc/ext2.html#DEF-SUPERBLOCK>. | ||||
| ;; TODO: Use "packed structs" from Guile-OpenGL or similar. | ||||
| (define-syntax %ext2-sblock-magic       (identifier-syntax 56)) | ||||
| (define-syntax %ext2-sblock-creator-os  (identifier-syntax 72)) | ||||
| (define-syntax %ext2-sblock-uuid        (identifier-syntax 104)) | ||||
| (define-syntax %ext2-sblock-volume-name (identifier-syntax 120)) | ||||
| (define (ext2-superblock? sblock) | ||||
|   "Return #t when SBLOCK is an ext2 superblock." | ||||
|   (let ((magic (bytevector-u16-ref sblock 56 %ext2-endianness))) | ||||
|     (= magic #xef53))) | ||||
| 
 | ||||
| (define (read-ext2-superblock device) | ||||
|   "Return the raw contents of DEVICE's ext2 superblock as a bytevector, or #f | ||||
| if DEVICE does not contain an ext2 file system." | ||||
|   (define %ext2-magic | ||||
|     ;; The magic bytes that identify an ext2 file system. | ||||
|     #xef53) | ||||
| 
 | ||||
|   (define superblock-size | ||||
|     ;; Size of the interesting part of an ext2 superblock. | ||||
|     264) | ||||
| 
 | ||||
|   (define block | ||||
|     ;; The superblock contents. | ||||
|     (make-bytevector superblock-size)) | ||||
| 
 | ||||
|   (call-with-input-file device | ||||
|     (lambda (port) | ||||
|       (seek port 1024 SEEK_SET) | ||||
| 
 | ||||
|       ;; Note: work around <http://bugs.gnu.org/17466>. | ||||
|       (and (eqv? superblock-size (get-bytevector-n! port block 0 | ||||
|                                                     superblock-size)) | ||||
|            (let ((magic (bytevector-u16-ref block %ext2-sblock-magic | ||||
|                                             %ext2-endianness))) | ||||
|              (and (= magic %ext2-magic) | ||||
|                   block)))))) | ||||
|   (read-superblock device 1024 264 ext2-superblock?)) | ||||
| 
 | ||||
| (define (ext2-superblock-uuid sblock) | ||||
|   "Return the UUID of ext2 superblock SBLOCK as a 16-byte bytevector." | ||||
|   (let ((uuid (make-bytevector 16))) | ||||
|     (bytevector-copy! sblock %ext2-sblock-uuid uuid 0 16) | ||||
|     uuid)) | ||||
|   (sub-bytevector sblock 104 16)) | ||||
| 
 | ||||
| (define (ext2-superblock-volume-name sblock) | ||||
|   "Return the volume name of SBLOCK as a string of at most 16 characters, or | ||||
| #f if SBLOCK has no volume name." | ||||
|   (let ((bv (make-bytevector 16))) | ||||
|     (bytevector-copy! sblock %ext2-sblock-volume-name bv 0 16) | ||||
|   (null-terminated-latin1->string (sub-bytevector sblock 120 16))) | ||||
| 
 | ||||
|     ;; This is a Latin-1, nul-terminated string. | ||||
|     (let ((bytes (take-while (negate zero?) (bytevector->u8-list bv)))) | ||||
|       (if (null? bytes) | ||||
|           #f | ||||
|           (list->string (map integer->char bytes)))))) | ||||
| (define (check-ext2-file-system device) | ||||
|   "Return the health of an ext2 file system on DEVICE." | ||||
|   (match (status:exit-val | ||||
|           (system* "e2fsck" "-v" "-p" "-C" "0" device)) | ||||
|     (0 'pass) | ||||
|     (1 'errors-corrected) | ||||
|     (2 'reboot-required) | ||||
|     (_ 'fatal-error))) | ||||
| 
 | ||||
|  | ||||
| ;;; | ||||
| ;;; Btrfs file systems. | ||||
| ;;; | ||||
| 
 | ||||
| ;; <https://btrfs.wiki.kernel.org/index.php/On-disk_Format#Superblock>. | ||||
| 
 | ||||
| (define-syntax %btrfs-endianness | ||||
|   ;; Endianness of btrfs file systems. | ||||
|   (identifier-syntax (endianness little))) | ||||
| 
 | ||||
| (define (btrfs-superblock? sblock) | ||||
|   "Return #t when SBLOCK is a btrfs superblock." | ||||
|   (bytevector=? (sub-bytevector sblock 64 8) | ||||
|                 (string->utf8 "_BHRfS_M"))) | ||||
| 
 | ||||
| (define (read-btrfs-superblock device) | ||||
|   "Return the raw contents of DEVICE's btrfs superblock as a bytevector, or #f | ||||
| if DEVICE does not contain a btrfs file system." | ||||
|   (read-superblock device 65536 4096 btrfs-superblock?)) | ||||
| 
 | ||||
| (define (btrfs-superblock-uuid sblock) | ||||
|   "Return the UUID of a btrfs superblock SBLOCK as a 16-byte bytevector." | ||||
|   (sub-bytevector sblock 32 16)) | ||||
| 
 | ||||
| (define (btrfs-superblock-volume-name sblock) | ||||
|   "Return the volume name of SBLOCK as a string of at most 256 characters, or | ||||
| #f if SBLOCK has no volume name." | ||||
|   (null-terminated-latin1->string (sub-bytevector sblock 299 256))) | ||||
| 
 | ||||
| (define (check-btrfs-file-system device) | ||||
|   "Return the health of a btrfs file system on DEVICE." | ||||
|   (match (status:exit-val | ||||
|           (system* "btrfs" "device" "scan")) | ||||
|     (0 'pass) | ||||
|     (_ 'fatal-error))) | ||||
| 
 | ||||
|  | ||||
| ;;; | ||||
|  | @ -146,37 +194,22 @@ if DEVICE does not contain an ext2 file system." | |||
|   ;; Endianness of LUKS headers. | ||||
|   (identifier-syntax (endianness big))) | ||||
| 
 | ||||
| (define-syntax %luks-header-size | ||||
|   ;; Size in bytes of the LUKS header, including key slots. | ||||
|   (identifier-syntax 592)) | ||||
| 
 | ||||
| (define %luks-magic | ||||
|   ;; The 'LUKS_MAGIC' constant. | ||||
|   (u8-list->bytevector (append (map char->integer (string->list "LUKS")) | ||||
|                                (list #xba #xbe)))) | ||||
| 
 | ||||
| (define (sub-bytevector bv start size) | ||||
|   "Return a copy of the SIZE bytes of BV starting from offset START." | ||||
|   (let ((result (make-bytevector size))) | ||||
|     (bytevector-copy! bv start result 0 size) | ||||
|     result)) | ||||
| (define (luks-superblock? sblock) | ||||
|   "Return #t when SBLOCK is a luks superblock." | ||||
|   (define %luks-magic | ||||
|     ;; The 'LUKS_MAGIC' constant. | ||||
|     (u8-list->bytevector (append (map char->integer (string->list "LUKS")) | ||||
|                                  (list #xba #xbe)))) | ||||
|   (let ((magic   (sub-bytevector sblock 0 6)) | ||||
|         (version (bytevector-u16-ref sblock 6 %luks-endianness))) | ||||
|     (and (bytevector=? magic %luks-magic) | ||||
|          (= version 1)))) | ||||
| 
 | ||||
| (define (read-luks-header file) | ||||
|   "Read a LUKS header from FILE.  Return the raw header on success, and #f if | ||||
| not valid header was found." | ||||
|   (call-with-input-file file | ||||
|     (lambda (port) | ||||
|       (let ((header (make-bytevector %luks-header-size))) | ||||
|         (match (get-bytevector-n! port header 0 (bytevector-length header)) | ||||
|           ((? eof-object?) | ||||
|            #f) | ||||
|           ((? number? len) | ||||
|            (and (= len (bytevector-length header)) | ||||
|                 (let ((magic   (sub-bytevector header 0 6)) ;XXX: inefficient | ||||
|                       (version (bytevector-u16-ref header 6 %luks-endianness))) | ||||
|                   (and (bytevector=? magic %luks-magic) | ||||
|                        (= version 1) | ||||
|                        header))))))))) | ||||
|   ;; Size in bytes of the LUKS header, including key slots. | ||||
|   (read-superblock file 0 592 luks-superblock?)) | ||||
| 
 | ||||
| (define (luks-header-uuid header) | ||||
|   "Return the LUKS UUID from HEADER, as a 16-byte bytevector." | ||||
|  | @ -242,56 +275,77 @@ warning and #f as the result." | |||
|                 (else | ||||
|                  (apply throw args)))))))) | ||||
| 
 | ||||
| (define (partition-predicate read field =) | ||||
| (define (partition-field-reader read field) | ||||
|   "Return a procedure that takes a device and returns the value of a FIELD in | ||||
| the partition superblock or #f." | ||||
|   (let ((read (ENOENT-safe read))) | ||||
|     (lambda (device) | ||||
|       (let ((sblock (read device))) | ||||
|         (and sblock | ||||
|              (field sblock)))))) | ||||
| 
 | ||||
| (define (read-partition-field device partition-field-readers) | ||||
|   "Returns the value of a FIELD in the partition superblock of DEVICE or #f. It | ||||
| takes a list of PARTITION-FIELD-READERS and returns the result of the first | ||||
| partition field reader that returned a value." | ||||
|   (match (filter-map (cut apply <> (list device)) partition-field-readers) | ||||
|     ((field . _) field) | ||||
|     (_ #f))) | ||||
| 
 | ||||
| (define %partition-label-readers | ||||
|   (list (partition-field-reader read-ext2-superblock | ||||
|                                 ext2-superblock-volume-name) | ||||
|         (partition-field-reader read-btrfs-superblock | ||||
|                                 btrfs-superblock-volume-name))) | ||||
| 
 | ||||
| (define %partition-uuid-readers | ||||
|   (list (partition-field-reader read-ext2-superblock | ||||
|                                 ext2-superblock-uuid) | ||||
|         (partition-field-reader read-btrfs-superblock | ||||
|                                 btrfs-superblock-uuid))) | ||||
| 
 | ||||
| (define read-partition-label | ||||
|   (cut read-partition-field <> %partition-label-readers)) | ||||
| 
 | ||||
| (define read-partition-uuid | ||||
|   (cut read-partition-field <> %partition-uuid-readers)) | ||||
| 
 | ||||
| (define (partition-predicate reader =) | ||||
|   "Return a predicate that returns true if the FIELD of partition header that | ||||
| was READ is = to the given value." | ||||
|   (let ((read (ENOENT-safe read))) | ||||
|     (lambda (expected) | ||||
|       "Return a procedure that, when applied to a partition name such as \"sda1\", | ||||
| returns #t if that partition's volume name is LABEL." | ||||
|       (lambda (part) | ||||
|         (let* ((device (string-append "/dev/" part)) | ||||
|                (sblock (read device))) | ||||
|           (and sblock | ||||
|                (let ((actual (field sblock))) | ||||
|                  (and actual | ||||
|                       (= actual expected))))))))) | ||||
|   (lambda (expected) | ||||
|     (lambda (device) | ||||
|       (let ((actual (reader device))) | ||||
|         (and actual | ||||
|              (= actual expected)))))) | ||||
| 
 | ||||
| (define partition-label-predicate | ||||
|   (partition-predicate read-ext2-superblock | ||||
|                        ext2-superblock-volume-name | ||||
|                        string=?)) | ||||
|   (partition-predicate read-partition-label string=?)) | ||||
| 
 | ||||
| (define partition-uuid-predicate | ||||
|   (partition-predicate read-ext2-superblock | ||||
|                        ext2-superblock-uuid | ||||
|                        bytevector=?)) | ||||
|   (partition-predicate read-partition-uuid bytevector=?)) | ||||
| 
 | ||||
| (define partition-luks-uuid-predicate | ||||
|   (partition-predicate read-luks-header | ||||
|                        luks-header-uuid | ||||
|                        bytevector=?)) | ||||
| (define luks-partition-uuid-predicate | ||||
|   (partition-predicate | ||||
|    (partition-field-reader read-luks-header luks-header-uuid) | ||||
|    bytevector=?)) | ||||
| 
 | ||||
| (define (find-partition-by-label label) | ||||
|   "Return the first partition found whose volume name is LABEL, or #f if none | ||||
| (define (find-partition predicate) | ||||
|   "Return the first partition found that matches PREDICATE, or #f if none | ||||
| were found." | ||||
|   (and=> (find (partition-label-predicate label) | ||||
|                (disk-partitions)) | ||||
|          (cut string-append "/dev/" <>))) | ||||
|   (lambda (expected) | ||||
|     (find (predicate expected) | ||||
|           (map (cut string-append "/dev/" <>) | ||||
|                (disk-partitions))))) | ||||
| 
 | ||||
| (define (find-partition-by-uuid uuid) | ||||
|   "Return the first partition whose unique identifier is UUID (a bytevector), | ||||
| or #f if none was found." | ||||
|   (and=> (find (partition-uuid-predicate uuid) | ||||
|                (disk-partitions)) | ||||
|          (cut string-append "/dev/" <>))) | ||||
| (define find-partition-by-label | ||||
|   (find-partition partition-label-predicate)) | ||||
| 
 | ||||
| (define (find-partition-by-luks-uuid uuid) | ||||
|   "Return the first LUKS partition whose unique identifier is UUID (a bytevector), | ||||
| or #f if none was found." | ||||
|   (and=> (find (partition-luks-uuid-predicate uuid) | ||||
|                (disk-partitions)) | ||||
|          (cut string-append "/dev/" <>))) | ||||
| (define find-partition-by-uuid | ||||
|   (find-partition partition-uuid-predicate)) | ||||
| 
 | ||||
| (define find-partition-by-luks-uuid | ||||
|   (find-partition luks-partition-uuid-predicate)) | ||||
| 
 | ||||
|  | ||||
| ;;; | ||||
|  | @ -412,26 +466,34 @@ the following: | |||
| 
 | ||||
| (define (check-file-system device type) | ||||
|   "Run a file system check of TYPE on DEVICE." | ||||
|   (define fsck | ||||
|     (string-append "fsck." type)) | ||||
|   (define check-procedure | ||||
|     (cond | ||||
|      ((string-prefix? "ext" type) check-ext2-file-system) | ||||
|      ((string-prefix? "btrfs" type) check-btrfs-file-system) | ||||
|      (else #f))) | ||||
| 
 | ||||
|   (let ((status (system* fsck "-v" "-p" "-C" "0" device))) | ||||
|     (match (status:exit-val status) | ||||
|       (0 | ||||
|        #t) | ||||
|       (1 | ||||
|        (format (current-error-port) "'~a' corrected errors on ~a; continuing~%" | ||||
|                fsck device)) | ||||
|       (2 | ||||
|        (format (current-error-port) "'~a' corrected errors on ~a; rebooting~%" | ||||
|                fsck device) | ||||
|        (sleep 3) | ||||
|        (reboot)) | ||||
|       (code | ||||
|        (format (current-error-port) "'~a' exited with code ~a on ~a; \ | ||||
| spawning Bourne-like REPL~%" | ||||
|                fsck code device) | ||||
|        (start-repl %bournish-language))))) | ||||
|   (if check-procedure | ||||
|       (match (check-procedure device) | ||||
|         ('pass | ||||
|          #t) | ||||
|         ('errors-corrected | ||||
|          (format (current-error-port) | ||||
|                  "File system check corrected errors on ~a; continuing~%" | ||||
|                  device)) | ||||
|         ('reboot-required | ||||
|          (format (current-error-port) | ||||
|                  "File system check corrected errors on ~a; rebooting~%" | ||||
|                  device) | ||||
|          (sleep 3) | ||||
|          (reboot)) | ||||
|         ('fatal-error | ||||
|          (format (current-error-port) | ||||
|                  "File system check on ~a failed; spawning Bourne-like REPL~%" | ||||
|                  device) | ||||
|          (start-repl %bournish-language))) | ||||
|       (format (current-error-port) | ||||
|               "No file system check procedure for ~a; skipping~%" | ||||
|               device))) | ||||
| 
 | ||||
| (define (mount-flags->bit-mask flags) | ||||
|   "Return the number suitable for the 'flags' argument of 'mount' that | ||||
|  |  | |||
							
								
								
									
										46
									
								
								gnu/local.mk
									
										
									
									
									
								
							
							
						
						
									
										46
									
								
								gnu/local.mk
									
										
									
									
									
								
							|  | @ -7,7 +7,7 @@ | |||
| # Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
 | ||||
| # Copyright © 2016 Rene Saavedra <rennes@openmailbox.org>
 | ||||
| # Copyright © 2016 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org>
 | ||||
| # Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 | ||||
| # Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
 | ||||
| # Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 | ||||
| #
 | ||||
| # This file is part of GNU Guix.
 | ||||
|  | @ -183,6 +183,7 @@ GNU_SYSTEM_MODULES =				\ | |||
|   %D%/packages/hurd.scm				\
 | ||||
|   %D%/packages/ibus.scm				\
 | ||||
|   %D%/packages/icu4c.scm			\
 | ||||
|   %D%/packages/idris.scm			\
 | ||||
|   %D%/packages/idutils.scm			\
 | ||||
|   %D%/packages/image.scm			\
 | ||||
|   %D%/packages/image-viewers.scm	\
 | ||||
|  | @ -271,6 +272,7 @@ GNU_SYSTEM_MODULES =				\ | |||
|   %D%/packages/networking.scm			\
 | ||||
|   %D%/packages/nfs.scm                          \
 | ||||
|   %D%/packages/nickle.scm                       \
 | ||||
|   %D%/packages/nim.scm  			\
 | ||||
|   %D%/packages/ninja.scm			\
 | ||||
|   %D%/packages/node.scm				\
 | ||||
|   %D%/packages/noweb.scm			\
 | ||||
|  | @ -321,6 +323,7 @@ GNU_SYSTEM_MODULES =				\ | |||
|   %D%/packages/rsync.scm			\
 | ||||
|   %D%/packages/ruby.scm				\
 | ||||
|   %D%/packages/rush.scm				\
 | ||||
|   %D%/packages/rust.scm				\
 | ||||
|   %D%/packages/samba.scm			\
 | ||||
|   %D%/packages/sawfish.scm			\
 | ||||
|   %D%/packages/scanner.scm			\
 | ||||
|  | @ -412,6 +415,7 @@ GNU_SYSTEM_MODULES =				\ | |||
|   %D%/services/lirc.scm				\
 | ||||
|   %D%/services/mail.scm				\
 | ||||
|   %D%/services/mcron.scm			\
 | ||||
|   %D%/services/messaging.scm			\
 | ||||
|   %D%/services/networking.scm			\
 | ||||
|   %D%/services/nfs.scm			\
 | ||||
|   %D%/services/shepherd.scm			\
 | ||||
|  | @ -450,6 +454,7 @@ GNU_SYSTEM_MODULES =				\ | |||
| 						\
 | ||||
|   %D%/tests.scm					\
 | ||||
|   %D%/tests/base.scm				\
 | ||||
|   %D%/tests/nfs.scm				\
 | ||||
|   %D%/tests/install.scm				\
 | ||||
|   %D%/tests/mail.scm				\
 | ||||
|   %D%/tests/ssh.scm | ||||
|  | @ -495,6 +500,7 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/calibre-drop-unrar.patch			\
 | ||||
|   %D%/packages/patches/calibre-no-updates-dialog.patch		\
 | ||||
|   %D%/packages/patches/cdparanoia-fpic.patch			\
 | ||||
|   %D%/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch	\
 | ||||
|   %D%/packages/patches/chmlib-inttypes.patch			\
 | ||||
|   %D%/packages/patches/clang-libc-search-path.patch		\
 | ||||
|   %D%/packages/patches/clang-3.8-libc-search-path.patch		\
 | ||||
|  | @ -505,6 +511,7 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/cpio-CVE-2016-2037.patch			\
 | ||||
|   %D%/packages/patches/cpufrequtils-fix-aclocal.patch		\
 | ||||
|   %D%/packages/patches/cracklib-CVE-2016-6318.patch		\
 | ||||
|   %D%/packages/patches/cracklib-fix-buffer-overflow.patch	\
 | ||||
|   %D%/packages/patches/crda-optional-gcrypt.patch		\
 | ||||
|   %D%/packages/patches/crossmap-allow-system-pysam.patch	\
 | ||||
|   %D%/packages/patches/csound-header-ordering.patch		\
 | ||||
|  | @ -586,6 +593,7 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/gmp-faulty-test.patch			\
 | ||||
|   %D%/packages/patches/gnome-tweak-tool-search-paths.patch	\
 | ||||
|   %D%/packages/patches/gnucash-price-quotes-perl.patch		\
 | ||||
|   %D%/packages/patches/gnupg-test-segfault-on-32bit-arch.patch	\
 | ||||
|   %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \
 | ||||
|   %D%/packages/patches/gobject-introspection-cc.patch		\
 | ||||
|   %D%/packages/patches/gobject-introspection-girepository.patch	\
 | ||||
|  | @ -633,10 +641,11 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/icu4c-CVE-2015-4760.patch		\
 | ||||
|   %D%/packages/patches/id3lib-CVE-2007-4460.patch			\
 | ||||
|   %D%/packages/patches/ilmbase-fix-tests.patch			\
 | ||||
|   %D%/packages/patches/inkscape-drop-wait-for-targets.patch	\
 | ||||
|   %D%/packages/patches/isl-0.11.1-aarch64-support.patch	\
 | ||||
|   %D%/packages/patches/jbig2dec-ignore-testtest.patch		\
 | ||||
|   %D%/packages/patches/jq-CVE-2015-8863.patch			\
 | ||||
|   %D%/packages/patches/kdbusaddons-kinit-file-name.patch	\
 | ||||
|   %D%/packages/patches/khal-disable-failing-tests.patch		\
 | ||||
|   %D%/packages/patches/khmer-use-libraries.patch                \
 | ||||
|   %D%/packages/patches/kmod-module-directory.patch		\
 | ||||
|   %D%/packages/patches/kobodeluxe-paths.patch			\
 | ||||
|  | @ -671,12 +680,29 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/libmad-armv7-thumb-pt2.patch		\
 | ||||
|   %D%/packages/patches/libmad-frame-length.patch		\
 | ||||
|   %D%/packages/patches/libmad-mips-newgcc.patch			\
 | ||||
|   %D%/packages/patches/libpng-CVE-2016-10087.patch		\
 | ||||
|   %D%/packages/patches/libssh-0.6.5-CVE-2016-0739.patch		\
 | ||||
|   %D%/packages/patches/libtar-CVE-2013-4420.patch \
 | ||||
|   %D%/packages/patches/libtheora-config-guess.patch		\
 | ||||
|   %D%/packages/patches/libtiff-CVE-2016-10092.patch		\
 | ||||
|   %D%/packages/patches/libtiff-CVE-2016-10093.patch		\
 | ||||
|   %D%/packages/patches/libtiff-CVE-2016-10094.patch		\
 | ||||
|   %D%/packages/patches/libtiff-assertion-failure.patch		\
 | ||||
|   %D%/packages/patches/libtiff-divide-by-zero-ojpeg.patch	\
 | ||||
|   %D%/packages/patches/libtiff-divide-by-zero-tiffcp.patch	\
 | ||||
|   %D%/packages/patches/libtiff-divide-by-zero-tiffcrop.patch	\
 | ||||
|   %D%/packages/patches/libtiff-divide-by-zero.patch		\
 | ||||
|   %D%/packages/patches/libtiff-heap-overflow-pixarlog-luv.patch	\
 | ||||
|   %D%/packages/patches/libtiff-heap-overflow-tif-dirread.patch	\
 | ||||
|   %D%/packages/patches/libtiff-heap-overflow-tiffcp.patch	\
 | ||||
|   %D%/packages/patches/libtiff-heap-overflow-tiffcrop.patch	\
 | ||||
|   %D%/packages/patches/libtiff-invalid-read.patch		\
 | ||||
|   %D%/packages/patches/libtiff-null-dereference.patch		\
 | ||||
|   %D%/packages/patches/libtiff-tiffcp-underflow.patch		\
 | ||||
|   %D%/packages/patches/libtool-skip-tests2.patch		\
 | ||||
|   %D%/packages/patches/libunwind-CVE-2015-3239.patch		\
 | ||||
|   %D%/packages/patches/libupnp-CVE-2016-6255.patch		\
 | ||||
|   %D%/packages/patches/libupnp-CVE-2016-8863.patch		\
 | ||||
|   %D%/packages/patches/libvpx-CVE-2016-2818.patch		\
 | ||||
|   %D%/packages/patches/libwebp-CVE-2016-9085.patch		\
 | ||||
|   %D%/packages/patches/libwmf-CAN-2004-0941.patch		\
 | ||||
|  | @ -691,6 +717,8 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/libwmf-CVE-2015-0848+CVE-2015-4588.patch	\
 | ||||
|   %D%/packages/patches/libwmf-CVE-2015-4695.patch		\
 | ||||
|   %D%/packages/patches/libwmf-CVE-2015-4696.patch		\
 | ||||
|   %D%/packages/patches/libxml2-CVE-2016-4658.patch		\
 | ||||
|   %D%/packages/patches/libxml2-CVE-2016-5131.patch		\
 | ||||
|   %D%/packages/patches/libxslt-generated-ids.patch		\
 | ||||
|   %D%/packages/patches/libxslt-CVE-2016-4738.patch		\
 | ||||
|   %D%/packages/patches/linux-pam-no-setfsuid.patch		\
 | ||||
|  | @ -722,6 +750,7 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/mpc123-initialize-ao.patch		\
 | ||||
|   %D%/packages/patches/mplayer2-theora-fix.patch		\
 | ||||
|   %D%/packages/patches/module-init-tools-moduledir.patch	\
 | ||||
|   %D%/packages/patches/multiqc-fix-git-subprocess-error.patch	\
 | ||||
|   %D%/packages/patches/mumps-build-parallelism.patch		\
 | ||||
|   %D%/packages/patches/mupdf-build-with-openjpeg-2.1.patch	\
 | ||||
|   %D%/packages/patches/mupen64plus-ui-console-notice.patch	\
 | ||||
|  | @ -740,7 +769,10 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/nvi-assume-preserve-path.patch		\
 | ||||
|   %D%/packages/patches/nvi-dbpagesize-binpower.patch		\
 | ||||
|   %D%/packages/patches/nvi-db4.patch				\
 | ||||
|   %D%/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch	\
 | ||||
|   %D%/packages/patches/ocaml-bitstring-fix-configure.patch \
 | ||||
|   %D%/packages/patches/ocaml-CVE-2015-8869.patch		\
 | ||||
|   %D%/packages/patches/ocaml-Add-a-.file-directive.patch	\
 | ||||
|   %D%/packages/patches/ocaml-findlib-make-install.patch	\
 | ||||
|   %D%/packages/patches/ola-readdir-r.patch			\
 | ||||
|   %D%/packages/patches/openexr-missing-samples.patch		\
 | ||||
|  | @ -749,7 +781,6 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch		\
 | ||||
|   %D%/packages/patches/openjpeg-use-after-free-fix.patch	\
 | ||||
|   %D%/packages/patches/openocd-nrf52.patch			\
 | ||||
|   %D%/packages/patches/openssh-memory-exhaustion.patch		\
 | ||||
|   %D%/packages/patches/openssl-runpath.patch			\
 | ||||
|   %D%/packages/patches/openssl-1.1.0-c-rehash-in.patch		\
 | ||||
|   %D%/packages/patches/openssl-c-rehash-in.patch		\
 | ||||
|  | @ -806,7 +837,6 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/python-3-search-paths.patch		\
 | ||||
|   %D%/packages/patches/python-3.4-fix-tests.patch		\
 | ||||
|   %D%/packages/patches/python-3.5-fix-tests.patch		\
 | ||||
|   %D%/packages/patches/python-dendropy-exclude-failing-tests.patch \
 | ||||
|   %D%/packages/patches/python-file-double-encoding-bug.patch	\
 | ||||
|   %D%/packages/patches/python-fix-tests.patch			\
 | ||||
|   %D%/packages/patches/python-parse-too-many-fields.patch	\
 | ||||
|  | @ -816,10 +846,9 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/python-paste-remove-website-test.patch	\
 | ||||
|   %D%/packages/patches/python-paste-remove-timing-test.patch	\
 | ||||
|   %D%/packages/patches/python-pyopenssl-skip-network-test.patch	\
 | ||||
|   %D%/packages/patches/python-pycrypto-CVE-2013-7459.patch	\
 | ||||
|   %D%/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \
 | ||||
|   %D%/packages/patches/qemu-CVE-2016-8576.patch			\
 | ||||
|   %D%/packages/patches/qemu-CVE-2016-8577.patch			\
 | ||||
|   %D%/packages/patches/qemu-CVE-2016-8578.patch			\
 | ||||
|   %D%/packages/patches/python-pygpgme-fix-pinentry-tests.patch	\
 | ||||
|   %D%/packages/patches/qt4-ldflags.patch			\
 | ||||
|   %D%/packages/patches/quickswitch-fix-dmenu-check.patch	\
 | ||||
|   %D%/packages/patches/rapicorn-isnan.patch			\
 | ||||
|  | @ -834,7 +863,6 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/ruby-puma-ignore-broken-test.patch       \
 | ||||
|   %D%/packages/patches/ruby-rack-ignore-failing-test.patch      \
 | ||||
|   %D%/packages/patches/ruby-tzinfo-data-ignore-broken-test.patch\
 | ||||
|   %D%/packages/patches/ruby-yard-fix-skip-of-markdown-tests.patch \
 | ||||
|   %D%/packages/patches/sed-hurd-path-max.patch			\
 | ||||
|   %D%/packages/patches/scheme48-tests.patch			\
 | ||||
|   %D%/packages/patches/scotch-test-threading.patch		\
 | ||||
|  | @ -847,7 +875,6 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/slim-sigusr1.patch			\
 | ||||
|   %D%/packages/patches/slim-reset.patch				\
 | ||||
|   %D%/packages/patches/slim-login.patch				\
 | ||||
|   %D%/packages/patches/slock-CVE-2016-6866.patch		\
 | ||||
|   %D%/packages/patches/slurm-configure-remove-nonfree-contribs.patch \
 | ||||
|   %D%/packages/patches/soprano-find-clucene.patch		\
 | ||||
|   %D%/packages/patches/steghide-fixes.patch			\
 | ||||
|  | @ -875,6 +902,7 @@ dist_patch_DATA =						\ | |||
|   %D%/packages/patches/tophat-build-with-later-seqan.patch	\
 | ||||
|   %D%/packages/patches/totem-debug-format-fix.patch		\
 | ||||
|   %D%/packages/patches/tuxpaint-stamps-path.patch		\
 | ||||
|   %D%/packages/patches/unrtf-CVE-2016-10091.patch		\
 | ||||
|   %D%/packages/patches/unzip-CVE-2014-8139.patch		\
 | ||||
|   %D%/packages/patches/unzip-CVE-2014-8140.patch		\
 | ||||
|   %D%/packages/patches/unzip-CVE-2014-8141.patch		\
 | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ | |||
|   #:use-module (guix packages) | ||||
|   #:use-module (guix download) | ||||
|   #:use-module (guix build-system gnu) | ||||
|   #:use-module (guix build-system glib-or-gtk) | ||||
|   #:use-module (gnu packages) | ||||
|   #:use-module (gnu packages autotools) | ||||
|   #:use-module (gnu packages boost) | ||||
|  | @ -52,11 +53,17 @@ | |||
|                          "/source/" name "-" version ".tar.gz")) | ||||
|         (sha256 | ||||
|           (base32 "1ik591rx15nn3n1297cwykl8wvrlgj78i528id9wbidgy3xzd570")) | ||||
|         (modules '((guix build utils))) | ||||
|         (snippet | ||||
|          ;; Ensure reproducibility. | ||||
|          '(substitute* "src/wp/main/xp/abi_ver.cpp" | ||||
|             (("__DATE__") "\"2017\"") | ||||
|             (("__TIME__") "\"00:00\""))) | ||||
|         (patches | ||||
|          (search-patches "abiword-wmf-version-lookup-fix.patch" | ||||
|                          "abiword-explictly-cast-bools.patch")))) | ||||
| 
 | ||||
|     (build-system gnu-build-system) | ||||
|     (build-system glib-or-gtk-build-system) | ||||
|     (arguments                   ;; NOTE: rsvg is disabled, since Abiword | ||||
|       `(#:configure-flags        ;; supports it directly, and its BS is broken. | ||||
|         (list | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ | |||
| ;;; Copyright © 2016 Leo Famulari <leo@famulari.name> | ||||
| ;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl> | ||||
| ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Peter Feigl <peter.feigl@nexoid.at> | ||||
| ;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net> | ||||
| ;;; Coypright © 2016 ng0 <ng0@we.make.ritual.n0.is> | ||||
|  | @ -362,7 +362,7 @@ login, passwd, su, groupadd, and useradd.") | |||
|        #:tests? #f))                              ; no tests | ||||
|     (inputs `(("shadow" ,shadow))) | ||||
| 
 | ||||
|     (home-page "http://sourceforge.net/projects/mingetty") | ||||
|     (home-page "https://sourceforge.net/projects/mingetty") | ||||
|     (synopsis "Getty for the text console") | ||||
|     (description | ||||
|      "Small console getty that is started on the Linux text console, | ||||
|  | @ -471,7 +471,7 @@ connection alive.") | |||
|          (bind-minor-version "9") | ||||
|          (bind-patch-version "9") | ||||
|          (bind-release-type "-P")         ; for patch release, use "-P" | ||||
|          (bind-release-version "4")      ; for patch release, e.g. "4" | ||||
|          (bind-release-version "5")      ; for patch release, e.g. "4" | ||||
|          (bind-version (string-append bind-major-version | ||||
|                                       "." | ||||
|                                       bind-minor-version | ||||
|  | @ -587,7 +587,7 @@ connection alive.") | |||
|                                         "/bind-" bind-version ".tar.gz")) | ||||
|                     (sha256 | ||||
|                      (base32 | ||||
|                       "1qpi23lrs6jfxqx8dakbqfyg3hvrzq5ldchg6my19xcvx8515mgx")))) | ||||
|                       "1yn15chkfqf4d7961ip2x10jm27a9wqymz2xqh0a2g89arrirkaw")))) | ||||
| 
 | ||||
|                 ;; When cross-compiling, we need the cross Coreutils and sed. | ||||
|                 ;; Otherwise just use those from %FINAL-INPUTS. | ||||
|  | @ -717,7 +717,7 @@ by bandwidth they use.") | |||
|              `("PERL5LIB" ":" prefix (,x11-inc ,tk-inc))))) | ||||
|         %standard-phases))) | ||||
|     ;; The clusterssh.sourceforge.net address requires login to view | ||||
|     (home-page "http://sourceforge.net/projects/clusterssh/") | ||||
|     (home-page "https://sourceforge.net/projects/clusterssh/") | ||||
|     (synopsis "Secure concurrent multi-server terminal control") | ||||
|     (description | ||||
|      "ClusterSSH controls a number of xterm windows via a single graphical | ||||
|  | @ -790,7 +790,7 @@ system administrator.") | |||
| (define-public sudo | ||||
|   (package | ||||
|     (name "sudo") | ||||
|     (version "1.8.17p1") | ||||
|     (version "1.8.19p1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri | ||||
|  | @ -800,7 +800,7 @@ system administrator.") | |||
|                                     version ".tar.gz"))) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1k2mn65l1kmsxm8wh0gjxy496xhbpiimbpm6yv6kw6snzc3xg466")))) | ||||
|                 "14pwdwl03kdbbyjkvxrfx409x3c1fjqz8aqz2wgwddinhz7v3bxq")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:configure-flags | ||||
|  | @ -1568,14 +1568,14 @@ done with the @code{auditctl} utility.") | |||
| (define-public nmap | ||||
|   (package | ||||
|     (name "nmap") | ||||
|     (version "7.31") | ||||
|     (version "7.40") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://nmap.org/dist/nmap-" version | ||||
|                                   ".tar.bz2")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0hiqb28950kn4bjsmw0ksfyss7j2qdmgrj3xsjf7073pq01lx7yb")) | ||||
|                 "121i9mgyc28ra2825akd0ix5qyssv4xc2qlx296mam6hzxgnc54y")) | ||||
|               (modules '((guix build utils))) | ||||
|               (snippet | ||||
|                '(map delete-file-recursively | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2012, 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr> | ||||
| ;;; Copyright © 2013, 2015 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2013, 2015, 2017 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr> | ||||
| ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org> | ||||
| ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> | ||||
|  | @ -577,22 +577,6 @@ cosine/ sine transforms or DCT/DST).") | |||
|      (string-append (package-description fftw) | ||||
|                     "  Single-precision version.")))) | ||||
| 
 | ||||
| ;; FIXME: These packages are used temporarily by packages like Ardour until | ||||
| ;; "--enable-flags" is added to the fftw and fftwf packages. | ||||
| (define-public fftw-with-threads | ||||
|   (package (inherit fftw) | ||||
|     (arguments | ||||
|      (substitute-keyword-arguments (package-arguments fftw) | ||||
|        ((#:configure-flags flags) | ||||
|         `(cons "--enable-threads" ,flags)))))) | ||||
| 
 | ||||
| (define-public fftwf-with-threads | ||||
|   (package (inherit fftwf) | ||||
|     (arguments | ||||
|      (substitute-keyword-arguments (package-arguments fftwf) | ||||
|        ((#:configure-flags flags) | ||||
|         `(cons "--enable-threads" ,flags)))))) | ||||
| 
 | ||||
| (define-public fftw-openmpi | ||||
|   (package (inherit fftw) | ||||
|     (name "fftw-openmpi") | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| ;;; Copyright © 2016 John Darrington <jmd@gnu.org> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Christopher Andersson <christopher@8bits.nu> | ||||
| ;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -65,7 +66,8 @@ dictionaries, including personal ones.") | |||
| ;;; | ||||
| ;;; Dictionaries. | ||||
| ;;; | ||||
| ;;; Use 'export ASPELL_CONF="dict-dir $HOME/.guix-profile/lib/aspell"' to use them. | ||||
| ;;; Use 'export ASPELL_CONF="dict-dir $HOME/.guix-profile/lib/aspell"' to use | ||||
| ;;; them. | ||||
| ;;; | ||||
| 
 | ||||
| (define* (aspell-dictionary dict-name full-name | ||||
|  | @ -81,16 +83,17 @@ dictionaries, including personal ones.") | |||
|               (sha256 sha256))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:phases (alist-replace | ||||
|                  'configure | ||||
|                  (lambda* (#:key outputs #:allow-other-keys) | ||||
|                    (let ((out (assoc-ref outputs "out"))) | ||||
|                      (zero? (system* "./configure")))) | ||||
|                  %standard-phases) | ||||
|                 #:make-flags (let ((out (assoc-ref %outputs "out"))) | ||||
|                                (list (string-append "dictdir=" out "/lib/aspell") | ||||
|                                      (string-append "datadir=" out "/lib/aspell"))) | ||||
|                 #:tests? #f)) | ||||
|      `(#:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (replace 'configure | ||||
|            (lambda* (#:key outputs #:allow-other-keys) | ||||
|              (let ((out (assoc-ref outputs "out"))) | ||||
|                (zero? (system* "./configure")))))) | ||||
|        #:make-flags | ||||
|        (let ((out (assoc-ref %outputs "out"))) | ||||
|          (list (string-append "dictdir=" out "/lib/aspell") | ||||
|                (string-append "datadir=" out "/lib/aspell"))) | ||||
|        #:tests? #f)) | ||||
|     (native-inputs `(("aspell" ,aspell) | ||||
|                      ("which" ,which))) | ||||
|     (synopsis (string-append full-name " dictionary for GNU Aspell")) ; XXX: i18n | ||||
|  | @ -172,3 +175,18 @@ dictionaries, including personal ones.") | |||
|                      #:sha256 | ||||
|                      (base32 | ||||
|                       "02jwkjhr32kvyibnyzgx3smbnm576jwdzg3avdf6zxwckhy5fw4v"))) | ||||
| 
 | ||||
| (define-public aspell-dict-el | ||||
|   (aspell-dictionary "el" "Greek" | ||||
|                      #:version "0.08-0" | ||||
|                      #:prefix "aspell6-" | ||||
|                      #:sha256 | ||||
|                      (base32 | ||||
|                       "1ljcc30zg2v2h3w5h5jr5im41mw8jbsgvvhdd2cii2yzi8d0zxja"))) | ||||
| 
 | ||||
| (define-public aspell-dict-grc | ||||
|   (aspell-dictionary "grc" "Ancient Greek" | ||||
|                      #:version "0.02-0" | ||||
|                      #:sha256 | ||||
|                      (base32 | ||||
|                       "1zxr8958v37v260fkqd4pg37ns5h5kyqm54hn1hg70wq5cz8h512"))) | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| ;;; Copyright © 2015 Alex Kost <alezost@gmail.com> | ||||
| ;;; Copyright © 2015, 2016 Mark H Weaver <mhw@netris.org> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com> | ||||
| ;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com> | ||||
| ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> | ||||
| ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org> | ||||
| ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> | ||||
|  | @ -223,6 +223,7 @@ namespace ARDOUR { const char* revision = \"" version "\" ; }"))))) | |||
|        ("boost" ,boost) | ||||
|        ("atkmm" ,atkmm) | ||||
|        ("cairomm" ,cairomm) | ||||
|        ("eudev" ,eudev) | ||||
|        ("gtkmm" ,gtkmm-2) | ||||
|        ("glibmm" ,glibmm) | ||||
|        ("libart-lgpl" ,libart-lgpl) | ||||
|  | @ -238,8 +239,8 @@ namespace ARDOUR { const char* revision = \"" version "\" ; }"))))) | |||
|        ("lv2" ,lv2) | ||||
|        ("vamp" ,vamp) | ||||
|        ("curl" ,curl) | ||||
|        ("fftw" ,fftw-with-threads) | ||||
|        ("fftwf" ,fftwf-with-threads) | ||||
|        ("fftw" ,fftw) | ||||
|        ("fftwf" ,fftwf) | ||||
|        ("jack" ,jack-1) | ||||
|        ("serd" ,serd) | ||||
|        ("sord" ,sord) | ||||
|  | @ -1448,7 +1449,7 @@ connections between them.") | |||
|     (build-system gnu-build-system) | ||||
|     (native-inputs `(("pkg-config" ,pkg-config))) | ||||
|     (inputs `(("libsndfile" ,libsndfile))) | ||||
|     (home-page "http://sourceforge.net/projects/bs2b/") | ||||
|     (home-page "https://sourceforge.net/projects/bs2b/") | ||||
|     (synopsis "Bauer stereophonic-to-binaural DSP") | ||||
|     (description | ||||
|      "The Bauer stereophonic-to-binaural DSP (bs2b) library and plugins is | ||||
|  | @ -2279,7 +2280,7 @@ can play and record audio files.") | |||
|         (base32 "1hmadwqfpg15vhwq9pa1sl5xslibrjpk6hpq2s9hfmx1s5l6ihfw")))) | ||||
|     (build-system cmake-build-system) | ||||
|     (arguments '(#:tests? #f))          ;no 'check' target | ||||
|     (home-page "http://sourceforge.net/p/soxr/wiki/Home/") | ||||
|     (home-page "https://sourceforge.net/p/soxr/wiki/Home/") | ||||
|     (synopsis "One-dimensional sample-rate conversion library") | ||||
|     (description | ||||
|      "The SoX Resampler library (libsoxr) performs one-dimensional sample-rate | ||||
|  | @ -2699,7 +2700,7 @@ with support for HD extensions.") | |||
| (define-public bs1770gain | ||||
|   (package | ||||
|     (name "bs1770gain") | ||||
|     (version "0.4.11") | ||||
|     (version "0.4.12") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|  | @ -2707,7 +2708,7 @@ with support for HD extensions.") | |||
|                            version "/bs1770gain-" version ".tar.gz")) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "0j765drdb7h3y5ipjv9sg1a0if6zh8cksbv3rdk5ppd7kxcrjnlb")))) | ||||
|          "0n9skdap1vnl6w52fx0gsrjlk7w3xgdwi62ycyf96h29rx059z6a")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (inputs `(("ffmpeg" ,ffmpeg) | ||||
|               ("sox" ,sox))) | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
| ;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org> | ||||
| ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net> | ||||
| ;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name> | ||||
| ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -404,13 +405,13 @@ detection, and lossless compression.") | |||
| (define-public borg | ||||
|   (package | ||||
|     (name "borg") | ||||
|     (version "1.0.8") | ||||
|     (version "1.0.9") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (pypi-uri "borgbackup" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1fdfi0yzzdrrlml6780n4fh61sqm7pw6fcd1y67kfkvw8hy5c0k9")) | ||||
|                 "1ciwp9yilcibk0x82y5nn8ps95jrm8rxvff8mjrlp7a2w100i1im")) | ||||
|               (modules '((guix build utils))) | ||||
|               (snippet | ||||
|                '(for-each | ||||
|  | @ -439,25 +440,26 @@ detection, and lossless compression.") | |||
|            (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|              ;; Make the installed package available for the test suite. | ||||
|              (add-installed-pythonpath inputs outputs) | ||||
|              (zero? | ||||
|                (system* "py.test" "-v" "--pyargs" "borg.testsuite" "-k" | ||||
|                         (string-append | ||||
|                           ;; These tests need to write to '/var'. | ||||
|                           "not test_get_cache_dir " | ||||
|                           "and not test_get_keys_dir " | ||||
|                           ;; These tests assume there is a root user in | ||||
|                           ;; '/etc/passwd'. | ||||
|                           "and not test_access_acl " | ||||
|                           "and not test_default_acl " | ||||
|                           "and not test_non_ascii_acl " | ||||
|                           ;; This test needs the unpackaged pytest-benchmark. | ||||
|                           "and not benchmark " | ||||
|                           ;; These tests assume the kernel supports FUSE. They | ||||
|                           ;; were skipped using the "old" Python build system, | ||||
|                           ;; before commit | ||||
|                           ;; 7db40bce58e149ecb541d295e01cfbfe953d39a3. | ||||
|                           "and not test_fuse " | ||||
|                           "and not test_fuse_allow_damaged_files"))))) | ||||
|              ;; The tests should be run in an empty directory. | ||||
|              (mkdir-p "tests") | ||||
|              (with-directory-excursion "tests" | ||||
|                (zero? | ||||
|                  (system* "py.test" "-v" "--pyargs" "borg.testsuite" "-k" | ||||
|                           (string-append | ||||
|                             ;; These tests need to write to '/var'. | ||||
|                             "not test_get_cache_dir " | ||||
|                             "and not test_get_keys_dir " | ||||
|                             "and not test_get_security_dir " | ||||
|                             ;; These tests assume there is a root user in | ||||
|                             ;; '/etc/passwd'. | ||||
|                             "and not test_access_acl " | ||||
|                             "and not test_default_acl " | ||||
|                             "and not test_non_ascii_acl " | ||||
|                             ;; This test needs the unpackaged pytest-benchmark. | ||||
|                             "and not benchmark " | ||||
|                             ;; These tests assume the kernel supports FUSE. | ||||
|                             "and not test_fuse " | ||||
|                             "and not test_fuse_allow_damaged_files")))))) | ||||
|          (add-after 'install 'install-doc | ||||
|            (lambda* (#:key outputs #:allow-other-keys) | ||||
|              (let* ((out (assoc-ref outputs "out")) | ||||
|  | @ -543,3 +545,37 @@ changes are stored.") | |||
|     (home-page "https://attic-backup.org/") | ||||
|     (license license:bsd-3) | ||||
|     (properties `((superseded . ,borg))))) | ||||
| 
 | ||||
| (define-public wimlib | ||||
|   (package | ||||
|     (name "wimlib") | ||||
|     (version "1.10.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://wimlib.net/downloads/" | ||||
|                                   name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0mbz03smlc054i2m9q2sbqymml9m897kfs84q7g81i26y811p6wq")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (native-inputs | ||||
|      `(("pkg-config" ,pkg-config))) | ||||
|     (inputs | ||||
|      `(("fuse" ,fuse) | ||||
|        ("libxml2" ,libxml2) | ||||
|        ("ntfs-3g" ,ntfs-3g) | ||||
|        ("openssl" ,openssl))) | ||||
|     (arguments | ||||
|      `(#:configure-flags (list "--enable-test-support"))) | ||||
|     (home-page "https://wimlib.net/") | ||||
|     (synopsis "WIM file manipulation library and utilities") | ||||
|     (description "wimlib is a C library and set of command-line utilities for | ||||
| creating, modifying, extracting, and mounting archives in the Windows Imaging | ||||
| Format (@dfn{WIM files}).  It can capture and apply WIMs directly from and to | ||||
| NTFS volumes using @code{ntfs-3g}, preserving NTFS-specific attributes.") | ||||
|     ;; wimlib is dual-licenced under version 3 or later of either the GPL or | ||||
|     ;; LGPL, except those files explicitly marked as being released into the | ||||
|     ;; public domain (CC0) in their headers. | ||||
|     (license (list license:gpl3+ | ||||
|                    license:lgpl3+ | ||||
|                    license:cc0)))) | ||||
|  |  | |||
|  | @ -679,14 +679,14 @@ with the Linux kernel.") | |||
|   ;; The Hurd's libc variant. | ||||
|   (package (inherit glibc/linux) | ||||
|     (name "glibc-hurd") | ||||
|     (version "2.19") | ||||
|     (version "2.23") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "http://alpha.gnu.org/gnu/hurd/glibc-" | ||||
|                                   version "-hurd+libpthread-20160518" ".tar.gz")) | ||||
|                                   version "-hurd+libpthread-20161218" ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "12zmdjviybpsdb2kq4cg98rds7909f0cc96fzdahdfrzlxx1q0px")))) | ||||
|                 "0vpdv05j6j3ria5bw8gp468i64gij94cslxkxj9xkfgi6p615b8p")))) | ||||
| 
 | ||||
|     ;; Libc provides <hurd.h>, which includes a bunch of Hurd and Mach headers, | ||||
|     ;; so both should be propagated. | ||||
|  | @ -722,6 +722,9 @@ with the Linux kernel.") | |||
|                        ;; We need this to get a working openpty() function. | ||||
|                        "--enable-pt_chown" | ||||
| 
 | ||||
|                        ;; <https://lists.gnu.org/archive/html/bug-hurd/2016-10/msg00033.html> | ||||
|                        "--disable-werror" | ||||
| 
 | ||||
|                        ;; nscd fails to build for GNU/Hurd: | ||||
|                        ;; <https://lists.gnu.org/archive/html/bug-hurd/2014-07/msg00006.html>. | ||||
|                        ;; Disable it. | ||||
|  |  | |||
|  | @ -1,11 +1,12 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2014, 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2015, 2016 Ben Woodcroft <donttrustben@gmail.com> | ||||
| ;;; Copyright © 2015, 2016 Pjotr Prins <pjotr.guix@thebird.nl> | ||||
| ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr> | ||||
| ;;; Copyright © 2016 Roel Janssen <roel@gnu.org> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> | ||||
| ;;; Copyright © 2016 Raoul Bonnal <ilpuccio.febo@gmail.com> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -1098,7 +1099,7 @@ confidence to have in an alignment.") | |||
|        ("pigz" ,pigz) | ||||
|        ("zlib" ,zlib))) | ||||
|     (supported-systems '("x86_64-linux")) | ||||
|     (home-page "http://sourceforge.net/p/bless-ec/wiki/Home/") | ||||
|     (home-page "https://sourceforge.net/p/bless-ec/wiki/Home/") | ||||
|     (synopsis "Bloom-filter-based error correction tool for NGS reads") | ||||
|     (description | ||||
|      "@dfn{Bloom-filter-based error correction solution for high-throughput | ||||
|  | @ -1479,15 +1480,15 @@ high-throughput sequencing data – with an emphasis on simplicity.") | |||
| (define-public cd-hit | ||||
|   (package | ||||
|     (name "cd-hit") | ||||
|     (version "4.6.5") | ||||
|     (version "4.6.6") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/weizhongli/cdhit" | ||||
|                                   "/releases/download/V" version | ||||
|                                   "/cd-hit-v" version "-2016-0304.tar.gz")) | ||||
|                                   "/cd-hit-v" version "-2016-0711.tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "15db0hq38yyifwqx9b6l34z14jcq576dmjavhj8a426c18lvnhp3")))) | ||||
|                 "1w8hd4fszgg29nqiz569fldwy012la77nljcmlhglgicws56z54p")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:tests? #f ; there are no tests | ||||
|  | @ -1806,7 +1807,7 @@ preparation protocols.") | |||
| (define-public cutadapt | ||||
|   (package | ||||
|     (name "cutadapt") | ||||
|     (version "1.8") | ||||
|     (version "1.12") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -1815,27 +1816,30 @@ preparation protocols.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "161bp87y6gd6r5bmvjpn2b1k942i3fizfpa139f0jn6jv1wcp5h5")))) | ||||
|                 "19smhh6444ikn4jlmyhvffw4m5aw7yg07rqsk7arg8dkwyga1i4v")))) | ||||
|     (build-system python-build-system) | ||||
|     (arguments | ||||
|      ;; tests must be run after install | ||||
|      `(#:phases (alist-cons-after | ||||
|                  'install 'check | ||||
|                  (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|                    (setenv "PYTHONPATH" | ||||
|                            (string-append | ||||
|                             (getenv "PYTHONPATH") | ||||
|                             ":" (assoc-ref outputs "out") | ||||
|                             "/lib/python" | ||||
|                             (string-take (string-take-right | ||||
|                                           (assoc-ref inputs "python") 5) 3) | ||||
|                             "/site-packages")) | ||||
|                    (zero? (system* "nosetests" "-P" "tests"))) | ||||
|                  (alist-delete 'check %standard-phases)))) | ||||
|      `(#:phases | ||||
|        (modify-phases %standard-phases | ||||
|          ;; The tests must be run after installation. | ||||
|          (delete 'check) | ||||
|          (add-after 'install 'check | ||||
|            (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|              (setenv "PYTHONPATH" | ||||
|                      (string-append | ||||
|                       (getenv "PYTHONPATH") | ||||
|                       ":" (assoc-ref outputs "out") | ||||
|                       "/lib/python" | ||||
|                       (string-take (string-take-right | ||||
|                                     (assoc-ref inputs "python") 5) 3) | ||||
|                       "/site-packages")) | ||||
|              (zero? (system* "nosetests" "-P" "tests"))))))) | ||||
|     (inputs | ||||
|      `(("python-xopen" ,python-xopen))) | ||||
|     (native-inputs | ||||
|      `(("python-cython" ,python-cython) | ||||
|        ("python-nose" ,python-nose))) | ||||
|     (home-page "https://code.google.com/p/cutadapt/") | ||||
|     (home-page "https://cutadapt.readthedocs.io/en/stable/") | ||||
|     (synopsis "Remove adapter sequences from nucleotide sequencing reads") | ||||
|     (description | ||||
|      "Cutadapt finds and removes adapter sequences, primers, poly-A tails and | ||||
|  | @ -1929,19 +1933,14 @@ accessing bigWig files.") | |||
| (define-public python-dendropy | ||||
|   (package | ||||
|     (name "python-dendropy") | ||||
|     (version "4.1.0") | ||||
|     (version "4.2.0") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (pypi-uri "DendroPy" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "1jfz7gp18wph311w1yygbvjanb3n5mdqal439bb6myw41dwb5m63")) | ||||
|        ;; There are two known test failures that will be fixed in the next | ||||
|        ;; release after 4.1.0. | ||||
|        ;; https://github.com/jeetsukumaran/DendroPy/issues/48 | ||||
|        (patches (search-patches | ||||
|                  "python-dendropy-exclude-failing-tests.patch")))) | ||||
|          "15c7s3d5gf19ljsxvq5advaa752wfi7pwrdjyhzmg85hccyvp47p")))) | ||||
|     (build-system python-build-system) | ||||
|     (home-page "http://packages.python.org/DendroPy/") | ||||
|     (synopsis "Library for phylogenetics and phylogenetic computing") | ||||
|  | @ -1956,15 +1955,6 @@ trees (phylogenies) and characters.") | |||
|   (let ((base (package-with-python2 (strip-python2-variant python-dendropy)))) | ||||
|     (package | ||||
|       (inherit base) | ||||
|       ;; Do not use same source as 'python-dendropy' because the patched | ||||
|       ;; failing tests do not occur on Python 2. | ||||
|       (source | ||||
|        (origin | ||||
|          (method url-fetch) | ||||
|          (uri (pypi-uri "DendroPy" (package-version base))) | ||||
|          (sha256 | ||||
|           (base32 | ||||
|            "1jfz7gp18wph311w1yygbvjanb3n5mdqal439bb6myw41dwb5m63")))) | ||||
|       (arguments | ||||
|        `(#:python ,python-2 | ||||
|          #:phases | ||||
|  | @ -2020,7 +2010,7 @@ identify enrichments with functional annotations of the genome.") | |||
| (define-public diamond | ||||
|   (package | ||||
|     (name "diamond") | ||||
|     (version "0.8.29") | ||||
|     (version "0.8.31") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -2029,7 +2019,7 @@ identify enrichments with functional annotations of the genome.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1mnhj7y13pk2bhfichjma5aw8ssdiqyria61ip1kps6facqlal3z")))) | ||||
|                 "0nh79f4rpgq8vmlga743r7vd0z0ik6spy34f7vfq0v9lcmvfr7xq")))) | ||||
|     (build-system cmake-build-system) | ||||
|     (arguments | ||||
|      '(#:tests? #f ; no "check" target | ||||
|  | @ -4252,7 +4242,7 @@ viewer.") | |||
|        `(("perl" ,perl) | ||||
|          ("zlib" ,zlib))) | ||||
|       (supported-systems '("x86_64-linux")) | ||||
|       (home-page "https://code.google.com/p/mosaik-aligner/") | ||||
|       (home-page "https://github.com/wanpinglee/MOSAIK") | ||||
|       (synopsis "Map nucleotide sequence reads to reference genomes") | ||||
|       (description | ||||
|        "MOSAIK is a program for mapping second and third-generation sequencing | ||||
|  | @ -4913,7 +4903,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.") | |||
| (define-public star | ||||
|   (package | ||||
|     (name "star") | ||||
|     (version "2.5.2a") | ||||
|     (version "2.5.2b") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/alexdobin/STAR/archive/" | ||||
|  | @ -4921,7 +4911,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0xjlsm4p9flln111hv4xx7xy94c2nl53zvdvbk9winmiradjsdra")) | ||||
|                 "1na6np880r1zaamiy00hy8bid5anpy0kgf63587v2yl080krk2zq")) | ||||
|               (modules '((guix build utils))) | ||||
|               (snippet | ||||
|                '(begin | ||||
|  | @ -4930,6 +4920,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.") | |||
|                   ;; Remove pre-built binaries and bundled htslib sources. | ||||
|                   (delete-file-recursively "bin/MacOSX_x86_64") | ||||
|                   (delete-file-recursively "bin/Linux_x86_64") | ||||
|                   (delete-file-recursively "bin/Linux_x86_64_static") | ||||
|                   (delete-file-recursively "source/htslib") | ||||
|                   #t)))) | ||||
|     (build-system gnu-build-system) | ||||
|  | @ -5211,20 +5202,21 @@ data types as well.") | |||
| (define-public r-annotate | ||||
|   (package | ||||
|     (name "r-annotate") | ||||
|     (version "1.52.0") | ||||
|     (version "1.52.1") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (bioconductor-uri "annotate" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "1fd2csq7dcs2gwndgwdx2nwkymz8gsmlnqqzv3p0vjjsvvq5n2a8")))) | ||||
|          "0yymz8qxgnbybvfhqrgkd1hh9dhwxdii1yxkhr1zicjgb35xixxb")))) | ||||
|     (build-system r-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("r-annotationdbi" ,r-annotationdbi) | ||||
|        ("r-biobase" ,r-biobase) | ||||
|        ("r-biocgenerics" ,r-biocgenerics) | ||||
|        ("r-dbi" ,r-dbi) | ||||
|        ("r-rcurl" ,r-rcurl) | ||||
|        ("r-xml" ,r-xml) | ||||
|        ("r-xtable" ,r-xtable))) | ||||
|     (home-page | ||||
|  | @ -5288,14 +5280,14 @@ high-throughput sequencing experiments.") | |||
| (define-public r-deseq2 | ||||
|   (package | ||||
|     (name "r-deseq2") | ||||
|     (version "1.14.0") | ||||
|     (version "1.14.1") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (bioconductor-uri "DESeq2" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "0kq06jy4xg5ii3a9l62f17kirsfx0gsiwq6mhiy985cqzpdn893g")))) | ||||
|          "1walwkqryn1gnwz7zryr5764a0p6ia7ag4w6w9n8fskg8dkg0fqs")))) | ||||
|     (properties `((upstream-name . "DESeq2"))) | ||||
|     (build-system r-build-system) | ||||
|     (arguments | ||||
|  | @ -5805,14 +5797,14 @@ generate FASTA, JSON, YAML, RDF, JSON-LD, HTML, CSV, tabular output etc.") | |||
| (define-public bioruby | ||||
|   (package | ||||
|     (name "bioruby") | ||||
|     (version "1.5.0") | ||||
|     (version "1.5.1") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (rubygems-uri "bio" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "01k2fyjl5fpx4zn8g6gqiqvsg2j1fgixrs9p03vzxckynxdq3wmc")))) | ||||
|          "0hdl0789c9n4mprnx5pgd46bfwl8d000rqpamj5h6kkjgspijv49")))) | ||||
|     (build-system ruby-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("ruby-libxml" ,ruby-libxml))) | ||||
|  | @ -5941,13 +5933,13 @@ also known as views, in a controlled vocabulary.") | |||
| (define-public r-biocstyle | ||||
|   (package | ||||
|    (name "r-biocstyle") | ||||
|    (version "2.2.0") | ||||
|    (version "2.2.1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "BiocStyle" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0qbk23fz8cn260isd9xlh9lxfj4adar6iqzai01c4kz0p31f45za")))) | ||||
|                 "0sl99xw940ixrm6v24lgaw3ljh56g59a6rdz7g160hx84z9f8n2n")))) | ||||
|     (properties | ||||
|      `((upstream-name . "BiocStyle"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -6076,13 +6068,13 @@ abnormal copy number.") | |||
| (define-public r-s4vectors | ||||
|   (package | ||||
|     (name "r-s4vectors") | ||||
|     (version "0.12.0") | ||||
|     (version "0.12.1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "S4Vectors" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0m0npc0vhmcwcxws7v2f8k4hvvrjvnlrsr94klxf4a8m4xw2xzzk")))) | ||||
|                 "0i36y3w36h3d8rmazxcrip4gvn54rd9av1wz4lygsprrjmylfhcc")))) | ||||
|     (properties | ||||
|      `((upstream-name . "S4Vectors"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -6128,13 +6120,13 @@ utilities for sequence data management under the ACNUC system.") | |||
| (define-public r-iranges | ||||
|   (package | ||||
|     (name "r-iranges") | ||||
|     (version "2.8.0") | ||||
|     (version "2.8.1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "IRanges" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0cdl1sfd3cvf93lnz91fdk64fbg1mnd5g958dwh1il8r358hqq3f")))) | ||||
|                 "0cryqnpqb3p6l9jjw27hyqd550sxlljls3ka7b9rb38hkji7b5hw")))) | ||||
|     (properties | ||||
|      `((upstream-name . "IRanges"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -6157,13 +6149,13 @@ possible.") | |||
| (define-public r-genomeinfodb | ||||
|   (package | ||||
|     (name "r-genomeinfodb") | ||||
|     (version "1.10.0") | ||||
|     (version "1.10.2") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "GenomeInfoDb" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0nhg4bk38gzvf3mvnbqgisbbhfv1kzjld27z1z9knnlkplkiyyyv")))) | ||||
|                 "0zh894qd1sgpjbn0wfvq6hs2dzn7y1pyicvzk2aa48y3zbidanv7")))) | ||||
|     (properties | ||||
|      `((upstream-name . "GenomeInfoDb"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -6183,13 +6175,13 @@ names in their natural, rather than lexicographic, order.") | |||
| (define-public r-edger | ||||
|   (package | ||||
|     (name "r-edger") | ||||
|     (version "3.16.1") | ||||
|     (version "3.16.5") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "edgeR" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1r6hhwkqp13m022hjajzr1lnjsbai0yjhykwn0kp1f0la990a808")))) | ||||
|                 "04vpa0a6dkkjyvvfbkmfjyaxf2ldkagi66g028qpaszd8jsk8yiv")))) | ||||
|     (properties `((upstream-name . "edgeR"))) | ||||
|     (build-system r-build-system) | ||||
|     (propagated-inputs | ||||
|  | @ -6209,13 +6201,13 @@ CAGE.") | |||
| (define-public r-variantannotation | ||||
|   (package | ||||
|     (name "r-variantannotation") | ||||
|     (version "1.20.0") | ||||
|     (version "1.20.2") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "VariantAnnotation" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1lwzfgahz8ipwli73kcfqb18y6adi129hap1gnycnj3980m54i8q")))) | ||||
|                 "165wda1d2jagd907pnra4m3sla66icyqxvd60xpv09jl5agd5mn9")))) | ||||
|     (properties | ||||
|      `((upstream-name . "VariantAnnotation"))) | ||||
|     (inputs | ||||
|  | @ -6247,13 +6239,13 @@ coding changes and predict coding outcomes.") | |||
| (define-public r-limma | ||||
|   (package | ||||
|     (name "r-limma") | ||||
|     (version "3.30.2") | ||||
|     (version "3.30.7") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "limma" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "04jris7wk2lxksrrvrjsysznsdb2k04lfgrnp18ic49sazva0hfy")))) | ||||
|                 "1xg9w4lmn9n4hwyflxiwi6g969lcy569cg4z1x47crwwg7z7qdka")))) | ||||
|     (build-system r-build-system) | ||||
|     (home-page "http://bioinf.wehi.edu.au/limma") | ||||
|     (synopsis "Package for linear models for microarray and RNA-seq data") | ||||
|  | @ -6302,13 +6294,13 @@ different technologies, including microarrays, RNA-seq, and quantitative PCR.") | |||
| (define-public r-genomicranges | ||||
|   (package | ||||
|     (name "r-genomicranges") | ||||
|     (version "1.26.1") | ||||
|     (version "1.26.2") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "GenomicRanges" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "039nxccg9i2an8q2wni79x8dr9p1fcfcqvih9hg9w243pczg2g3c")))) | ||||
|                 "0if5dswkp77lyqppd0z2iyvnwag9h1gsr03707s8npcx13mzpsia")))) | ||||
|     (properties | ||||
|      `((upstream-name . "GenomicRanges"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -6434,13 +6426,13 @@ objects.") | |||
| (define-public r-biostrings | ||||
|   (package | ||||
|     (name "r-biostrings") | ||||
|     (version "2.42.0") | ||||
|     (version "2.42.1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "Biostrings" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "08z8lkz3axa94wkf144a931ry6vf6cc25avi1ywr84ln2k5czz9f")))) | ||||
|                 "0vqgd9i6y3wj4zviqwgvwgd4qj6033fg01rmx1cw9bw5i8ans42d")))) | ||||
|     (properties | ||||
|      `((upstream-name . "Biostrings"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -6611,13 +6603,13 @@ as well as query and modify the browser state, such as the current viewport.") | |||
| (define-public r-genomicfeatures | ||||
|   (package | ||||
|     (name "r-genomicfeatures") | ||||
|     (version "1.26.0") | ||||
|     (version "1.26.2") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (bioconductor-uri "GenomicFeatures" version)) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0z8spi2knwzwi10c38vr7xlvi3ah9faj7m1lka880mmxkl9cai4k")))) | ||||
|                 "1ybi6r3bax07wlv2qcd34y5qjdvcqcfayfvlrjc39ifrkk65wv4f")))) | ||||
|     (properties | ||||
|      `((upstream-name . "GenomicFeatures"))) | ||||
|     (build-system r-build-system) | ||||
|  | @ -7097,6 +7089,41 @@ musculus (Mouse) as provided by UCSC (mm10, December 2011) and stored | |||
| in Biostrings objects.") | ||||
|     (license license:artistic2.0))) | ||||
| 
 | ||||
| (define-public r-txdb-mmusculus-ucsc-mm10-knowngene | ||||
|   (package | ||||
|     (name "r-txdb-mmusculus-ucsc-mm10-knowngene") | ||||
|     (version "3.4.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               ;; We cannot use bioconductor-uri here because this tarball is | ||||
|               ;; located under "data/annotation/" instead of "bioc/". | ||||
|               (uri (string-append "http://www.bioconductor.org/packages/" | ||||
|                                   "release/data/annotation/src/contrib/" | ||||
|                                   "TxDb.Mmusculus.UCSC.mm10.knownGene_" | ||||
|                                   version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "08gava9wsvpcqz51k2sni3pj03n5155v32d9riqbf305nbirqbkb")))) | ||||
|     (properties | ||||
|      `((upstream-name . "TxDb.Mmusculus.UCSC.mm10.knownGene"))) | ||||
|     (build-system r-build-system) | ||||
|     ;; As this package provides little more than a very large data file it | ||||
|     ;; doesn't make sense to build substitutes. | ||||
|     (arguments `(#:substitutable? #f)) | ||||
|     (propagated-inputs | ||||
|      `(("r-bsgenome" ,r-bsgenome) | ||||
|        ("r-genomicfeatures" ,r-genomicfeatures) | ||||
|        ("r-annotationdbi" ,r-annotationdbi))) | ||||
|     (home-page | ||||
|      "http://bioconductor.org/packages/TxDb.Mmusculus.UCSC.mm10.knownGene/") | ||||
|     (synopsis "Annotation package for TxDb knownGene object(s) for Mouse") | ||||
|     (description | ||||
|      "This package loads a TxDb object, which is an R interface to | ||||
| prefabricated databases contained in this package.  This package provides | ||||
| the TxDb object of Mouse data as provided by UCSC (mm10, December 2011) | ||||
| based on the knownGene track.") | ||||
|     (license license:artistic2.0))) | ||||
| 
 | ||||
| (define-public r-bsgenome-celegans-ucsc-ce6 | ||||
|   (package | ||||
|     (name "r-bsgenome-celegans-ucsc-ce6") | ||||
|  | @ -7223,7 +7250,7 @@ throughput genetic sequencing data sets using regression methods.") | |||
| (define-public r-qtl | ||||
|  (package | ||||
|   (name "r-qtl") | ||||
|   (version "1.39-5") | ||||
|   (version "1.40-8") | ||||
|   (source | ||||
|    (origin | ||||
|     (method url-fetch) | ||||
|  | @ -7231,7 +7258,7 @@ throughput genetic sequencing data sets using regression methods.") | |||
|                         version ".tar.gz")) | ||||
|     (sha256 | ||||
|      (base32 | ||||
|       "1grwgvyv7x0dgay1858bg7qf4wk47gpnq7qkqpcda9cn0h970d6f")))) | ||||
|       "05bj1x2ry0i7yqiydlswb3d2h4pxg70z8w1072az1mrv1m54k8sp")))) | ||||
|   (build-system r-build-system) | ||||
|   (home-page "http://rqtl.org/") | ||||
|   (synopsis "R package for analyzing QTL experiments in genetics") | ||||
|  | @ -7347,7 +7374,7 @@ paired-end data.") | |||
| (define-public r-rcas | ||||
|   (package | ||||
|     (name "r-rcas") | ||||
|     (version "1.0.0") | ||||
|     (version "1.1.1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/BIMSBbioinfo/RCAS/archive/v" | ||||
|  | @ -7355,7 +7382,7 @@ paired-end data.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1h7di822ihgkhmmmlfbfz3c2dkjyjxl307i6mx8w0cwjqbna1kp6")))) | ||||
|                 "1hd0r66556bxbdd82ksjklq7nfli36l4k6y88ic7kkg9873wa1nw")))) | ||||
|     (build-system r-build-system) | ||||
|     (native-inputs | ||||
|      `(("r-knitr" ,r-knitr) | ||||
|  | @ -7377,6 +7404,7 @@ paired-end data.") | |||
|        ("r-topgo" ,r-topgo) | ||||
|        ("r-dt" ,r-dt) | ||||
|        ("r-plotly" ,r-plotly) | ||||
|        ("r-plotrix" ,r-plotrix) | ||||
|        ("r-motifrg" ,r-motifrg) | ||||
|        ("r-genomation" ,r-genomation) | ||||
|        ("r-genomicfeatures" ,r-genomicfeatures) | ||||
|  | @ -7796,7 +7824,7 @@ may optionally be provided to further inform the peak-calling process.") | |||
|      `(("python2-numpy" ,python2-numpy) | ||||
|        ("python2-scipy" ,python2-scipy) | ||||
|        ("python2-pysam" ,python2-pysam))) | ||||
|     (home-page "https://code.google.com/p/pepr-chip-seq/") | ||||
|     (home-page "https://github.com/shawnzhangyx/PePr") | ||||
|     (synopsis "Peak-calling and prioritization pipeline for ChIP-Seq data") | ||||
|     (description | ||||
|      "PePr is a ChIP-Seq peak calling or differential binding analysis tool | ||||
|  | @ -7837,17 +7865,20 @@ replacement for strverscmp.") | |||
| (define-public multiqc | ||||
|   (package | ||||
|     (name "multiqc") | ||||
|     (version "0.6") | ||||
|     (version "0.9") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (pypi-uri "multiqc" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "0avw11h63ldpxy5pizc3wl1wa01ha7q10wb240nggsjz3jaqvyiy")))) | ||||
|          "12gs1jw2jrxrij529rnl5kaqxfcqn15yzcsggxkfhdx634ml0cny")) | ||||
|        (patches (search-patches "multiqc-fix-git-subprocess-error.patch")))) | ||||
|     (build-system python-build-system) | ||||
|     (native-inputs | ||||
|      `(("python-nose" ,python-nose))) | ||||
|     (arguments | ||||
|      ;; Tests are to be introduced in the next version, see | ||||
|      ;; https://github.com/ewels/MultiQC/issues/376 | ||||
|      `(#:tests? #f)) | ||||
|     (propagated-inputs | ||||
|      `(("python-jinja2" ,python-jinja2) | ||||
|        ("python-simplejson" ,python-simplejson) | ||||
|  | @ -7862,3 +7893,94 @@ replacement for strverscmp.") | |||
| samples into a single report.  It contains modules for a large number of | ||||
| common bioinformatics tools.") | ||||
|     (license license:gpl3))) | ||||
| 
 | ||||
| (define-public r-chipseq | ||||
|   (package | ||||
|     (name "r-chipseq") | ||||
|     (version "1.24.0") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (bioconductor-uri "chipseq" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "115ayp82rs99iaswrx45skw1i5iacgwzz5k8rzijbp5qic0554n0")))) | ||||
|     (build-system r-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("r-biocgenerics" ,r-biocgenerics) | ||||
|        ("r-genomicranges" ,r-genomicranges) | ||||
|        ("r-iranges" ,r-iranges) | ||||
|        ("r-s4vectors" ,r-s4vectors) | ||||
|        ("r-shortread" ,r-shortread))) | ||||
|     (home-page "http://bioconductor.org/packages/chipseq") | ||||
|     (synopsis "Package for analyzing ChIPseq data") | ||||
|     (description | ||||
|      "This package provides tools for processing short read data from ChIPseq | ||||
| experiments.") | ||||
|     (license license:artistic2.0))) | ||||
| 
 | ||||
| (define-public r-copyhelper | ||||
|   (package | ||||
|     (name "r-copyhelper") | ||||
|     (version "1.6.0") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (string-append "http://bioconductor.org/packages/release/" | ||||
|                            "data/experiment/src/contrib/CopyhelpeR_" | ||||
|                            version ".tar.gz")) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "0x7cyynjmxls9as2gg0iyp9x5fpalxmdjq914ss7i84i9zyk5bhq")))) | ||||
|     (properties `((upstream-name . "CopyhelpeR"))) | ||||
|     (build-system r-build-system) | ||||
|     (home-page "http://bioconductor.org/packages/CopyhelpeR/") | ||||
|     (synopsis "Helper files for CopywriteR") | ||||
|     (description | ||||
|      "This package contains the helper files that are required to run the | ||||
| Bioconductor package CopywriteR.  It contains pre-assembled 1kb bin GC-content | ||||
| and mappability files for the reference genomes hg18, hg19, hg38, mm9 and | ||||
| mm10.  In addition, it contains a blacklist filter to remove regions that | ||||
| display copy number variation.  Files are stored as GRanges objects from the | ||||
| GenomicRanges Bioconductor package.") | ||||
|     (license license:gpl2))) | ||||
| 
 | ||||
| (define-public r-copywriter | ||||
|   (package | ||||
|     (name "r-copywriter") | ||||
|     (version "2.6.0") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (bioconductor-uri "CopywriteR" version)) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "1bwwnsyk7cpgwkagsnn5mv6fv233b0rkhjvbadrh70h8m4anawfj")))) | ||||
|     (properties `((upstream-name . "CopywriteR"))) | ||||
|     (build-system r-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("r-biocparallel" ,r-biocparallel) | ||||
|        ("r-chipseq" ,r-chipseq) | ||||
|        ("r-copyhelper" ,r-copyhelper) | ||||
|        ("r-data-table" ,r-data-table) | ||||
|        ("r-dnacopy" ,r-dnacopy) | ||||
|        ("r-futile-logger" ,r-futile-logger) | ||||
|        ("r-genomeinfodb" ,r-genomeinfodb) | ||||
|        ("r-genomicalignments" ,r-genomicalignments) | ||||
|        ("r-genomicranges" ,r-genomicranges) | ||||
|        ("r-gtools" ,r-gtools) | ||||
|        ("r-iranges" ,r-iranges) | ||||
|        ("r-matrixstats" ,r-matrixstats) | ||||
|        ("r-rsamtools" ,r-rsamtools) | ||||
|        ("r-s4vectors" ,r-s4vectors))) | ||||
|     (home-page "https://github.com/PeeperLab/CopywriteR") | ||||
|     (synopsis "Copy number information from targeted sequencing") | ||||
|     (description | ||||
|      "CopywriteR extracts DNA copy number information from targeted sequencing | ||||
| by utilizing off-target reads.  It allows for extracting uniformly distributed | ||||
| copy number information, can be used without reference, and can be applied to | ||||
| sequencing data obtained from various techniques including chromatin | ||||
| immunoprecipitation and target enrichment on small gene panels.  Thereby, | ||||
| CopywriteR constitutes a widely applicable alternative to available copy | ||||
| number detection tools.") | ||||
|     (license license:gpl2))) | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com> | ||||
| ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2016 Leo Famulari <leo@famulari.name> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Tomáš Čech <sleep_walker@gnu.org> | ||||
| ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr> | ||||
| ;;; | ||||
|  | @ -214,7 +214,7 @@ interface, for the Transmission BitTorrent daemon.") | |||
| (define-public aria2 | ||||
|   (package | ||||
|     (name "aria2") | ||||
|     (version "1.29.0") | ||||
|     (version "1.30.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/tatsuhiro-t/aria2/" | ||||
|  | @ -222,7 +222,7 @@ interface, for the Transmission BitTorrent daemon.") | |||
|                                   name "-" version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0bn8j6yhjnsxlxr1cdxw39gphvsrk3qhvvq92rsirxjvwwix0r0s")))) | ||||
|                 "1xiiqk4yiqr0c4hf05zkma9if13lp3wh37z1r0w60ahxs5k56v5z")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:configure-flags (list "--enable-libaria2" | ||||
|  | @ -237,7 +237,8 @@ interface, for the Transmission BitTorrent daemon.") | |||
|                 (string-append "// " text))) | ||||
|              (substitute* "test/LpdMessageReceiverTest.cc" | ||||
|                (("CPPUNIT_TEST_SUITE_REGISTRATION\\(LpdMessageReceiverTest\\);" text) | ||||
|                 (string-append "// " text)))))))) | ||||
|                 (string-append "// " text))) | ||||
|              #t))))) | ||||
|     (native-inputs | ||||
|      `(("cppunit" ,cppunit) ; for the tests | ||||
|        ("pkg-config" ,pkg-config))) | ||||
|  |  | |||
|  | @ -120,7 +120,7 @@ across a broad spectrum of applications.") | |||
|     (build-system gnu-build-system) | ||||
|     (propagated-inputs | ||||
|       `(("boost" ,boost))) ; inclusion of header files | ||||
|     (home-page "https://code.google.com/p/multidimalgorithm/") | ||||
|     (home-page "https://gitlab.com/mdds/mdds") | ||||
|     (synopsis "Multi-dimensional C++ data structures and indexing algorithms") | ||||
|     (description "Mdds (multi-dimensional data structure) provides a | ||||
| collection of multi-dimensional data structures and indexing algorithms | ||||
|  |  | |||
|  | @ -174,6 +174,7 @@ successful, or false to signal an error." | |||
|         ((string=? system "arm-eabi") "no-ld.so") | ||||
|         ((string=? system "xtensa-elf") "no-ld.so") | ||||
|         ((string=? system "avr") "no-ld.so") | ||||
|         ((string=? system "propeller-elf") "no-ld.so") | ||||
|         ((string=? system "i686-mingw") "no-ld.so") | ||||
| 
 | ||||
|         (else (error "dynamic linker name not known for this system" | ||||
|  | @ -287,7 +288,8 @@ $out/bin/guile --version~%" | |||
| 
 | ||||
| (define %bootstrap-base-urls | ||||
|   ;; This is where the initial binaries come from. | ||||
|   '("http://alpha.gnu.org/gnu/guix/bootstrap" | ||||
|   '("ftp://alpha.gnu.org/gnu/guix/bootstrap" | ||||
|     "http://alpha.gnu.org/gnu/guix/bootstrap" | ||||
|     "http://www.fdn.fr/~lcourtes/software/guix/packages")) | ||||
| 
 | ||||
| (define %bootstrap-coreutils&co | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
| (define-public busybox | ||||
|   (package | ||||
|     (name "busybox") | ||||
|     (version "1.25.0") | ||||
|     (version "1.26.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -38,7 +38,7 @@ | |||
|                     version ".tar.bz2")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1z52mh6prhd6v47qryz4rvng5r1z0am6masrnigq06zfhmlf03ss")))) | ||||
|                 "0k0g3hk58m99c2sfq97ngnixb2rv2wzyhv3z00lxaw78bqvjglis")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:phases | ||||
|  | @ -65,14 +65,6 @@ | |||
|            (substitute* "testsuite/pidof.tests" | ||||
|                (("-s init") "-s $(cat /proc/1/comm)")) | ||||
| 
 | ||||
|            (substitute* "testsuite/grep.tests" | ||||
|                ;; The subject of this test is buggy.  It is known by upstream (fixed in git) | ||||
|                ;; So mark it with SKIP_KNOWN_BUGS like the others. | ||||
|                ;; Presumably it wasn't known at the time of release ... | ||||
|                ;; (It is strange that they release software which they know to have bugs) | ||||
|                (("testing \"grep -w \\^str doesn't match str not at the beginning\"") | ||||
|                "test x\"$SKIP_KNOWN_BUGS\" = x\"\" && testing \"grep -w ^str doesn't match str not at the beginning\"")) | ||||
| 
 | ||||
|            ;; This test cannot possibly pass. | ||||
|            ;; It is trying to test that "which ls" returns "/bin/ls" when PATH is not set. | ||||
|            ;; However, this relies on /bin/ls existing.  Which it does not in guix. | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -24,6 +24,8 @@ | |||
|   #:use-module (guix build-system gnu) | ||||
|   #:use-module (guix build-system trivial) | ||||
|   #:use-module (gnu packages bootstrap) | ||||
|   #:use-module (gnu packages bison) | ||||
|   #:use-module (gnu packages flex) | ||||
|   #:use-module (gnu packages perl) | ||||
|   #:use-module (gnu packages texinfo) | ||||
|   #:use-module (gnu packages guile)) | ||||
|  | @ -128,3 +130,33 @@ standard.") | |||
|              (chmod port #o777))) | ||||
|          #t))) | ||||
|     (synopsis "Wrapper providing the 'cc' command for TCC"))) | ||||
| 
 | ||||
| (define-public pcc | ||||
|   (package | ||||
|     (name "pcc") | ||||
|     (version "20170109") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "http://pcc.ludd.ltu.se/ftp/pub/pcc/pcc-" | ||||
|                                   version ".tgz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1p34w496095mi0473f815w6wbi57zxil106mg7pj6sg6gzpjcgww")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (replace 'check | ||||
|            (lambda _ | ||||
|              (zero? (system* "make" "-C" "cc/cpp" "test"))))))) | ||||
|     (native-inputs | ||||
|      `(("bison" ,bison) | ||||
|        ("flex" ,flex))) | ||||
|     (synopsis "Portable C compiler") | ||||
|     (description | ||||
|      "PCC is a portable C compiler.  The project goal is to write a C99 | ||||
| compiler while still keeping it small, simple, fast and understandable.") | ||||
|     (home-page "http://pcc.ludd.ltu.se") | ||||
|     ;; PCC incorporates code under various BSD licenses; for new code bsd-2 is | ||||
|     ;; preferred.  See http://pcc.ludd.ltu.se/licenses/ for more details. | ||||
|     (license (list license:bsd-2 license:bsd-3)))) | ||||
|  |  | |||
|  | @ -88,6 +88,7 @@ data units.") | |||
|     (source (origin | ||||
|              (method url-fetch) | ||||
|              (uri (pypi-uri "khal" version)) | ||||
|              (patches (search-patches "khal-disable-failing-tests.patch")) | ||||
|              (sha256 | ||||
|               (base32 | ||||
|                "03vy4dp9n43w51mwqjjy08dr5nj7wxqnb085visz3j43vzm42p1f")))) | ||||
|  |  | |||
|  | @ -28,14 +28,19 @@ | |||
|   #:use-module ((guix licenses) #:select (lgpl2.1+ gpl2 gpl2+ gpl3+)) | ||||
|   #:use-module (guix build-system cmake) | ||||
|   #:use-module (guix build-system gnu) | ||||
|   #:use-module (guix build-system glib-or-gtk) | ||||
|   #:use-module (guix gexp) | ||||
|   #:use-module (gnu packages) | ||||
|   #:use-module (gnu packages acl) | ||||
|   #:use-module (gnu packages audio) | ||||
|   #:use-module (gnu packages bison) | ||||
|   #:use-module (gnu packages compression) | ||||
|   #:use-module (gnu packages flex) | ||||
|   #:use-module (gnu packages gettext) | ||||
|   #:use-module (gnu packages gtk) | ||||
|   #:use-module (gnu packages glib) | ||||
|   #:use-module (gnu packages man) | ||||
|   #:use-module (gnu packages mp3) | ||||
|   #:use-module (gnu packages ncurses) | ||||
|   #:use-module (gnu packages elf) | ||||
|   #:use-module (gnu packages pkg-config) | ||||
|  | @ -328,12 +333,14 @@ from an audio CD.") | |||
|                    (parano (assoc-ref inputs "cdparanoia")) | ||||
|                    (which  (assoc-ref inputs "which")) | ||||
|                    (discid (assoc-ref inputs "cd-discid")) | ||||
|                    (flac   (assoc-ref inputs "flac")) | ||||
|                    (out    (assoc-ref outputs "out"))) | ||||
|                (define (wrap file) | ||||
|                  (wrap-program file | ||||
|                                `("PATH" ":" prefix | ||||
|                                  (,(string-append out "/bin:" | ||||
|                                                   wget "/bin:" | ||||
|                                                   flac "/bin:" | ||||
|                                                   which "/bin:" | ||||
|                                                   vorbis "/bin:" | ||||
|                                                   discid "/bin:" | ||||
|  | @ -349,6 +356,7 @@ from an audio CD.") | |||
|               ("cdparanoia" ,cdparanoia) | ||||
|               ("cd-discid" ,cd-discid) | ||||
|               ("vorbis-tools" ,vorbis-tools) | ||||
|               ("flac" ,flac) | ||||
| 
 | ||||
|               ;; A couple of Python and Perl scripts are included. | ||||
|               ("python" ,python) | ||||
|  | @ -395,3 +403,96 @@ for bootable CD-ROMs. | |||
| Image data is written to standard output by default and all other | ||||
| information is written to standard error.") | ||||
|     (license gpl2+))) | ||||
| 
 | ||||
| (define-public asunder | ||||
|   (package | ||||
|     (name "asunder") | ||||
|     (version "2.8") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri | ||||
|                (string-append "http://www.littlesvr.ca/asunder/releases/asunder-" | ||||
|                               version | ||||
|                               ".tar.bz2")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1nq9kd4rd4k2kibf57gdbm0zw2gxa234vvvdhxkm8g5bhx5h3iyq")))) | ||||
|     (build-system glib-or-gtk-build-system) | ||||
|     (arguments | ||||
|      '(#:out-of-source? #f | ||||
|        #:phases (modify-phases %standard-phases | ||||
|                   (add-after 'install 'wrap | ||||
|                     (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|                       (let ((program (string-append (assoc-ref outputs "out") | ||||
|                                                     "/bin/asunder"))) | ||||
|                         (define (bin-directory input-name) | ||||
|                           (string-append (assoc-ref inputs input-name) "/bin")) | ||||
|                         (wrap-program program | ||||
|                           `("PATH" ":" prefix | ||||
|                             ,(map bin-directory (list "cdparanoia" | ||||
|                                                       "lame" | ||||
|                                                       "vorbis-tools" | ||||
|                                                       "flac" | ||||
|                                                       "opus-tools" | ||||
|                                                       "wavpack")))))))))) | ||||
|     (native-inputs `(("intltool" ,intltool) | ||||
|                      ("pkg-config" ,pkg-config))) | ||||
|     ;; TODO: Add the necessary packages for Musepack encoding. | ||||
|     (inputs `(("gtk+-2" ,gtk+-2) | ||||
|               ("glib" ,glib) | ||||
|               ("libcddb" ,libcddb) | ||||
|               ("cdparanoia" ,cdparanoia) | ||||
|               ("lame" ,lame) | ||||
|               ("vorbis-tools" ,vorbis-tools) | ||||
|               ("flac" ,flac) | ||||
|               ("opus-tools" ,opus-tools) | ||||
|               ("wavpack" ,wavpack))) | ||||
|     (home-page "http://www.littlesvr.ca/asunder/") | ||||
|     (synopsis "Graphical audio CD ripper and encoder") | ||||
|     (description | ||||
|      "Asunder is a graphical audio CD ripper and encoder.  It can save audio | ||||
| tracks as WAV, MP3, Ogg Vorbis, FLAC, Opus, Wavpack, and Musepack.  It can use | ||||
| CDDB to name and tag each track automatically, and it allows for each track to | ||||
| be by a different artist.  Asunder can encode to multiple formats in one | ||||
| session, and it can create M3U playlists.") | ||||
|     (license gpl2))) | ||||
| 
 | ||||
| (define-public ripit | ||||
|   (package | ||||
|     (name "ripit") | ||||
|     (version "3.9.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "http://www.suwald.com/ripit/ripit-" | ||||
|                                   version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0ap71x477jy9c4jiqazb3y45hxdxm3jbq24x05g3vjyqzigi4x1b")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:tests? #f ; No test suite. | ||||
|        #:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (delete 'configure) | ||||
|          (add-after 'unpack 'patch-usr-bin-install | ||||
|            (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|              (substitute* "Makefile" | ||||
|                (("/usr/bin/install") (string-append | ||||
|                                       (assoc-ref inputs "coreutils") | ||||
|                                       "/bin/install")) | ||||
|                (("\\$\\(DESTDIR\\)/usr/local") (assoc-ref outputs "out")) | ||||
|                (("../../etc") "etc"))))))) | ||||
|     (native-inputs | ||||
|      `(("coreutils" ,coreutils))) | ||||
|     (inputs | ||||
|      `(("perl" ,perl))) | ||||
|     (propagated-inputs | ||||
|      `(("cdparanoia" ,cdparanoia) | ||||
|        ("flac" ,flac) | ||||
|        ("vorbis-tools" ,vorbis-tools) | ||||
|        ("wavpack" ,wavpack) | ||||
|        ("perl-cddb-get" ,perl-cddb-get))) | ||||
|     (home-page "http://www.suwald.com/ripit/about.php") | ||||
|     (synopsis "Command-line program to extract audio CDs") | ||||
|     (description "RipIT is used to extract audio from CDs.") | ||||
|     (license gpl2))) | ||||
|  |  | |||
|  | @ -180,13 +180,13 @@ format.") | |||
| (define-public cppcheck | ||||
|   (package | ||||
|     (name "cppcheck") | ||||
|     (version "1.76") | ||||
|     (version "1.76.1") | ||||
|     (source (origin | ||||
|       (method url-fetch) | ||||
|       (uri (string-append "https://github.com/danmar/cppcheck/archive/" | ||||
|                           version ".tar.gz")) | ||||
|       (sha256 | ||||
|        (base32 "14d0ikcmq1xcqy9f1vq1jbn5ifl0jiy3rycqdcg7v8hil48m59z8")) | ||||
|        (base32 "08pcawg36h850n4i794b2158jcv49f8a54dg3dikdkc1cwknwgjz")) | ||||
|       (file-name (string-append name "-" version ".tar.gz")))) | ||||
|     (build-system cmake-build-system) | ||||
|     (home-page "http://cppcheck.sourceforge.net") | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org> | ||||
| ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> | ||||
| ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org> | ||||
| ;;; Copyright © 2016, 2017 Mathieu Lirzin <mthl@gnu.org> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -34,6 +34,7 @@ | |||
|   #:use-module (gnu packages perl) | ||||
|   #:use-module (gnu packages pkg-config) | ||||
|   #:use-module (gnu packages tls) | ||||
|   #:use-module (gnu packages texinfo) | ||||
|   #:use-module (gnu packages version-control) | ||||
|   #:use-module (gnu packages web) | ||||
|   #:use-module (gnu packages xml) | ||||
|  | @ -185,8 +186,8 @@ their dependencies.") | |||
|       (license l:gpl3+)))) | ||||
| 
 | ||||
| (define-public cuirass | ||||
|   (let ((commit "7248c0038f3d0bfcf6c469d534efb4a13952c112") | ||||
|         (revision "1")) | ||||
|   (let ((commit "d0a5801e397335bb44d8033e5deddf02c1cc99c2") | ||||
|         (revision "3")) | ||||
|     (package | ||||
|       (name "cuirass") | ||||
|       (version (string-append "0.0.1-" revision "." (string-take commit 7))) | ||||
|  | @ -198,12 +199,18 @@ their dependencies.") | |||
|                 (file-name (string-append name "-" version)) | ||||
|                 (sha256 | ||||
|                  (base32 | ||||
|                   "0hkwh2pcz3wzg1n533ch2w7vwr97yr369q4ki0yqk99wfipjrydw")))) | ||||
|                   "0sa94dgp9w6av7i0a570fv9a9yq03jkxdrm5d75h6szsp1kiyw2i")))) | ||||
|       (build-system gnu-build-system) | ||||
|       (arguments | ||||
|        '(#:phases | ||||
|          (modify-phases %standard-phases | ||||
|            (add-after 'unpack 'bootstrap | ||||
|            (add-after 'unpack 'disable-repo-tests | ||||
|              (λ _ | ||||
|                ;; Disable tests that use a connection to the Guix daemon. | ||||
|                (substitute* "Makefile.am" | ||||
|                  (("tests/repo.scm \\\\") "\\")) | ||||
|                #t)) | ||||
|            (add-before 'configure 'bootstrap | ||||
|              (lambda _ (zero? (system* "sh" "bootstrap")))) | ||||
|            (add-after 'install 'wrap-program | ||||
|              (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|  | @ -211,22 +218,30 @@ their dependencies.") | |||
|                (let* ((out    (assoc-ref outputs "out")) | ||||
|                       (json   (assoc-ref inputs "guile-json")) | ||||
|                       (sqlite (assoc-ref inputs "guile-sqlite3")) | ||||
|                       (git    (assoc-ref inputs "git")) | ||||
|                       (guix   (assoc-ref inputs "guix")) | ||||
|                       (mods   (string-append json "/share/guile/site/2.0:" | ||||
|                                              sqlite "/share/guile/site/2.0:" | ||||
|                                              guix "/share/guile/site/2.0"))) | ||||
|                  ;; Make sure 'cuirass' can find the 'git' and 'evaluate' | ||||
|                  ;; commands, as well as the relevant Guile modules. | ||||
|                  (wrap-program (string-append out "/bin/cuirass") | ||||
|                    `("PATH" ":" prefix (,(string-append out "/bin") | ||||
|                                         ,(string-append git "/bin"))) | ||||
|                    `("GUILE_LOAD_PATH" ":" prefix (,mods)) | ||||
|                    `("GUILE_LOAD_COMPILED_PATH" ":" prefix (,mods))))))))) | ||||
|                    `("GUILE_LOAD_COMPILED_PATH" ":" prefix (,mods))) | ||||
|                  #t)))))) | ||||
|       (inputs | ||||
|        `(("guile" ,guile-2.0) | ||||
|          ("guile-json" ,guile-json) | ||||
|          ("guile-sqlite3" ,guile-sqlite3) | ||||
|          ("guix" ,guix))) | ||||
|          ("guix" ,guix) | ||||
|          ("git" ,git))) | ||||
|       (native-inputs | ||||
|        `(("autoconf" ,autoconf) | ||||
|          ("automake" ,automake) | ||||
|          ("pkg-config" ,pkg-config))) | ||||
|          ("pkg-config" ,pkg-config) | ||||
|          ("texinfo" ,texinfo))) | ||||
|       (synopsis "Continuous integration system") | ||||
|       (description | ||||
|        "Cuirass is a continuous integration tool using GNU Guix.  It is | ||||
|  |  | |||
|  | @ -92,14 +92,14 @@ highlighting your own code that seemed comprehensible when you wrote it.") | |||
| (define-public global                             ; a global variable | ||||
|   (package | ||||
|     (name "global") | ||||
|     (version "6.5.5") | ||||
|     (version "6.5.6") | ||||
|     (source (origin | ||||
|              (method url-fetch) | ||||
|              (uri (string-append "mirror://gnu/global/global-" | ||||
|                                  version ".tar.gz")) | ||||
|              (sha256 | ||||
|               (base32 | ||||
|                "0yyg91qw8399lnxfai4bxkh9yq71qdwp9kvadgzp05cdqni44nxw")))) | ||||
|                "018m536k5y6lks1a6gqn3bsp7r8zk017znqj9kva1nm8d7x9lbqj")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (inputs `(("ncurses" ,ncurses) | ||||
|               ("libltdl" ,libltdl) | ||||
|  |  | |||
|  | @ -474,7 +474,7 @@ the bootstrap environment." | |||
|                  (unsetenv "CPATH") | ||||
| 
 | ||||
|                  ;; Tell 'libpthread' where to find 'libihash' on Hurd systems. | ||||
|                  ,@(if (string-match "i586-gnu" (%current-system)) | ||||
|                  ,@(if (hurd-triplet? (%current-system)) | ||||
|                        `((substitute* "libpthread/Makefile" | ||||
|                            (("LDLIBS-pthread.so =.*") | ||||
|                             (string-append "LDLIBS-pthread.so = " | ||||
|  | @ -499,7 +499,7 @@ the bootstrap environment." | |||
|         ,@%boot1-inputs | ||||
| 
 | ||||
|         ;; A native MiG is needed to build Glibc on Hurd. | ||||
|         ,@(if (string-match "i586-gnu" (%current-system)) | ||||
|         ,@(if (hurd-triplet? (%current-system)) | ||||
|               `(("mig" ,mig-boot0)) | ||||
|               '()) | ||||
| 
 | ||||
|  | @ -783,6 +783,7 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%" | |||
| (define bash-final | ||||
|   ;; Link with `-static-libgcc' to make sure we don't retain a reference | ||||
|   ;; to the bootstrap GCC. | ||||
|   ;; FIXME: This depends on 'bootstrap-binaries' via Makefile.in. | ||||
|   (package-with-bootstrap-guile | ||||
|    (package-with-explicit-inputs (static-libgcc-package bash) | ||||
|                                  %boot3-inputs | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2012, 2013, 2014, 2015, 2017 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> | ||||
| ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org> | ||||
| ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com> | ||||
|  | @ -57,8 +57,8 @@ | |||
|       (method url-fetch) | ||||
|       (uri (list (string-append "http://zlib.net/zlib-" | ||||
|                                  version ".tar.gz") | ||||
|                  (string-append "mirror://sourceforge/libpng/zlib-" | ||||
|                                  version ".tar.gz"))) | ||||
|                  (string-append "mirror://sourceforge/libpng/zlib/" | ||||
|                                 version "/zlib-" version ".tar.gz"))) | ||||
|       (sha256 | ||||
|        (base32 | ||||
|         "039agw5rqvqny92cpkrfn243x2gd4xn13hs3xi6isk55d2vqqr9n")))) | ||||
|  |  | |||
|  | @ -1,5 +1,7 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2017 Mathieu OTHACEHE <m.othacehe@gmail.com> | ||||
| ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -28,7 +30,9 @@ | |||
|   #:use-module (gnu packages glib) | ||||
|   #:use-module (gnu packages linux) | ||||
|   #:use-module (gnu packages pkg-config) | ||||
|   #:use-module (gnu packages polkit) | ||||
|   #:use-module (gnu packages python) | ||||
|   #:use-module (gnu packages qt) | ||||
|   #:use-module (gnu packages readline) | ||||
|   #:use-module (gnu packages samba) | ||||
|   #:use-module (gnu packages tls) | ||||
|  | @ -50,7 +54,7 @@ | |||
|     (arguments | ||||
|      `(#:configure-flags | ||||
|        (list "--enable-nmcompat" | ||||
|              ;; "--enable-polkit" | ||||
|              "--enable-polkit" | ||||
|              "--enable-openconnect" | ||||
|              "--enable-openvpn" | ||||
|              "--enable-vpnc" | ||||
|  | @ -71,7 +75,7 @@ | |||
|        ("glib" ,glib) | ||||
|        ("gnutls" ,gnutls) | ||||
|        ("iptables" ,iptables) | ||||
|        ;; ("polkit" ,polkit) ; pkg-config cannot find polkit.pc | ||||
|        ("polkit" ,polkit)        ;so connman can be used by unprivileged users | ||||
|        ("readline" ,readline) | ||||
|        ;; These inputs are needed for connman to include the interface to | ||||
|        ;; these technologies so IF they are installed they can be used. | ||||
|  | @ -120,9 +124,50 @@ sharing) to clients via USB, ethernet, WiFi, cellular and Bluetooth.") | |||
|     (inputs | ||||
|      `(("efl" ,efl) | ||||
|        ("python-2" ,python-2) | ||||
|        ("python2-dbus" ,python2-dbus) | ||||
|        ("python2-efl" ,python2-efl))) | ||||
|     (home-page "https://www.enlightenment.org") | ||||
|     (synopsis "Connman User Interface written using the EFL") | ||||
|     (description | ||||
|      "An EFL user interface for the @code{connman} connection manager.") | ||||
|     (license lgpl3))) | ||||
| 
 | ||||
| (define-public cmst | ||||
|   (package | ||||
|     (name "cmst") | ||||
|     (version "2016.10.03") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (string-append | ||||
|              "https://github.com/andrew-bibb/cmst/releases/download/cmst-" | ||||
|              version "/cmst-" version ".tar.gz")) | ||||
|        (sha256 | ||||
|         (base32 "1xpn4sqnxzpsjjwh9hva9sn55xlryiz2f2mwpyj2l31janj7a082")))) | ||||
|     (inputs | ||||
|      `(("qt" ,qt))) | ||||
|     (native-inputs | ||||
|      `(("qmake" ,qt))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      '(#:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (replace 'configure | ||||
|            (lambda* (#:key outputs #:allow-other-keys) | ||||
|              (zero? | ||||
|               (system* "qmake" | ||||
|                        (string-append "PREFIX=" | ||||
|                                       (assoc-ref outputs "out")))))) | ||||
|          (add-before 'install 'fix-Makefiles | ||||
|            (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|              (let ((out (assoc-ref outputs "out"))) | ||||
|                (substitute* (find-files "." "Makefile") | ||||
|                  (("INSTALL_ROOT)") | ||||
|                   (string-append "INSTALL_ROOT)" out)) | ||||
|                  (("/usr/bin") "/bin")))))))) | ||||
|     (home-page "https://github.com/andrew-bibb/cmst") | ||||
|     (synopsis "Qt frontend for Connman") | ||||
|     (description | ||||
|      "Cmst is a Qt based frontend for the @code{connman} connection manager. | ||||
| This package also provides a systemtray icon.") | ||||
|     (license x11))) | ||||
|  |  | |||
|  | @ -468,7 +468,7 @@ XBINUTILS and the cross tool chain." | |||
| 
 | ||||
|           (native-inputs `(("cross-gcc" ,xgcc) | ||||
|                            ("cross-binutils" ,xbinutils) | ||||
|                            ,@(if (string-match (or "i586-pc-gnu" "i586-gnu") target) | ||||
|                            ,@(if (hurd-triplet? target) | ||||
|                                  `(("cross-mig" | ||||
|                                     ,@(assoc-ref (package-native-inputs xheaders) | ||||
|                                                  "cross-mig"))) | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ | |||
| (define-public cups-filters | ||||
|   (package | ||||
|     (name "cups-filters") | ||||
|     (version "1.11.5") | ||||
|     (version "1.13.1") | ||||
|     (source(origin | ||||
|               (method url-fetch) | ||||
|               (uri | ||||
|  | @ -59,7 +59,7 @@ | |||
|                               "cups-filters-" version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1hcp1cfx1a71aa6fyayajjh7vw1ia7zya6981gz73vsy2pdb23qf")) | ||||
|                 "0s7hylp2lcvc1vrqpywpv7lspkrh4xf7cyi4nbg10cf38rshj474")) | ||||
|               (modules '((guix build utils))) | ||||
|               (snippet | ||||
|                ;; install backends, banners and filters to cups-filters output | ||||
|  | @ -85,12 +85,16 @@ | |||
|     (arguments | ||||
|      `(#:make-flags (list (string-append "PREFIX=" %output)) | ||||
|        #:configure-flags | ||||
|        `(,(string-append "--with-test-font-path=" | ||||
|        `("--disable-driverless" ; TODO: enable this | ||||
|          ,(string-append "--with-test-font-path=" | ||||
|                          (assoc-ref %build-inputs "font-dejavu") | ||||
|                          "/share/fonts/truetype/DejaVuSans.ttf") | ||||
|          ,(string-append "--with-gs-path=" | ||||
|                          (assoc-ref %build-inputs "ghostscript") | ||||
|                          "/bin/gsc") | ||||
|          ,(string-append "--with-shell=" | ||||
|                          (assoc-ref %build-inputs "bash") | ||||
|                          "/bin/bash") | ||||
|          ,(string-append "--with-rcdir=" | ||||
|                          (assoc-ref %outputs "out") "/etc/rc.d")))) | ||||
|     (native-inputs | ||||
|  | @ -100,12 +104,12 @@ | |||
|      `(("avahi"        ,avahi) | ||||
|        ("fontconfig"   ,fontconfig) | ||||
|        ("freetype"     ,freetype) | ||||
|        ("font-dejavu"  ,font-dejavu) ;needed by test suite | ||||
|        ("font-dejavu"  ,font-dejavu) ; also needed by test suite | ||||
|        ("ghostscript"  ,(force ghostscript/cups)) | ||||
|        ("ijs"          ,ijs) | ||||
|        ("dbus"         ,dbus) | ||||
|        ("lcms"         ,lcms) | ||||
|        ("libjpeg-8"    ,libjpeg-8) | ||||
|        ("libjpeg"      ,libjpeg) | ||||
|        ("libpng"       ,libpng) | ||||
|        ("libtiff"      ,libtiff) | ||||
|        ("mupdf"        ,mupdf) | ||||
|  | @ -416,7 +420,7 @@ device-specific programs to convert and print many types of files.") | |||
|     (inputs `(("libjpeg" ,libjpeg) | ||||
|               ("cups-minimal" ,cups-minimal) | ||||
|               ("libusb" ,libusb) | ||||
|               ("sane-backends" ,sane-backends) | ||||
|               ("sane-backends" ,sane-backends-minimal) | ||||
|               ("dbus" ,dbus) | ||||
|               ("python-wrapper" ,python-wrapper) | ||||
|               ("python" ,python) | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ | |||
| (define-public curl | ||||
|   (package | ||||
|    (name "curl") | ||||
|    (replacement curl-7.51.0) | ||||
|    (replacement curl-7.52.1) | ||||
|    (version "7.50.3") | ||||
|    (source (origin | ||||
|             (method url-fetch) | ||||
|  | @ -119,17 +119,17 @@ authentication (Basic, Digest, NTLM, Negotiate, kerberos...), proxy | |||
| tunneling, and so on.") | ||||
|    (license (license:non-copyleft "file://COPYING" | ||||
|                                   "See COPYING in the distribution.")) | ||||
|    (home-page "http://curl.haxx.se/"))) | ||||
|    (home-page "https://curl.haxx.se/"))) | ||||
| 
 | ||||
| (define curl-7.51.0 | ||||
| (define curl-7.52.1 | ||||
|   (package | ||||
|     (inherit curl) | ||||
|     (source | ||||
|       (let ((version "7.51.0")) | ||||
|       (let ((version "7.52.1")) | ||||
|         (origin | ||||
|           (method url-fetch) | ||||
|           (uri (string-append "https://curl.haxx.se/download/curl-" | ||||
|                               version ".tar.lzma")) | ||||
|           (sha256 | ||||
|            (base32 | ||||
|             "0605f28m2kxjcxrcfcv1ja353gv167lwyxjc3xizqbwppdmmzvwy"))))))) | ||||
|             "0r937wplchjxifxqqcjxd9rzp6l9rqqdfjn41x1y4djrh95nsa24"))))))) | ||||
|  |  | |||
|  | @ -210,7 +210,7 @@ SQL, Key/Value, XML/XQuery or Java Object storage for their data model.") | |||
| (define-public mysql | ||||
|   (package | ||||
|     (name "mysql") | ||||
|     (version "5.7.16") | ||||
|     (version "5.7.17") | ||||
|     (source (origin | ||||
|              (method url-fetch) | ||||
|              (uri (list (string-append | ||||
|  | @ -222,7 +222,7 @@ SQL, Key/Value, XML/XQuery or Java Object storage for their data model.") | |||
|                           name "-" version ".tar.gz"))) | ||||
|              (sha256 | ||||
|               (base32 | ||||
|                "198qhd9bdm0fnpp307mgby2aar92yzya0937kxi7bcpdfjcvada9")))) | ||||
|                "0lcn9cm36n14g22bcppq5vf4nxbrl3khvlsp9hsixqdfb3l27gyf")))) | ||||
|     (build-system cmake-build-system) | ||||
|     (arguments | ||||
|      `(#:configure-flags | ||||
|  | @ -285,7 +285,7 @@ Language.") | |||
| (define-public mariadb | ||||
|   (package | ||||
|     (name "mariadb") | ||||
|     (version "10.1.19") | ||||
|     (version "10.1.20") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://downloads.mariadb.org/f/" | ||||
|  | @ -293,7 +293,7 @@ Language.") | |||
|                                   name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "108s4mimdbmgmmn5pcr9a405j70cyny9adzv49s75lg22krp74sv")))) | ||||
|                 "1fd0kfw94iyprf0466kjw5mwmj4ky0i997lz6499jkb79pr86kn2")))) | ||||
|     (build-system cmake-build-system) | ||||
|     (arguments | ||||
|      '(#:configure-flags | ||||
|  |  | |||
|  | @ -54,13 +54,13 @@ clients.") | |||
| (define-public vdirsyncer | ||||
|   (package | ||||
|     (name "vdirsyncer") | ||||
|     (version "0.14.0") | ||||
|     (version "0.14.1") | ||||
|     (source (origin | ||||
|              (method url-fetch) | ||||
|              (uri (pypi-uri name version)) | ||||
|              (sha256 | ||||
|               (base32 | ||||
|                "1mbh2gykx9sqsnyfa962ifxksx4afl2lb9rcsbd6rsh3gj2il898")))) | ||||
|                "044f01fjd8dpz4y9dm3qcc1a8cihcxxbr1sz6y6fkvglpb6k85y5")))) | ||||
|     (build-system python-build-system) | ||||
|     (arguments | ||||
|       `(#:phases (modify-phases %standard-phases | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> | ||||
| ;;; Copyright © 2016 Roel Janssen <roel@gnu.org> | ||||
| ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -27,6 +28,7 @@ | |||
|   #:use-module (guix packages) | ||||
|   #:use-module (guix download) | ||||
|   #:use-module (guix build-system gnu) | ||||
|   #:use-module (guix build-system trivial) | ||||
|   #:use-module (gnu packages) | ||||
|   #:use-module (gnu packages base) | ||||
|   #:use-module (gnu packages docbook) | ||||
|  | @ -197,6 +199,40 @@ to recover data more efficiently by only reading the necessary blocks.") | |||
| which respectively make and check MS-DOS FAT file systems.") | ||||
|     (license license:gpl3+))) | ||||
| 
 | ||||
| (define dosfstools/static | ||||
|   (static-package | ||||
|    (package (inherit dosfstools)))) | ||||
| 
 | ||||
| (define-public fatfsck/static | ||||
|   (package | ||||
|     (name "fatfsck-static") | ||||
|     (version (package-version dosfstools)) | ||||
|     (build-system trivial-build-system) | ||||
|     (source #f) | ||||
|     (arguments | ||||
|      `(#:modules ((guix build utils)) | ||||
|        #:builder | ||||
|        (begin | ||||
|          (use-modules (guix build utils)) | ||||
|          (let ((src (string-append (assoc-ref %build-inputs "dosfstools") | ||||
|                                    "/sbin")) | ||||
|                (exe "fsck.fat") | ||||
|                (bin (string-append (assoc-ref %outputs "out") "/sbin"))) | ||||
|            (mkdir-p bin) | ||||
|            (with-directory-excursion bin | ||||
|              (copy-file (string-append src "/" exe) exe) | ||||
|              (remove-store-references exe) | ||||
|              (chmod exe #o555) | ||||
|              ;; Add fsck.vfat symlink to match the Linux driver name. | ||||
|              (symlink exe "fsck.vfat") | ||||
|              #t))))) | ||||
|     (inputs `(("dosfstools" ,dosfstools/static))) | ||||
|     (home-page (package-home-page dosfstools)) | ||||
|     (synopsis "Statically linked fsck.fat from dosfstools") | ||||
|     (description "This package provides a statically-linked @command{fsck.fat} | ||||
| and a @command{fsck.vfat} compatibility symlink for use in an initrd.") | ||||
|     (license (package-license dosfstools)))) | ||||
| 
 | ||||
| (define-public sdparm | ||||
|   (package | ||||
|     (name "sdparm") | ||||
|  |  | |||
|  | @ -235,7 +235,7 @@ create smooth, animated user interfaces.") | |||
|        #:tests? #f)) | ||||
| 
 | ||||
|     ;; This used to be at <http://slim.berlios.de/>. | ||||
|     (home-page "http://sourceforge.net/projects/slim.berlios/") | ||||
|     (home-page "https://sourceforge.net/projects/slim.berlios/") | ||||
|     (synopsis "Desktop-independent graphical login manager for X11") | ||||
|     (description | ||||
|      "SLiM is a Desktop-independent graphical login manager for X11, derived | ||||
|  |  | |||
|  | @ -76,7 +76,7 @@ and BOOTP/TFTP for network booting of diskless machines.") | |||
| (define-public bind | ||||
|   (package | ||||
|     (name "bind") | ||||
|     (version "9.10.4-P4") | ||||
|     (version "9.10.4-P5") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -84,7 +84,7 @@ and BOOTP/TFTP for network booting of diskless machines.") | |||
|                     version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "11lxkb7d79c75scrs28q4xmr0ii2li69zj1c650al3qxir8yf754")))) | ||||
|                 "1sqg7wg05h66vdjc8j215r04f8pg7lphkb93nsqxvzhk6r0ppi49")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (outputs `("out" "utils")) | ||||
|     (inputs | ||||
|  | @ -140,7 +140,7 @@ high-volume and high-reliability applications. The name BIND stands for | |||
| (define-public dnscrypt-proxy | ||||
|   (package | ||||
|     (name "dnscrypt-proxy") | ||||
|     (version "1.7.0") | ||||
|     (version "1.8.1") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -148,7 +148,7 @@ high-volume and high-reliability applications. The name BIND stands for | |||
|                     "dnscrypt-proxy-" version ".tar.bz2")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1qw2nib0d5ia8581lbdnjxgn9c7pf2qw8vhpnnh1wjcjj3gpgbqx")) | ||||
|                 "1dz0knslf7ysc2xx33ljrdlqyr4b0fpm9ifrwvwgcjaxgh94l7m8")) | ||||
|               (modules '((guix build utils))) | ||||
|               (snippet | ||||
|                ;; Delete bundled libltdl. XXX: This package also bundles | ||||
|  | @ -261,15 +261,17 @@ asynchronous fashion.") | |||
| (define-public yadifa | ||||
|   (package | ||||
|     (name "yadifa") | ||||
|     (version "2.2.1-6281") | ||||
|     (version "2.2.3") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (string-append "http://cdn.yadifa.eu/sites/default/files/releases/" | ||||
|                            name "-" version ".tar.gz")) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "0vj71z7i9lfbnp93k28aplwldp5mfli0kvrbwmha6fjha6kcr910")))) | ||||
|      (let ((revision "6711")) | ||||
|        (origin | ||||
|          (method url-fetch) | ||||
|          (uri | ||||
|           (string-append "http://cdn.yadifa.eu/sites/default/files/releases/" | ||||
|                          name "-" version "-" revision ".tar.gz")) | ||||
|          (sha256 | ||||
|           (base32 | ||||
|            "0ikfm40gx0zjw3gnxsw3rn1k4wb8jacgklja3ygcj1knq6hy2zaa"))))) | ||||
|     (build-system gnu-build-system) | ||||
|     (native-inputs | ||||
|      `(("which" ,which))) | ||||
|  | @ -283,6 +285,8 @@ asynchronous fashion.") | |||
|        #:configure-flags (list "--sysconfdir=/etc"      "--localstatedir=/var" | ||||
|                                "--enable-shared"        "--disable-static" | ||||
|                                "--enable-messages"      "--enable-ctrl" | ||||
|                                "--enable-nsec"          "--enable-nsec3" | ||||
|                                "--enable-tsig"          "--enable-caching" | ||||
|                                ;; NSID is a rarely-used debugging aid, that also | ||||
|                                ;; causes the build to fail. Just disable it. | ||||
|                                "--disable-nsid"))) | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2015, 2016 Andreas Enge <andreas@enge.fr> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com> | ||||
| ;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -61,7 +61,7 @@ | |||
| (define-public calibre | ||||
|   (package | ||||
|     (name "calibre") | ||||
|     (version "2.74.0") | ||||
|     (version "2.76.0") | ||||
|     (source | ||||
|       (origin | ||||
|         (method url-fetch) | ||||
|  | @ -70,7 +70,7 @@ | |||
|                             version ".tar.xz")) | ||||
|         (sha256 | ||||
|          (base32 | ||||
|           "1dpz1682zd8anvgafk2m5m123dxy1bc07ysj0z1my7zqaq1cyrm3")) | ||||
|           "1xfm586n6gm44mkyn25mbiyhj6w9ji9yl6fvmnr4zk1q6qcga3v8")) | ||||
|         ;; Remove non-free or doubtful code, see | ||||
|         ;; https://lists.gnu.org/archive/html/guix-devel/2015-02/msg00478.html | ||||
|         (modules '((guix build utils))) | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com> | ||||
| ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org> | ||||
| ;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com> | ||||
| ;;; Copyright © 2014, 2015, 2016, 2017 Alex Kost <alezost@gmail.com> | ||||
| ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch> | ||||
| ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com> | ||||
|  | @ -398,7 +398,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.") | |||
| (define-public emacs-with-editor | ||||
|   (package | ||||
|     (name "emacs-with-editor") | ||||
|     (version "2.5.8") | ||||
|     (version "2.5.9") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -407,7 +407,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1dghd0m5zwayv553g4cr990s4ig5lyh0b52qfdv5rbqnndpj3cjn")))) | ||||
|                 "0znfznyqr360ryi7za9szbz1l5236v2cig25s4k7kkw0w8828xzh")))) | ||||
|     (build-system emacs-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("emacs-dash" ,emacs-dash))) | ||||
|  | @ -423,7 +423,7 @@ on stdout instead of using a socket as the Emacsclient does.") | |||
| (define-public magit | ||||
|   (package | ||||
|     (name "magit") | ||||
|     (version "2.8.0") | ||||
|     (version "2.10.0") | ||||
|     (source (origin | ||||
|              (method url-fetch) | ||||
|              (uri (string-append | ||||
|  | @ -431,7 +431,7 @@ on stdout instead of using a socket as the Emacsclient does.") | |||
|                    version "/" name "-" version ".tar.gz")) | ||||
|              (sha256 | ||||
|               (base32 | ||||
|                "1znvb7inwinrhifqzwp4lp9j6yp1l25j7riczc0zmvcjbpl5yhfq")))) | ||||
|                "1w74vy46z922kfs7gjkrng7wjpi481calpasqmjzpn3hqvgsd5d1")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (native-inputs `(("texinfo" ,texinfo) | ||||
|                      ("emacs" ,emacs-minimal))) | ||||
|  | @ -559,7 +559,7 @@ support for Git-SVN.") | |||
|               (file-name (string-append "magit-popup-" version ".el")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0lmw824zp8c0vhikfkiay9wn4nmaksz6mfy0fldvy4wlx5c26yh3")))) | ||||
|                 "0s04jnskmggwn69ln05qfwwa32va0q5ri7dwx917wkqz17w5zi62")))) | ||||
|     (build-system emacs-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("emacs-dash" ,emacs-dash))) | ||||
|  | @ -1245,6 +1245,83 @@ and stored in memory.") | |||
|     (description "This package provides a modern list API library for Emacs.") | ||||
|     (license license:gpl3+))) | ||||
| 
 | ||||
| (define-public emacs-bui | ||||
|   (package | ||||
|     (name "emacs-bui") | ||||
|     (version "1.1.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|                     "https://github.com/alezost/bui.el/archive/v" | ||||
|                     version ".tar.gz")) | ||||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "112k0mq6xpy0r47vk66miw7rxbkv3d06pv3pd0vcmrhcnhnnk486")))) | ||||
|     (build-system emacs-build-system) | ||||
|     (propagated-inputs | ||||
|      `(("dash" ,emacs-dash))) | ||||
|     (home-page "https://github.com/alezost/bui.el") | ||||
|     (synopsis "Buffer interface library for Emacs") | ||||
|     (description | ||||
|      "BUI (Buffer User Interface) is a library for making @code{list} and | ||||
| @code{info} interfaces to display an arbitrary data of the same | ||||
| type, for example: packages, buffers, files, etc.") | ||||
|     (license license:gpl3+))) | ||||
| 
 | ||||
| (define-public emacs-guix | ||||
|   (package | ||||
|     (name "emacs-guix") | ||||
|     (version "0.2.2") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/alezost/guix.el" | ||||
|                                   "/releases/download/v" version | ||||
|                                   "/emacs-guix-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1i47yh24xvgmnc778765g3j9ip0xb2y85v6w83r4qmkigk9rl2ck")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:configure-flags | ||||
|        (let ((guix        (assoc-ref %build-inputs "guix")) | ||||
|              (geiser      (assoc-ref %build-inputs "geiser")) | ||||
|              (dash        (assoc-ref %build-inputs "dash")) | ||||
|              (bui         (assoc-ref %build-inputs "bui")) | ||||
|              (magit-popup (assoc-ref %build-inputs "magit-popup")) | ||||
|              (site-lisp   "/share/emacs/site-lisp")) | ||||
|          (list (string-append "--with-guix-site-dir=" | ||||
|                               guix "/share/guile/site/2.0") | ||||
|                (string-append "--with-geiser-lispdir=" geiser site-lisp) | ||||
|                (string-append "--with-dash-lispdir=" | ||||
|                               dash site-lisp "/guix.d/dash-" | ||||
|                               ,(package-version emacs-dash)) | ||||
|                (string-append "--with-bui-lispdir=" | ||||
|                               bui site-lisp "/guix.d/bui-" | ||||
|                               ,(package-version emacs-bui)) | ||||
|                (string-append "--with-popup-lispdir=" | ||||
|                               magit-popup site-lisp "/guix.d/magit-popup-" | ||||
|                               ,(package-version emacs-magit-popup)))))) | ||||
|     (native-inputs | ||||
|      `(("pkg-config" ,pkg-config) | ||||
|        ("emacs" ,emacs-minimal))) | ||||
|     (inputs | ||||
|      `(("guile" ,guile-2.0) | ||||
|        ("guix" ,guix))) | ||||
|     (propagated-inputs | ||||
|      `(("geiser" ,geiser) | ||||
|        ("dash" ,emacs-dash) | ||||
|        ("bui" ,emacs-bui) | ||||
|        ("magit-popup" ,emacs-magit-popup))) | ||||
|     (home-page "https://github.com/alezost/guix.el") | ||||
|     (synopsis "Emacs interface for GNU Guix") | ||||
|     (description | ||||
|      "Emacs-Guix provides a visual interface, tools and features for the GNU | ||||
| Guix package manager.  Particularly, it allows you to do various package | ||||
| management tasks from Emacs.  To begin with, run @code{M-x guix-about} or | ||||
| @code{M-x guix-help} command.") | ||||
|     (license license:gpl3+))) | ||||
| 
 | ||||
| (define-public emacs-d-mode | ||||
|   (package | ||||
|     (name "emacs-d-mode") | ||||
|  | @ -1337,6 +1414,32 @@ strings.") | |||
| files and directories.") | ||||
|     (license license:gpl3+))) | ||||
| 
 | ||||
| (define-public emacs-git-gutter | ||||
|   (package | ||||
|     (name "emacs-git-gutter") | ||||
|     (version "0.90") | ||||
|     (source (origin | ||||
|              (method url-fetch) | ||||
|              (uri (string-append | ||||
|                    "https://github.com/syohex/" name "/archive/" | ||||
|                    version ".tar.gz")) | ||||
|              (file-name (string-append name "-" version ".tar.gz")) | ||||
|              (sha256 | ||||
|               (base32 | ||||
|                "1nmhvhpq1l56mj2yq3ag23rw3x4xgnsy8szp30s26l0yjnkhc4qg")))) | ||||
|     (build-system emacs-build-system) | ||||
|     (home-page "https://github.com/syohex/emacs-git-gutter") | ||||
|     (synopsis "See and manage hunks of text in a version control system") | ||||
|     (description | ||||
|      "This package is an Emacs minor mode for displaying and interacting with | ||||
| hunks of text managed in a version control system.  Added modified and deleted | ||||
| areas can be indicated with symbols on the edge of the buffer, and commands | ||||
| can be used to move between and perform actions on these hunks. | ||||
| 
 | ||||
| Git, Mercurial, Subversion and Bazaar are supported, and many parts of the | ||||
| display and behaviour is easily customisable.") | ||||
|     (license license:gpl3+))) | ||||
| 
 | ||||
| (define-public emacs-el-mock | ||||
|   (package | ||||
|     (name "emacs-el-mock") | ||||
|  | @ -2226,7 +2329,7 @@ dark background.") | |||
| (define-public emacs-smartparens | ||||
|   (package | ||||
|     (name "emacs-smartparens") | ||||
|     (version "1.8.0") | ||||
|     (version "1.9.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -2235,7 +2338,7 @@ dark background.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0xsqiklg0q4w6gj0js1hvsz4lkypvcx6c9kzb1mz232gwlqx1azw")))) | ||||
|                 "12065r7h1s9v8lnq5mk3654dkw4cq60ky8aniqq5n2ivv6qd2d4q")))) | ||||
|     (build-system emacs-build-system) | ||||
|     (propagated-inputs `(("emacs-dash" ,emacs-dash))) | ||||
|     (home-page "https://github.com/Fuco1/smartparens") | ||||
|  | @ -3189,14 +3292,14 @@ passive voice.") | |||
| (define-public emacs-org | ||||
|   (package | ||||
|     (name "emacs-org") | ||||
|     (version "20161118") | ||||
|     (version "20161224") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "http://elpa.gnu.org/packages/org-" | ||||
|                                   version ".tar")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1w9g8r08kaiw9f4fjsj0hbffzq85rj734j5lxvbaafbnz7dbklk1")))) | ||||
|                 "0b10bjypn0w5ja776f8sxl1qpvb61iyz1n3c74jx6fqwypv7dmgi")))) | ||||
|     (build-system emacs-build-system) | ||||
|     (home-page "http://orgmode.org/") | ||||
|     (synopsis "Outline-based notes management and organizer") | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org> | ||||
| ;;; Copyright © 2016 David Craven <david@craven.ch> | ||||
| ;;; | ||||
|  | @ -30,7 +30,9 @@ | |||
|   #:use-module (guix build utils) | ||||
|   #:use-module (gnu packages) | ||||
|   #:use-module (gnu packages autotools) | ||||
|   #:use-module (gnu packages bison) | ||||
|   #:use-module (gnu packages cross-base) | ||||
|   #:use-module (gnu packages dejagnu) | ||||
|   #:use-module (gnu packages flex) | ||||
|   #:use-module (gnu packages gcc) | ||||
|   #:use-module (gnu packages gdb) | ||||
|  | @ -369,3 +371,351 @@ language.") | |||
|       (description "OpenOCD provides on-chip programming and debugging support | ||||
| with a layered architecture of JTAG interface and TAP support.") | ||||
|       (license license:gpl2+)))) | ||||
| 
 | ||||
| ;; The commits for all propeller tools are the latest versions as published | ||||
| ;; here: https://github.com/dbetz/propeller-gcc | ||||
| 
 | ||||
| (define propeller-binutils | ||||
|   (let ((xbinutils (cross-binutils "propeller-elf")) | ||||
|         (commit "3bfba30076f8ce160a2f42914fdb68f24445fd44") | ||||
|         (revision "1")) | ||||
|     (package | ||||
|       (inherit xbinutils) | ||||
|       (name "propeller-binutils") | ||||
|       (version (string-append "0.0.0-" revision "." (string-take commit 9))) | ||||
|       (source (origin (inherit (package-source xbinutils)) | ||||
|                 (method git-fetch) | ||||
|                 (uri (git-reference | ||||
|                       (url "https://github.com/totalspectrum/binutils-propeller.git") | ||||
|                       (commit commit))) | ||||
|                 (file-name (string-append name "-" commit "-checkout")) | ||||
|                 (sha256 | ||||
|                  (base32 | ||||
|                   "1v3rgxwj7b8817wy5ccf8621v75qcxvcxygk4acr3hbc6yqybr8h")))) | ||||
|       (arguments | ||||
|        `(;; FIXME: For some reason there are many test failures.  Some of them | ||||
|          ;; appear to be due to regular expression mismatch, but it's not | ||||
|          ;; obvious how to fix the failures. | ||||
|          #:tests? #f | ||||
|          #:phases | ||||
|          (modify-phases %standard-phases | ||||
|            (add-after 'unpack 'patch-/bin/sh-in-tests | ||||
|              (lambda _ | ||||
|                (substitute* '("sim/testsuite/Makefile.in" | ||||
|                               "sim/testsuite/mips64el-elf/Makefile.in" | ||||
|                               "sim/testsuite/d10v-elf/Makefile.in" | ||||
|                               "sim/testsuite/sim/cris/asm/badarch1.ms") | ||||
|                  (("/bin/sh") (which "sh"))) | ||||
|                #t))) | ||||
|          ,@(package-arguments xbinutils))) | ||||
|       (native-inputs | ||||
|        `(("bison" ,bison) | ||||
|          ("flex" ,flex) | ||||
|          ("texinfo" ,texinfo) | ||||
|          ("dejagnu" ,dejagnu) | ||||
|          ,@(package-native-inputs xbinutils)))))) | ||||
| 
 | ||||
| (define-public propeller-gcc | ||||
|   (let ((xgcc (cross-gcc "propeller-elf" | ||||
|                          propeller-binutils)) | ||||
|         (commit "b4f45a4725e0b6d0af59e594c4e3e35ca4105867") | ||||
|         (revision "1")) | ||||
|     (package (inherit xgcc) | ||||
|       (name "propeller-gcc") | ||||
|       (version (string-append "6.0.0-" revision "." (string-take commit 9))) | ||||
|       (source (origin | ||||
|                 (method git-fetch) | ||||
|                 (uri (git-reference | ||||
|                       (url "https://github.com/totalspectrum/gcc-propeller.git") | ||||
|                       (commit commit))) | ||||
|                 (file-name (string-append name "-" commit "-checkout")) | ||||
|                 (sha256 | ||||
|                  (base32 | ||||
|                   "0d9kdxm2fzanjqa7q5850kzbsfl0fqyaahxn74h6nkxxacwa11zb")) | ||||
|                 (patches | ||||
|                  (append | ||||
|                   (origin-patches (package-source gcc-6)) | ||||
|                   (search-patches "gcc-cross-environment-variables.patch"))))) | ||||
|       (native-inputs | ||||
|        `(("flex" ,flex) | ||||
|          ,@(package-native-inputs xgcc))) | ||||
|       ;; All headers and cross libraries of the propeller toolchain are | ||||
|       ;; installed under the "propeller-elf" prefix. | ||||
|       (native-search-paths | ||||
|        (list (search-path-specification | ||||
|               (variable "CROSS_C_INCLUDE_PATH") | ||||
|               (files '("propeller-elf/include"))) | ||||
|              (search-path-specification | ||||
|               (variable "CROSS_LIBRARY_PATH") | ||||
|               (files '("propeller-elf/lib"))))) | ||||
|       (home-page "https://github.com/totalspectrum/gcc-propeller") | ||||
|       (synopsis "GCC for the Parallax Propeller")))) | ||||
| 
 | ||||
| ;; There is no release, so we take the latest version as referenced from here: | ||||
| ;; https://github.com/dbetz/propeller-gcc | ||||
| (define-public proplib | ||||
|   (let ((commit "844741fe0ceb140ab2fdf9d0667f68c1c39c31da") | ||||
|         (revision "1")) | ||||
|     (package | ||||
|       (name "proplib") | ||||
|       (version (string-append "0.0.0-" revision "." (string-take commit 9))) | ||||
|       (source (origin | ||||
|                 (method git-fetch) | ||||
|                 (uri (git-reference | ||||
|                       (url "https://github.com/totalspectrum/proplib.git") | ||||
|                       (commit commit))) | ||||
|                 (file-name (string-append name "-" commit "-checkout")) | ||||
|                 (sha256 | ||||
|                  (base32 | ||||
|                   "0q7irf1x8iqx07n7lzksax9armrdkizs49swsz76nbks0mw67wiv")))) | ||||
|       (build-system gnu-build-system) | ||||
|       (arguments | ||||
|        `(#:tests? #f ; no tests | ||||
|          #:make-flags | ||||
|          (list (string-append "PREFIX=" (assoc-ref %outputs "out")) | ||||
|                (string-append "BUILD="  (getcwd) "/build")) | ||||
|          #:phases | ||||
|          (modify-phases %standard-phases | ||||
|            (delete 'configure) | ||||
|            (add-after 'unpack 'fix-Makefile | ||||
|              (lambda _ | ||||
|                (substitute* "Makefile" | ||||
|                  ;; The GCC sources are not part of this package, so we cannot | ||||
|                  ;; install the out-of-tree license file. | ||||
|                  (("cp \\.\\..*") "") | ||||
|                  ;; Control the installation time of the headers. | ||||
|                  ((" install-includes") "")) | ||||
|                #t)) | ||||
|            ;; The Makefile does not separate building from installation, so we | ||||
|            ;; have to create the target directories at build time. | ||||
|            (add-before 'build 'create-target-directories | ||||
|              (lambda* (#:key make-flags #:allow-other-keys) | ||||
|                (zero? (apply system* "make" "install-dirs" make-flags)))) | ||||
|            (add-before 'build 'set-cross-environment-variables | ||||
|              (lambda* (#:key outputs #:allow-other-keys) | ||||
|                (setenv "CROSS_LIBRARY_PATH" | ||||
|                        (string-append (assoc-ref outputs "out") | ||||
|                                       "/propeller-elf/lib:" | ||||
|                                       (or (getenv "CROSS_LIBRARY_PATH") ""))) | ||||
|                (setenv "CROSS_C_INCLUDE_PATH" | ||||
|                        (string-append (assoc-ref outputs "out") | ||||
|                                       "/propeller-elf/include:" | ||||
|                                       (or (getenv "CROSS_C_INCLUDE_PATH") ""))) | ||||
|                #t)) | ||||
|            (add-after 'build 'build-tiny | ||||
|              (lambda* (#:key make-flags #:allow-other-keys) | ||||
|                (zero? (apply system* "make" "tiny" make-flags)))) | ||||
|            ;; The build of the tiny libraries depends on the includes to be | ||||
|            ;; available.  Since we set CROSS_C_INCLUDE_PATH to the output | ||||
|            ;; directory, we have to install the includes first. | ||||
|            (add-before 'build-tiny 'install-includes | ||||
|              (lambda* (#:key make-flags #:allow-other-keys) | ||||
|                (zero? (apply system* "make" "install-includes" make-flags)))) | ||||
|            (add-after 'install 'install-tiny | ||||
|              (lambda* (#:key make-flags #:allow-other-keys) | ||||
|                (zero? (apply system* "make" "install-tiny" make-flags))))))) | ||||
|       (native-inputs | ||||
|        `(("propeller-gcc" ,propeller-gcc) | ||||
|          ("propeller-binutils" ,propeller-binutils) | ||||
|          ("perl" ,perl))) | ||||
|       (home-page "https://github.com/totalspectrum/proplib") | ||||
|       (synopsis "C library for the Parallax Propeller") | ||||
|       (description "This is a C library for the Parallax Propeller | ||||
| micro-controller.") | ||||
|       ;; Most of the code is released under the Expat license.  Some of the | ||||
|       ;; included code is public domain and some changes are BSD licensed. | ||||
|       (license license:expat)))) | ||||
| 
 | ||||
| (define-public propeller-toolchain | ||||
|   (package | ||||
|     (name "propeller-toolchain") | ||||
|     (version (package-version propeller-gcc)) | ||||
|     (source #f) | ||||
|     (build-system trivial-build-system) | ||||
|     (arguments '(#:builder (mkdir %output))) | ||||
|     (propagated-inputs | ||||
|      `(("binutils" ,propeller-binutils) | ||||
|        ("libc" ,proplib) | ||||
|        ("gcc" ,propeller-gcc))) | ||||
|     (synopsis "Complete GCC tool chain for Propeller micro-controllers") | ||||
|     (description "This package provides a complete GCC tool chain for | ||||
| Propeller micro-controller development.") | ||||
|     (home-page (package-home-page propeller-gcc)) | ||||
|     (license (package-license propeller-gcc)))) | ||||
| 
 | ||||
| (define-public openspin | ||||
|   (package | ||||
|     (name "openspin") | ||||
|     (version "1.00.78") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/parallaxinc/" | ||||
|                                   "OpenSpin/archive/" version ".tar.gz")) | ||||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1k2dbz1v604g4r2d9qhckg2m8dnhiya760mbsqfsg4waxal87yb7")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:tests? #f ; no tests | ||||
|        #:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (delete 'configure) | ||||
|          (add-after 'unpack 'remove-timestamp | ||||
|            (lambda _ | ||||
|              (substitute* "SpinSource/openspin.cpp" | ||||
|                ((" Compiled on.*$") "\\n\");")) | ||||
|              #t)) | ||||
|          ;; Makefile does not include "install" target | ||||
|          (replace 'install | ||||
|            (lambda* (#:key outputs #:allow-other-keys) | ||||
|              (let ((bin (string-append (assoc-ref outputs "out") | ||||
|                                        "/bin"))) | ||||
|                (mkdir-p bin) | ||||
|                (install-file "build/openspin" bin) | ||||
|                #t)))))) | ||||
|     (home-page "https://github.com/parallaxinc/OpenSpin") | ||||
|     (synopsis "Spin/PASM compiler for the Parallax Propeller") | ||||
|     (description "OpenSpin is a compiler for the Spin/PASM language of the | ||||
| Parallax Propeller.  It was ported from Chip Gracey's original x86 assembler | ||||
| code.") | ||||
|     (license license:expat))) | ||||
| 
 | ||||
| (define-public propeller-load | ||||
|   (let ((commit "ba9c0a7251cf751d8d292ae19ffa03132097c0c0") | ||||
|         (revision "1")) | ||||
|     (package | ||||
|       (name "propeller-load") | ||||
|       (version "3.4.0") | ||||
|       (source (origin | ||||
|                 (method git-fetch) | ||||
|                 (uri (git-reference | ||||
|                       (url "https://github.com/dbetz/propeller-load.git") | ||||
|                       (commit commit))) | ||||
|                 (file-name (string-append name "-" commit "-checkout")) | ||||
|                 (sha256 | ||||
|                  (base32 | ||||
|                   "1qv3xaapl9fmj3zn58b60sprp4rnvnlpci8ci0pdrzkw6fhvx3pg")))) | ||||
|       (build-system gnu-build-system) | ||||
|       (arguments | ||||
|        `(#:tests? #f ; no tests | ||||
|          #:make-flags | ||||
|          (list "OS=linux" | ||||
|                (string-append "TARGET=" (assoc-ref %outputs "out"))) | ||||
|          #:phases | ||||
|          (modify-phases %standard-phases | ||||
|            (delete 'configure)))) | ||||
|       (native-inputs | ||||
|        `(("openspin" ,openspin) | ||||
|          ("propeller-toolchain" ,propeller-toolchain))) | ||||
|       (home-page "https://github.com/dbetz/propeller-load") | ||||
|       (synopsis "Loader for Parallax Propeller micro-controllers") | ||||
|       (description "This package provides the tool @code{propeller-load} to | ||||
| upload binaries to a Parallax Propeller micro-controller.") | ||||
|       (license license:expat)))) | ||||
| 
 | ||||
| (define-public spin2cpp | ||||
|   (package | ||||
|     (name "spin2cpp") | ||||
|     (version "3.4.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/totalspectrum/spin2cpp/" | ||||
|                                   "archive/v" version ".tar.gz")) | ||||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "00i8i0dspd5115ggkv5vx2xqb21l6y38wz0bakgby8n3b4k9xnk0")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:tests? #f ;; The tests assume that a micro-controller is connected. | ||||
|        #:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (delete 'configure) | ||||
|          (add-before 'build 'set-cross-environment-variables | ||||
|            (lambda* (#:key inputs #:allow-other-keys) | ||||
|              (setenv "CROSS_LIBRARY_PATH" | ||||
|                      (string-append (assoc-ref inputs "propeller-toolchain") | ||||
|                                     "/propeller-elf/lib")) | ||||
|              (setenv "CROSS_C_INCLUDE_PATH" | ||||
|                      (string-append (assoc-ref inputs "propeller-toolchain") | ||||
|                                     "/propeller-elf/include")) | ||||
|              #t)) | ||||
|          (replace 'install | ||||
|            (lambda* (#:key outputs #:allow-other-keys) | ||||
|              (let ((bin (string-append (assoc-ref outputs "out") | ||||
|                                        "/bin"))) | ||||
|                (for-each (lambda (file) | ||||
|                            (install-file (string-append "build/" file) | ||||
|                                          bin)) | ||||
|                          '("testlex" "spin2cpp" "fastspin"))) | ||||
|              #t))))) | ||||
|     (native-inputs | ||||
|      `(("bison" ,bison) | ||||
|        ("propeller-load" ,propeller-load) | ||||
|        ("propeller-toolchain" ,propeller-toolchain))) | ||||
|     (home-page "https://github.com/totalspectrum/spin2cpp") | ||||
|     (synopsis "Convert Spin code to C, C++, or PASM code") | ||||
|     (description "This is a set of tools for converting the Spin language for | ||||
| the Parallax Propeller micro-controller into C or C++ code, into PASM, or even | ||||
| directly into an executable binary.  The binaries produced use LMM PASM, so | ||||
| they are much faster than regular Spin bytecodes (but also quite a bit | ||||
| larger).") | ||||
|     (license license:expat))) | ||||
| 
 | ||||
| (define-public spinsim | ||||
|   (let ((commit "66915a7ad1a3a2cf990a725bb341fab8d11eb620") | ||||
|         (revision "1")) | ||||
|     (package | ||||
|       (name "spinsim") | ||||
|       (version (string-append "0.75-" revision "." (string-take commit 9))) | ||||
|       (source (origin | ||||
|                 (method git-fetch) | ||||
|                 (uri (git-reference | ||||
|                       (url "https://github.com/parallaxinc/spinsim.git") | ||||
|                       (commit commit))) | ||||
|                 (file-name (string-append name "-" commit "-checkout")) | ||||
|                 (sha256 | ||||
|                  (base32 | ||||
|                   "1n9kdhlxsdx7bz6c80w8dhi96zp633gd6qs0x9i4ii8qv4i7sj5k")))) | ||||
|       (build-system gnu-build-system) | ||||
|       (arguments | ||||
|        `(#:tests? #f ; no tests | ||||
|          #:phases | ||||
|          (modify-phases %standard-phases | ||||
|            (delete 'configure) | ||||
|            (replace 'install | ||||
|              (lambda* (#:key outputs #:allow-other-keys) | ||||
|                (let ((bin (string-append (assoc-ref outputs "out") | ||||
|                                          "/bin"))) | ||||
|                  (install-file "build/spinsim" bin)) | ||||
|                #t))))) | ||||
|       (home-page "https://github.com/parallaxinc/spinsim") | ||||
|       (synopsis "Spin simulator") | ||||
|       (description "This package provides the tool @code{spinsim}, a simulator | ||||
| and simple debugger for Spin programs written for a Parallax Propeller | ||||
| micro-controller.  Spinsim supports execution from cog memory and hub | ||||
| execution, but it does not support multi-tasking.  It supports about | ||||
| two-thirds of the opcodes in the P2 instruction set.") | ||||
|       (license license:expat)))) | ||||
| 
 | ||||
| (define-public propeller-development-suite | ||||
|   (package | ||||
|     (name "propeller-development-suite") | ||||
|     (version (package-version propeller-gcc)) | ||||
|     (source #f) | ||||
|     (build-system trivial-build-system) | ||||
|     (arguments '(#:builder (mkdir %output))) | ||||
|     (propagated-inputs | ||||
|      `(("toolchain" ,propeller-toolchain) | ||||
|        ("openspin" ,openspin) | ||||
|        ("propeller-load" ,propeller-load) | ||||
|        ("spin2cpp" ,spin2cpp) | ||||
|        ("spinsim" ,spinsim))) | ||||
|     (synopsis "Complete development suite for Propeller micro-controllers") | ||||
|     (description "This meta-package provides a complete environment for the | ||||
| development with Parallax Propeller micro-controllers.  It includes the GCC | ||||
| toolchain, the loader, the Openspin compiler, the Spin2cpp tool, and the Spin | ||||
| simulator.") | ||||
|     (home-page (package-home-page propeller-gcc)) | ||||
|     (license (package-license propeller-gcc)))) | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 David Thompson <davet@gnu.org> | ||||
| ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
|  | @ -545,7 +545,7 @@ as well as pick-place files.") | |||
|                                         (getenv "CPLUS_INCLUDE_PATH"))) | ||||
|                  #t))) | ||||
|            (add-after 'install 'install-guile-bindings | ||||
|              (lambda* (#:key outputs #:allow-other-keys) | ||||
|              (lambda* (#:key inputs outputs #:allow-other-keys) | ||||
|                ;; Install the Guile bindings (the build system only installs | ||||
|                ;; libao.so.) | ||||
|                (let* ((out    (assoc-ref outputs "out")) | ||||
|  | @ -574,6 +574,14 @@ as well as pick-place files.") | |||
| 
 | ||||
|                    (install-file "bin/ao-guile" | ||||
|                                  (string-append out "/bin")) | ||||
| 
 | ||||
|                    ;; Allow Ao to dlopen the relevant GL libraries.  Otherwise | ||||
|                    ;; it fails with: | ||||
|                    ;;   Couldn't find current GLX or EGL context. | ||||
|                    (let ((mesa (assoc-ref inputs "mesa"))) | ||||
|                      (wrap-program (string-append out "/bin/ao-guile") | ||||
|                        `("LD_LIBRARY_PATH" ":" prefix | ||||
|                          (,(string-append mesa "/lib"))))) | ||||
|                    #t))))))) | ||||
|       (native-inputs | ||||
|        `(("pkg-config" ,pkg-config))) | ||||
|  | @ -583,6 +591,7 @@ as well as pick-place files.") | |||
|          ("libpng" ,libpng) | ||||
|          ("glfw" ,glfw) | ||||
|          ("libepoxy" ,libepoxy) | ||||
|          ("mesa" ,mesa) | ||||
|          ("eigen" ,eigen) | ||||
|          ("glm" ,glm) | ||||
|          ("guile" ,guile-2.0))) | ||||
|  |  | |||
|  | @ -197,7 +197,7 @@ Libraries with some extra bells and whistles.") | |||
| (define-public enlightenment | ||||
|   (package | ||||
|     (name "enlightenment") | ||||
|     (version "0.21.4") | ||||
|     (version "0.21.5") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri | ||||
|  | @ -205,7 +205,7 @@ Libraries with some extra bells and whistles.") | |||
|                               name "/" name "-" version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "085zn6vdy904fxa9krx7ljv61yg96b2xk56g0bx2lyq1d33sgl8f")))) | ||||
|                 "1fslq70z4s6v9ipahnk8s5fgqnqq4njv4rlqv951r1bh1xk5lx7h")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      `(#:configure-flags '("--enable-mount-eeze"))) | ||||
|  |  | |||
|  | @ -7,13 +7,14 @@ | |||
| ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr> | ||||
| ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name> | ||||
| ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> | ||||
| ;;; Copyright © 2016, 2017 ng0 <ng0@libertad.pw> | ||||
| ;;; Copyright © 2016 Jookia <166291@gmail.com> | ||||
| ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org> | ||||
| ;;; Copyright © 2016 Dmitry Nikolaev <cameltheman@gmail.com> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
| ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com> | ||||
| ;;; Copyright © 2016 Toni Reina <areina@riseup.net> | ||||
| ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -108,12 +109,10 @@ in print.  With attention to detail for high resolution rendering.") | |||
|                      (mkdir-p doc-dir) | ||||
|                      (chdir (string-append "ubuntu-font-family-" ,version)) | ||||
|                      (for-each (lambda (ttf) | ||||
|                                  (copy-file ttf | ||||
|                                             (string-append font-dir "/" ttf))) | ||||
|                                  (install-file ttf font-dir)) | ||||
|                                (find-files "." "\\.ttf$")) | ||||
|                      (for-each (lambda (doc) | ||||
|                                  (copy-file doc | ||||
|                                             (string-append doc-dir "/" doc))) | ||||
|                                  (install-file doc doc-dir)) | ||||
|                                (find-files "." "\\.txt$")))))) | ||||
|     (native-inputs `(("source" ,source) | ||||
|                      ("unzip" ,unzip))) | ||||
|  | @ -165,19 +164,13 @@ TrueType (TTF) files.") | |||
|                      (mkdir-p doc-dir) | ||||
|                      (chdir (string-append "dejavu-fonts-ttf-" ,version)) | ||||
|                      (for-each (lambda (ttf) | ||||
|                                  (copy-file ttf | ||||
|                                             (string-append font-dir "/" | ||||
|                                                            (basename ttf)))) | ||||
|                                  (install-file ttf font-dir)) | ||||
|                                (find-files "ttf" "\\.ttf$")) | ||||
|                      (for-each (lambda (conf) | ||||
|                                  (copy-file conf | ||||
|                                             (string-append conf-dir "/" | ||||
|                                                            (basename conf)))) | ||||
|                                  (install-file conf conf-dir)) | ||||
|                                (find-files "fontconfig" "\\.conf$")) | ||||
|                      (for-each (lambda (doc) | ||||
|                                  (copy-file doc | ||||
|                                             (string-append doc-dir "/" | ||||
|                                                            (basename doc)))) | ||||
|                                  (install-file doc doc-dir)) | ||||
|                                (find-files "." "\\.txt$|^[A-Z][A-Z]*$")))))) | ||||
|     (native-inputs `(("source" ,source) | ||||
|                      ("tar" ,tar) | ||||
|  | @ -186,7 +179,7 @@ TrueType (TTF) files.") | |||
|     (synopsis "Vera font family derivate with additional characters") | ||||
|     (description "DejaVu provides an expanded version of the Vera font family | ||||
| aiming for quality and broader Unicode coverage while retaining the original | ||||
| Vera style.  DejaVu currently works towards conformance with the Multilingual | ||||
| Vera style.  DejaVu currently works towards conformance to the Multilingual | ||||
| European Standards (MES-1 and MES-2) for Unicode coverage.  The DejaVu fonts | ||||
| provide serif, sans and monospaced variants.") | ||||
|     (license | ||||
|  | @ -229,12 +222,10 @@ provide serif, sans and monospaced variants.") | |||
|                      (mkdir-p doc-dir) | ||||
|                      (chdir (string-append "ttf-bitstream-vera-" ,version)) | ||||
|                      (for-each (lambda (ttf) | ||||
|                                  (copy-file ttf | ||||
|                                             (string-append font-dir "/" ttf))) | ||||
|                                  (install-file ttf font-dir)) | ||||
|                                (find-files "." "\\.ttf$")) | ||||
|                      (for-each (lambda (doc) | ||||
|                                  (copy-file doc | ||||
|                                             (string-append doc-dir "/" doc))) | ||||
|                                  (install-file doc doc-dir)) | ||||
|                                (find-files "." "\\.TXT$")))))) | ||||
|     (native-inputs `(("source" ,source) | ||||
|                      ("tar" ,tar) | ||||
|  | @ -294,9 +285,7 @@ sans-serif designed for on-screen reading.  It is used by GNOME@tie{}3.") | |||
|                        (system* "make" "ttftar") | ||||
|                        (mkdir-p font-dir) | ||||
|                        (for-each (lambda (file) | ||||
|                                    (copy-file file | ||||
|                                               (string-append font-dir "/" | ||||
|                                                              (basename file)))) | ||||
|                                    (install-file file font-dir)) | ||||
|                                  (filter | ||||
|                                    (lambda (file) (string-suffix? "ttf" file)) | ||||
|                                    (find-files "." ""))))))) | ||||
|  | @ -348,14 +337,10 @@ sans-serif designed for on-screen reading.  It is used by GNOME@tie{}3.") | |||
|            (mkdir-p doc-dir) | ||||
|            (chdir (string-append "liberation-fonts-ttf-" ,version)) | ||||
|            (for-each (lambda (ttf) | ||||
|                        (copy-file ttf | ||||
|                                   (string-append font-dir "/" | ||||
|                                                  (basename ttf)))) | ||||
|                        (install-file ttf font-dir)) | ||||
|                      (find-files "." "\\.ttf$")) | ||||
|            (for-each (lambda (doc) | ||||
|                        (copy-file doc | ||||
|                                   (string-append doc-dir "/" | ||||
|                                                  (basename doc)))) | ||||
|                        (install-file doc doc-dir)) | ||||
|                      '("AUTHORS" "ChangeLog" "LICENSE" "README" "TODO")))))) | ||||
|     (native-inputs | ||||
|      `(("source" ,source) | ||||
|  | @ -367,17 +352,16 @@ sans-serif designed for on-screen reading.  It is used by GNOME@tie{}3.") | |||
|     (description | ||||
|      "The Liberation font family aims at metric compatibility with | ||||
| Arial, Times New Roman, and Courier New. | ||||
| 
 | ||||
| There are three sets: | ||||
| 
 | ||||
| - Sans (a substitute for Arial, Albany, Helvetica, Nimbus Sans L, and | ||||
| @enumerate | ||||
| @item Sans (a substitute for Arial, Albany, Helvetica, Nimbus Sans L, and | ||||
| Bitstream Vera Sans); | ||||
| 
 | ||||
| - Serif (a substitute for Times New Roman, Thorndale, Nimbus Roman, and | ||||
| @item Serif (a substitute for Times New Roman, Thorndale, Nimbus Roman, and | ||||
| Bitstream Vera Serif); | ||||
| 
 | ||||
| - Mono (a substitute for Courier New, Cumberland, Courier, Nimbus Mono L, | ||||
| @item Mono (a substitute for Courier New, Cumberland, Courier, Nimbus Mono L, | ||||
| and Bitstream Vera Sans Mono). | ||||
| @end enumerate | ||||
| 
 | ||||
| The Liberation Fonts are sponsored by Red Hat.") | ||||
|     (license license:silofl1.1))) | ||||
|  | @ -414,8 +398,8 @@ The Liberation Fonts are sponsored by Red Hat.") | |||
|        #:tests? #f)) ;; No test target in tarball | ||||
|     (home-page "http://terminus-font.sourceforge.net/") | ||||
|     (synopsis "Simple bitmap programming font") | ||||
|     (description "Terminus Font is a clean, fixed width bitmap font, designed | ||||
| for long (8 and more hours per day) work with computers.") | ||||
|     (description "Terminus Font is a clean, fixed-width bitmap font, designed | ||||
| for long periods of working with computers (8 or more hours per day).") | ||||
|     (license license:silofl1.1))) | ||||
| 
 | ||||
| (define-public font-adobe-source-han-sans | ||||
|  | @ -501,8 +485,7 @@ text in Simplified Chinese, Traditional Chinese, Japanese, and Korean.") | |||
|            (mkdir-p font-dir) | ||||
|            (system* "tar" "xvf" (assoc-ref %build-inputs "source")) | ||||
|            (chdir "wqy-zenhei") | ||||
|            (copy-file "wqy-zenhei.ttc" | ||||
|                       (string-append font-dir "wqy-zenhei.ttc")))))) | ||||
|            (install-file "wqy-zenhei.ttc" font-dir))))) | ||||
|     (native-inputs | ||||
|      `(("gzip" ,gzip) | ||||
|        ("tar" ,tar))) | ||||
|  | @ -512,12 +495,12 @@ text in Simplified Chinese, Traditional Chinese, Japanese, and Korean.") | |||
|      "WenQuanYi Zen Hei is a Hei-Ti style (sans-serif type) Chinese outline | ||||
| font.  It is designed for general purpose text formatting and on-screen | ||||
| display of Chinese characters and symbols from many other languages. | ||||
| WenQuanYi Zen Hei provides a rather complete coverage to Chinese Hanzi glyphs, | ||||
| WenQuanYi Zen Hei provides a rather complete coverage of Chinese Hanzi glyphs, | ||||
| including both simplified and traditional forms.  The total glyph number in | ||||
| this font is over 35,000, including over 21,000 Chinese Hanzi.  This font has | ||||
| full coverage to GBK(CP936) charset, CJK Unified Ideographs, as well as the | ||||
| code-points needed for zh_cn, zh_sg, zh_tw, zh_hk, zh_mo, ja (Japanese) and | ||||
| ko (Korean) locales for fontconfig.") | ||||
| full coverage of the GBK (CP936) charset, CJK Unified Ideographs, as well as | ||||
| the code-points needed for zh_cn, zh_sg, zh_tw, zh_hk, zh_mo, ja (Japanese) and | ||||
| ko (Korean) locales for @code{fontconfig}.") | ||||
|     ;; GPLv2 with font embedding exception | ||||
|     (license license:gpl2))) | ||||
| 
 | ||||
|  | @ -585,12 +568,10 @@ Heros, Pagella, Schola, Termes.") | |||
|            (mkdir-p doc-dir) | ||||
|            (chdir (string-append "AnonymousPro-" ,version ".001")) | ||||
|            (for-each (lambda (ttf) | ||||
|                        (copy-file ttf | ||||
|                                   (string-append font-dir "/" ttf))) | ||||
|                        (install-file ttf font-dir)) | ||||
|                      (find-files "." "\\.ttf$")) | ||||
|            (for-each (lambda (doc) | ||||
|                        (copy-file doc | ||||
|                                   (string-append doc-dir "/" doc))) | ||||
|                        (install-file doc doc-dir)) | ||||
|                      (find-files "." "\\.txt$")))))) | ||||
|     (native-inputs | ||||
|      `(("unzip" ,unzip))) | ||||
|  | @ -605,7 +586,7 @@ languages, plus Greek and Cyrillic.") | |||
| (define-public font-gnu-unifont | ||||
|   (package | ||||
|     (name "font-gnu-unifont") | ||||
|     (version "9.0.02") | ||||
|     (version "9.0.06") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -613,7 +594,7 @@ languages, plus Greek and Cyrillic.") | |||
|                     version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1ss6cp2bs8mzz3jqjbmmi877jfdb1jjcd29dvyk3i8qy7r0d44qm")))) | ||||
|                 "0ybyraxi8pngibazfq4zlsqmg8kn5xlhvaiwnxb11znhfi61vi87")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (outputs '("out" ; TrueType version | ||||
|                "pcf" ; PCF (bitmap) version | ||||
|  | @ -625,9 +606,9 @@ languages, plus Greek and Cyrillic.") | |||
|        #:tests? #f          ; no check target | ||||
|        #:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (replace 'configure | ||||
|                   (lambda _ | ||||
|                     (setenv "CC" "gcc"))) | ||||
|          (replace | ||||
|           'configure | ||||
|           (lambda _ (setenv "CC" "gcc") #t)) | ||||
|          (replace | ||||
|           'install | ||||
|           (lambda* (#:key outputs #:allow-other-keys) | ||||
|  | @ -688,21 +669,62 @@ utilities to ease adding new glyphs to the font.") | |||
| 
 | ||||
|                      (mkdir-p font-dir) | ||||
|                      (for-each (lambda (ttf) | ||||
|                                  (copy-file ttf | ||||
|                                             (string-append font-dir "/" ttf))) | ||||
|                                  (install-file ttf font-dir)) | ||||
|                                (find-files "." "\\.ttf$")) | ||||
|                      (for-each (lambda (otf) | ||||
|                                  (copy-file otf | ||||
|                                             (string-append font-dir "/" otf))) | ||||
|                                  (install-file otf font-dir)) | ||||
|                                (find-files "." "\\.otf$")))))) | ||||
|     (native-inputs `(("unzip" ,unzip))) | ||||
|     (home-page "https://www.google.com/get/noto/") | ||||
|     (synopsis "Fonts aimed to cover all languages") | ||||
|     (description "Googe Noto Fonts is a family of fonts aimed to support all | ||||
| languages with a consistent look and aesthetic.  It's goal is to have no Unicode | ||||
| symbols unable to be displayed properly.") | ||||
|     (synopsis "Fonts to cover all languages") | ||||
|     (description "Google Noto Fonts is a family of fonts designed to support | ||||
| all languages with a consistent look and aesthetic.  Its goal is to properly | ||||
| display all Unicode symbols.") | ||||
|     (license license:silofl1.1))) | ||||
| 
 | ||||
| (define-public font-google-roboto | ||||
|   (package | ||||
|     (name "font-google-roboto") | ||||
|     (version "2.136") | ||||
|     (source | ||||
|      (origin | ||||
|        (method url-fetch) | ||||
|        (uri (string-append "https://github.com/google/roboto/releases/download/" | ||||
|                            "v" version "/roboto-hinted.zip")) | ||||
|        (file-name (string-append name "-" version ".zip")) | ||||
|        (sha256 | ||||
|         (base32 | ||||
|          "0spscx08fad7i8qs7icns96iwcapniq8lwwqqvbf7bamvs8qfln4")))) | ||||
|     (native-inputs `(("unzip" ,unzip))) | ||||
|     (build-system trivial-build-system) | ||||
|     (arguments | ||||
|      `(#:modules ((guix build utils)) | ||||
|        #:builder (begin | ||||
|                    (use-modules (guix build utils) | ||||
|                                 (srfi srfi-26)) | ||||
| 
 | ||||
|                    (let ((PATH (string-append (assoc-ref %build-inputs | ||||
|                                                          "unzip") | ||||
|                                               "/bin")) | ||||
|                          (font-dir (string-append %output | ||||
|                                                   "/share/fonts/truetype"))) | ||||
|                      (setenv "PATH" PATH) | ||||
|                      (system* "unzip" (assoc-ref %build-inputs "source")) | ||||
| 
 | ||||
|                      (mkdir-p font-dir) | ||||
|                      (chdir "roboto-hinted") | ||||
|                      (for-each (lambda (ttf) | ||||
|                                  (copy-file ttf | ||||
|                                             (string-append font-dir "/" ttf))) | ||||
|                                (find-files "." "\\.ttf$")))))) | ||||
|     (home-page "https://github.com/google/roboto") | ||||
|     (synopsis "The Roboto family of fonts") | ||||
|     (description | ||||
|      "Roboto is Google’s signature family of fonts, the default font on Android | ||||
| and Chrome OS, and the recommended font for the | ||||
| visual language \"Material Design\".") | ||||
|     (license license:asl2.0))) | ||||
| 
 | ||||
| (define-public font-un | ||||
|   (package | ||||
|     (name "font-un") | ||||
|  | @ -735,14 +757,10 @@ symbols unable to be displayed properly.") | |||
|            (mkdir-p doc-dir) | ||||
|            (chdir (string-append "un-fonts")) | ||||
|            (for-each (lambda (ttf) | ||||
|                        (copy-file ttf | ||||
|                                   (string-append font-dir "/" | ||||
|                                                  (basename ttf)))) | ||||
|                        (install-file ttf font-dir)) | ||||
|                      (find-files "." "\\.ttf$")) | ||||
|            (for-each (lambda (doc) | ||||
|                        (copy-file doc | ||||
|                                   (string-append doc-dir "/" | ||||
|                                                  (basename doc)))) | ||||
|                        (install-file doc doc-dir)) | ||||
|                      '("COPYING" "README")))))) | ||||
|     (native-inputs | ||||
|      `(("tar" ,tar) | ||||
|  | @ -840,18 +858,17 @@ glyph designs, not just an added slant.") | |||
| 
 | ||||
|                      (mkdir-p font-dir) | ||||
|                      (for-each (lambda (ttf) | ||||
|                                  (copy-file ttf | ||||
|                                             (string-append font-dir "/" ttf))) | ||||
|                                  (install-file ttf font-dir)) | ||||
|                                (find-files "." "\\.ttf$")))))) | ||||
|     (native-inputs | ||||
|      `(("source" ,source) | ||||
|        ("unzip" ,unzip))) | ||||
|     (home-page "https://sourcefoundry.org/hack/") | ||||
|     (synopsis "Typeface designed for sourcecode") | ||||
|     (synopsis "Typeface designed for source code") | ||||
|     (description | ||||
|      "Hack is designed to be a workhorse typeface for code, it expands upon | ||||
| the Bitstream Vera & DejaVu projects, provides 1561 glyphs including | ||||
| powerline support.") | ||||
|      "Hack is designed to be a workhorse typeface for code.  It expands upon | ||||
| the Bitstream Vera & DejaVu projects, provides 1561 glyphs, and includes | ||||
| Powerline support.") | ||||
|     (license (license:x11-style | ||||
|               "https://github.com/chrissimpkins/Hack/blob/master/LICENSE.md" | ||||
|               "Hack Open Font License v2.0")))) | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| ;;; GNU Guix --- Functional package management for GNU | ||||
| ;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org> | ||||
| ;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -31,7 +32,9 @@ | |||
|   #:use-module (gnu packages bison) | ||||
|   #:use-module (gnu packages flex) | ||||
|   #:use-module (gnu packages gtk) | ||||
|   #:use-module (gnu packages graphviz) | ||||
|   #:use-module (gnu packages libffi) | ||||
|   #:use-module (gnu packages linux) | ||||
|   #:use-module (gnu packages zip) | ||||
|   #:use-module (gnu packages perl) | ||||
|   #:use-module (gnu packages ghostscript) | ||||
|  | @ -114,7 +117,7 @@ For synthesis, the compiler generates netlists in the desired format.") | |||
| (define-public yosys | ||||
|   (package | ||||
|     (name "yosys") | ||||
|     (version "0.6") | ||||
|     (version "0.7") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri | ||||
|  | @ -122,7 +125,7 @@ For synthesis, the compiler generates netlists in the desired format.") | |||
|                               name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                 (base32 | ||||
|                    "02j0c0m9dfyjccynalf0aggj6gy20k7iphpkg5cn6sdirlkv8gmx")) | ||||
|                    "0vkfdn4phvkjqlnpqlr6q5f97bgjc3312vj5jf0vf85zqv88dy9x")) | ||||
|               (file-name (string-append name "-" version "-checkout.tar.gz")) | ||||
|               (modules '((guix build utils))) | ||||
|               (snippet | ||||
|  | @ -136,6 +139,13 @@ For synthesis, the compiler generates netlists in the desired format.") | |||
|                           (string-append "PREFIX=" %output)) | ||||
|        #:phases | ||||
|        (modify-phases %standard-phases | ||||
|          (add-before 'configure 'fix-paths | ||||
|            (lambda _ | ||||
|              (substitute* "./passes/cmds/show.cc" | ||||
|                (("exec xdot") (string-append "exec " (which "xdot"))) | ||||
|                (("dot -") (string-append (which "dot") " -")) | ||||
|                (("fuser") (which "fuser"))) | ||||
|              #t)) | ||||
|          (replace 'configure | ||||
|            (lambda* (#:key inputs (make-flags '()) #:allow-other-keys) | ||||
|              (zero? (apply system* "make" "config-gcc" make-flags)))) | ||||
|  | @ -172,7 +182,6 @@ For synthesis, the compiler generates netlists in the desired format.") | |||
|                         (("iverilog_bin=\".*\"") (string-append "iverilog_bin=\"" | ||||
|                                                                 iverilog "\""))) | ||||
|                      #t)))))) | ||||
|     ;; TODO add xdot [patch the path to it here] as soon as I find out where it is. | ||||
|     (native-inputs | ||||
|      `(("pkg-config" ,pkg-config) | ||||
|        ("python" ,python) | ||||
|  | @ -185,6 +194,9 @@ For synthesis, the compiler generates netlists in the desired format.") | |||
|      `(("tcl" ,tcl) | ||||
|        ("readline" ,readline) | ||||
|        ("libffi" ,libffi) | ||||
|        ("graphviz" ,graphviz) | ||||
|        ("psmisc" ,psmisc) | ||||
|        ("xdot" ,xdot) | ||||
|        ("abc" ,abc))) | ||||
|     (home-page "http://www.clifford.at/yosys/") | ||||
|     (synopsis "FPGA Verilog RTL synthesizer") | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr> | ||||
| ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com> | ||||
| ;;; Copyright © 2015 Andy Wingo <wingo@pobox.com> | ||||
| ;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> | ||||
| ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net> | ||||
| ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com> | ||||
| ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> | ||||
|  | @ -42,11 +42,13 @@ | |||
|   #:use-module (gnu packages gl) | ||||
|   #:use-module (gnu packages glib)                ;intltool | ||||
|   #:use-module (gnu packages gnome) | ||||
|   #:use-module (gnu packages gnuzilla) | ||||
|   #:use-module (gnu packages gperf) | ||||
|   #:use-module (gnu packages graphviz) | ||||
|   #:use-module (gnu packages gtk) | ||||
|   #:use-module (gnu packages libffi) | ||||
|   #:use-module (gnu packages libunwind) | ||||
|   #:use-module (gnu packages libusb) | ||||
|   #:use-module (gnu packages linux) | ||||
|   #:use-module (gnu packages m4) | ||||
|   #:use-module (gnu packages polkit) | ||||
|  | @ -85,14 +87,14 @@ freedesktop.org project.") | |||
| (define-public libinput | ||||
|   (package | ||||
|     (name "libinput") | ||||
|     (version "1.5.1") | ||||
|     (version "1.5.3") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://freedesktop.org/software/libinput/" | ||||
|                                   name "-" version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1n1dispg63z1qiy8c1af3l9c4a9dks8y7xasff8xcywnn0rkkxnl")))) | ||||
|                 "1qx623nyr49sxv49ilb0j85skgk1dhkr82vd577ywyjf7d96q84i")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (native-inputs | ||||
|      `(("cairo" ,cairo) | ||||
|  | @ -211,7 +213,8 @@ the freedesktop.org XDG Base Directory specification.") | |||
|        ("shepherd" ,shepherd)                ;for 'halt' and 'reboot', invoked | ||||
|                                              ;when pressing the power button | ||||
|        ("dbus" ,dbus) | ||||
|        ("eudev" ,eudev))) | ||||
|        ("eudev" ,eudev) | ||||
|        ("acl" ,acl)))           ;to add individual users to ACLs on /dev nodes | ||||
|     (home-page "https://github.com/wingo/elogind") | ||||
|     (synopsis "User, seat, and session management service") | ||||
|     (description "Elogind is the systemd project's \"logind\" service, | ||||
|  | @ -804,3 +807,77 @@ share connections to real-time communication services without conflicting.") | |||
| useful for both applications which need colour management and applications that | ||||
| wish to perform colour calibration.") | ||||
|     (license license:lgpl2.1+))) | ||||
| 
 | ||||
| (define-public libfprint | ||||
|   (package | ||||
|     (name "libfprint") | ||||
|     (version "0.6.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://people.freedesktop.org/~hadess/" | ||||
|                                   name "-" version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1giwh2z63mn45galsjb59rhyrvgwcy01hvvp4g01iaa2snvzr0r5")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      '(#:configure-flags (list (string-append "--with-udev-rules-dir=" | ||||
|                                               (assoc-ref %outputs "out") | ||||
|                                               "/lib/udev/rules.d")))) | ||||
|     (native-inputs | ||||
|      `(("pkg-config" ,pkg-config))) | ||||
|     (inputs | ||||
|      `(("libusb" ,libusb) | ||||
|        ("nss" ,nss) | ||||
|        ("glib" ,glib) | ||||
|        ("eudev" ,eudev) | ||||
|        ("pixman" ,pixman))) | ||||
|     (home-page "https://www.freedesktop.org/wiki/Software/fprint/libfprint/") | ||||
|     (synopsis "Library to access fingerprint readers") | ||||
|     (description | ||||
|      "libfprint is a library designed to make it easy for application | ||||
| developers to add support for consumer fingerprint readers to their | ||||
| software.") | ||||
|     (license license:lgpl2.1+))) | ||||
| 
 | ||||
| (define-public fprintd | ||||
|   (package | ||||
|     (name "fprintd") | ||||
|     (version "0.7.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|                     "https://people.freedesktop.org/~hadess/fprintd-" | ||||
|                     version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "05915i0bv7q62fqrs5diqwr8dz3pwqa1c1ivcgggkjyw0xk4ldp5")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      '(#:phases (modify-phases %standard-phases | ||||
|                   (add-before 'build 'set-sysconfdir | ||||
|                     (lambda* (#:key outputs #:allow-other-keys) | ||||
|                       ;; Work around a bug whereby the 'SYSCONFDIR' macro | ||||
|                       ;; expands literally to '${prefix}/etc'. | ||||
|                       (let ((out (assoc-ref outputs "out"))) | ||||
|                         (substitute* "src/main.c" | ||||
|                           (("SYSCONFDIR, \"fprintd.conf\"") | ||||
|                            (string-append "\"" out "/etc\", " | ||||
|                                           "\"fprintd.conf\""))) | ||||
|                         #t)))))) | ||||
|     (native-inputs | ||||
|      `(("pkg-config" ,pkg-config) | ||||
|        ("intltool" ,intltool))) | ||||
|     (inputs | ||||
|      `(("libfprint" ,libfprint) | ||||
|        ("dbus-glib" ,dbus-glib) | ||||
|        ("polkit" ,polkit) | ||||
|        ("linux-pam" ,linux-pam)))                 ;for pam_fprintd | ||||
|     (home-page "https://www.freedesktop.org/wiki/Software/fprint/fprintd/") | ||||
|     (synopsis "D-Bus daemon that exposes fingerprint reader functionality") | ||||
|     (description | ||||
|      "fprintd is a D-Bus daemon that offers functionality of libfprint, a | ||||
| library to access fingerprint readers, over the D-Bus interprocess | ||||
| communication bus.  This daemon layer above libfprint solves problems related | ||||
| to applications simultaneously competing for fingerprint readers.") | ||||
|     (license license:gpl2+))) | ||||
|  |  | |||
|  | @ -140,7 +140,7 @@ provide connectivity for client applications written in any language.") | |||
| (define-public tiled | ||||
|   (package | ||||
|     (name "tiled") | ||||
|     (version "0.17.0") | ||||
|     (version "0.18.0") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append "https://github.com/bjorn/tiled/archive/v" | ||||
|  | @ -148,7 +148,7 @@ provide connectivity for client applications written in any language.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0c9gykxmq0sk0yyfdq81g9psd922scqzn5asskjydj84d80f5z7p")))) | ||||
|                 "0csrwf7k3fxv6bv580w6wxjk1q2j9mj9k0xba3nb1ms6jiz1bvzk")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (inputs `(("qt" ,qt) | ||||
|               ("zlib" ,zlib))) | ||||
|  |  | |||
|  | @ -649,7 +649,7 @@ match, cannon keep, and grave-itation pit.") | |||
| (define minetest-data | ||||
|   (package | ||||
|     (name "minetest-data") | ||||
|     (version "0.4.14") | ||||
|     (version "0.4.15") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -658,7 +658,7 @@ match, cannon keep, and grave-itation pit.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "11fzdh4icx2yvjfz1skdql0d0wxpzdr006k993v33x72s0q2ig7f")))) | ||||
|                 "12kxklcd1b5n0f369zf3xxhvkrizxj4d9xv0dh8crfqiymaym0zm")))) | ||||
|     (build-system trivial-build-system) | ||||
|     (native-inputs | ||||
|      `(("source" ,source) | ||||
|  | @ -690,7 +690,7 @@ match, cannon keep, and grave-itation pit.") | |||
| (define-public minetest | ||||
|   (package | ||||
|     (name "minetest") | ||||
|     (version "0.4.14") | ||||
|     (version "0.4.15") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -699,7 +699,7 @@ match, cannon keep, and grave-itation pit.") | |||
|               (file-name (string-append name "-" version ".tar.gz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "0m3hhk5icx4y4gd970z7ya2013fq4vvqbjljmck62ik03baf8g90")))) | ||||
|                 "1ag3jcj7kpq3ph12zirk1c0mj9i0g50wmw932f8gi11liq8yd12n")))) | ||||
|     (build-system cmake-build-system) | ||||
|     (arguments | ||||
|      '(#:configure-flags | ||||
|  | @ -968,7 +968,7 @@ Collect herrings and other goodies while sliding down the hill, but avoid fish | |||
| bones. | ||||
| 
 | ||||
| This game is based on the GPL version of the famous game TuxRacer.") | ||||
|     (home-page "http://sourceforge.net/projects/extremetuxracer/") | ||||
|     (home-page "https://sourceforge.net/projects/extremetuxracer/") | ||||
|     (license license:gpl2+))) | ||||
| 
 | ||||
| (define-public supertuxkart | ||||
|  | @ -1254,7 +1254,7 @@ is programmed in Haskell.") | |||
| (define-public manaplus | ||||
|   (package | ||||
|     (name "manaplus") | ||||
|     (version "1.6.8.14") | ||||
|     (version "1.6.12.24") | ||||
|     (source (origin | ||||
|               (method url-fetch) | ||||
|               (uri (string-append | ||||
|  | @ -1262,7 +1262,7 @@ is programmed in Haskell.") | |||
|                     version "/manaplus-" version ".tar.xz")) | ||||
|               (sha256 | ||||
|                (base32 | ||||
|                 "1mah4w6ng0j76cjzbw8y9m2ds5f1w5ka9b1k3gzgvxh4yaphqnff")))) | ||||
|                 "1g64pid26vcv1ay002bzz6ymabwrmy3wmklywpcgpvrhynm6f2cq")))) | ||||
|     (build-system gnu-build-system) | ||||
|     (arguments | ||||
|      '(#:configure-flags | ||||
|  | @ -2753,7 +2753,7 @@ with the \"Stamp\" tool within Tux Paint.") | |||
| (define-public supertux | ||||
|   (package | ||||
|    (name "supertux") | ||||
|    (version "0.5.0") | ||||
|    (version "0.5.1") | ||||
|    (source (origin | ||||
|             (method url-fetch) | ||||
|             (uri (string-append "https://github.com/SuperTux/supertux/" | ||||
|  | @ -2761,7 +2761,7 @@ with the \"Stamp\" tool within Tux Paint.") | |||
|                                 version "-Source.tar.gz")) | ||||
|             (sha256 | ||||
|              (base32 | ||||
|               "0fx7c7m6mfanqy7kln7yf6abb5l3r68picf32js2yls11jj0vbng")))) | ||||
|               "1i8avad7w7ikj870z519j383ldy29r6f956bs38cbr8wk513pp69")))) | ||||
|    (arguments | ||||
|     '(#:tests? #f | ||||
|       #:configure-flags '("-DINSTALL_SUBDIR_BIN=bin" | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Reference in a new issue